SQLite format 3@ U U.||=Q+indexsqlite_autoindex_property_master_1property_master+%%tablegroup_mastergroup_masterCREATE TABLE `group_master` ( `group_id` INTEGER(10) NOT NULL, `group_name` VARCHAR(255) NOT NULL, `enabled` INTEGER(1) NOT NULL default '1', `dirty` INTEGER(1) NOT NULL default '0', `sequence_id` INTEGER(10) DEFAULT NULL, PRIMARY KEY (`group_id`) )7K%indexsqlite_autoindex_group_master_1group_master))otablecounter_mastercounter_masterCREATE TABLE `counter_master` ( `counter_id` INTEGER(10) NOT NULL, `group_id` INTEGER(10) NOT NULL, `sequence_id` DEFAULT(10) DEFAULT NULL, `counter_name` VARCHAR(255) NOT NULL, `enabled` INTEGER(1) NOT NULL DEFAULT '1', `unmerged` INTEGER(1) NOT NULL DEFAULT '0', `conflicted` INTEGER(1) NOT NULL DEFAULT '0', PRIMARY KEY (`group_id`,`counter_id`) );O)indexsqlite_autoindex_counter_master_1counter_m )6MjdX^AGR$*0|;vp!1 2)A .Accounts without passwordsH *An insecure database using 'test' in its name is detected!1 '+E #('root' user without password-I@'root' user can login remotely%9XNumber of 'root' users!1p(?Number of anonymous users!11 Q Users with wildcards in host value! 16 [MONyog able to access 'mysql' database?( ? 'Uptime since FLUSH STATUS. K #(Base time for Monitors/Advisors!1@F ? MNumber of anonymous users6621f0942c01178ded047a4b54f56c36!1O Q M Users with wildcards in host value0dbee8e72c3d2840d4f271efe38c9764! 1S [ MMONyog able to access 'mysql' database?e0670051f8fc95ec2ba6af7a1b45b551E  ? M 'Uptime since FLUSH STATUSc2f669756088d66d301ddb37a2c2e7e7K  K M #(Base time for Monitors/Advisorsbd77e7b7ee3e1356be035aaa7f993f6f!1@B  9 MXMONyog data updated onfcf493920b140987ac1d98b931efd161F  A MpMONyog data retained since39402f76682363a131aef6e36c9ca3b0!16  ! MStart timefa1d80c6b2d054910a2e49357a5d82cd7  # M Running for998133165d4e1328d363283cd8f2606e3   MVersion95fd5b33b4f5b73d20e4b2408734fdba5 ! MAvailable?76878dff7aaed4655d9fceba2af9d488 ??H5?:A I E M #('root' user without password33ad3d4ec8953b4b7cbd38fa4bb8f35dK I M@'root' user can login remotely9ef4d43120f25737b804281bd0df465dC 9 MXNumber of 'root' users51be6dff721ef0153091ba13d4b0b7af!1p` s MJ8Security Alterations Alert: user privileges granted4cbfcedc46c5b11bf3470ea42c76e815!1FPL K MBhLOAD DATA LOCAL option detected01e4fa7c3746813f24ca060014846d47!1>R W M:Insecure Password Generation detectede26f57963474a19fc3fa72c332db8d8bQ U M6Old Password Authentication detected0c88e691c2470960ce78b9b8973d367f!1 2G A M .Accounts without passwords484d26a84ac81df87a7ba2e4e565d80df  M *An insecure database using 'test' in its name is detected1952426185ba7a1ac117c3cd8e9d569a!1 '-E #('root' user without password  Te- DT@<_x<(gXNY' e MpNumber Of Users Having Global DROP Privilegea6c81c2edf652fc151ac87b5018c3031Y$ e M Number Of Users Having Global FILE Privilege1c5cd6998cd02ce132550024b80594dbY" g MNumber Of Users Having Global SUPER Privilege0b608b365e1b793a02424918861c3a8fA 5 MUSymlinks are enabled190e47a8989c0babd90838fc74609322!1R` s MN Security Alterations Alert: user privileges revoked19dddaab0d1aa9f9fb6cf018d8be9ccbY! e MYUsers can view all databases on MySQL serverf920d1a80fbf48f06c796ab31ea85ff4 gNumber Of Users Ha\# k MNumber Of Users Having Global PROCESS Privilege2237a98f1a454d7b31d06b3054ca0cc4=epNumber Of Users Having Global DROP Privilege^& o MNumber Of Users Having Global SHUT_DOWN Privilege56c95c9208c2e50a532ac2dea8ba513bZ% g MNumber Of Users Having Global GRANT Privilege17b9423c00cb1eb451127b9c35c3c1d1 TyI,\TN< O MPercentage of refused connectionsba2ab56507b6ebb2012c83b2fea174c54;  MRefusedc565b141e6fe3725fa17d8dc4aaa10c279 ! MSuccessfulb911280f4df2cae7e981cd2a89e4d61f48  MAttemptse1edddb907ecb36a8bd3149012b4ce62@3 3 MXNo. of slow queriesb3d69163a020c97210c92e5fc1a5284e@1 3 MSlow log - Enabled?3d0c6b207d4b1bbef6e9a0f5e8490841C6 9 M 'General log - Enabled?f4294c216614a3e57116fed2427dc5f2O@= 3 MpTerminated abruptly9b1eb85ef985fd6984db5065badb81d1!:1 4!SuccessfulAttempts!71 * '9 'General log - Enabled?!51 #( IK4 I M@Log queries not using indexes?feafdf6356c64721ebefed0d76c0cb79b2 w MpMin. execution time for a query to be considered slow7cdab346d8e81bc435a954c8272b2cde!01 'GH%^e'NG O M  Percentage of max allowed reached3c92441bf9c35752268cb607a0e87c03RF W MpHighest no. of concurrent connections736f3d61bf87d5aab03ae44ef081f63f!E1FD ? MCurrently running threadsd70d1c521937ae689f149b4e230e32dd=C - M Connection usage2d052de6d755590ff160da7a4db42228=B - MOpen connectionsa94fa30d625c25d43151c081a3c45f247A # MMax allowed1239aa459be536cddc77c332d911e3b2F@ ? M #(Bytes sent to all clients427290f9aa37d4cea84d00c9f8336998L? K M@Bytes received from all clients06cd43825252b40f428d314eab0c4077!>1X c8@HPX`hpx (08 @HPX`hpx/& (0h8@HPX`px  j i h[ZWV ' &           !"#$%&'() * + ,-./01234 5 6 789:;<=>? @ABCDEF GH I J KLMNOPQRS T U V W XY ]1:BJRZbjrz #,5>GPY(bjrz (1:CLU^gpy   $[\]^_`ab c d U e f g h i j k l m n o p q r s t u v % \ ] k | } ~ w x y z { | } ~         l       h*Q a#o!*h<[ - MAllocated memorya1aec2a8318bc11f842c31f17bd4f442?1 \#Free MemoryUZ ] M:Delay updating indexes for MyISAM tables0fdb9164754c2bd7dc649b65f4687da1!Y16LX K M 2Cache writes (Disk:Total) ratio4c80658a458b1e2881b8f74d2b8908efCW 9 M .Blocks written to diska599d89ce1d3d890300f46b163e9ea2dJV G M *Total blocks written to cache25e8b715a38339544104fb3b48ce9093!U1 'FP ? MPercentage of used blocksbe455c875e9e8466f9b7fd1784369d758O # MUsed blocks3a4e4ce3c083f8390f3e9fc7a119f860:N ' M No. of blocksb3059f5a9beac342ef59d2c39302d1e67M ! MBlock size79bc2e234eb6aa112ab4356231316773 6Yu26g&}Ef = M Latest detected deadlockd1d06b4d7c0ffc368dccc1ade7f594edBk 7 M Size of each log filebe7eec742c75007241c5d65b6a61ad47@j 3 M Number of log filesd338eb58adf8a3686ffee73aa7da19e0!i1 ?h 1 M Log waits required8b82913c0f1d122f885a03889175f5b3;g + M Log buffer sizec82c9d4b769053775867201fb760c854Be 9 M New deadlock detected?2ddfd560ca06d3947cd34f857375bac7Hd C M 'No. of waits for free pagesc0054719486ef3ab48e701d5eb16bd72Ac 5 M #(Additional pool sizeeb6b9df2658ba3cc170d88201c1cb9dd!b1@Fa ? MXCache write wait requiredfa78f8c23a217e2c33544aa68514dc05<` + MpCache hit ratiof22b9df488816bb67f3b259fefd569959_ % MCache misses0b7d594d13c4378e9841783e4839656bH^ C MBlocks requested from cache27f34049c51de6b1a6851d6947b94f78!]1 8\ # MFree Memorydc2fc4d864a9dd2ac94436993481934a ff+H efJ I MPercentage of full table scans46dac4253b47df6cb0166c1b091000cf!1< + MBhCache hit ratio8fadc180038ec29fbef266e9bdf7da79L K MRPruned as percentage of inserts1001473218d0f7fcee1119df1c2bb339F ? MN Queries pruned from cachee128554fc7df69d6b87e3af53ae7a310!1J87 ! M>Cache hits15bc4de4222f7694ca0ba0ba759de0729 % M:Cache missesed6fc73cc32c10781d582b75826405df? 1 M6Queries not cached9f85e19fbc0bb74a5cfe9ed70c90bc1a= - M 2Queries in cachee14f29b91964440f80e25a5ea524a4a1!1 .: ' M *Fragmentationa13380c8e66eaf09635de1b3cdee9c578 # M 'Free blocks1b156e40c13691f20473b2bcd75c55a89 % M #(Total blocks65210d5eb6081d424282e24927e049a97 ! M@Block size2e78bfc674e7d1855c6cd3a902330b1a! 1X :W3?4q:rrrA& 5 M4)  MEnabled?4a2f7a65868815e880ca82e08eed51d5=( - MDisk:total ratio5789ad376632a7c1587f3106a674d03c<' + MCreated on diskcfef842fc56a9845f9a78ded46686142A& 5 M Total tables createda8def8805f51425249de19470166e891K% I MMaximum size of a memory table04f48ca5fbecebe4f580c4877dc6f9e0M$ O MMaximum size allowed (per client)b15c0246670f6a8e7ef95d8f69569d50j#  M #(Joins that reevaluate index selection for each row in a join774dc1c438fead730f1a4f8c8dd50da1f"  M@Joins requiring full scan of second and subsequent tablesa69b12ab79c0abdba7692fc9ff4b9177!!1Xd { MpBuffer for joins requiring full table scan (per client)3a14135b6dfe2976a546f85d0a0649ae!1N O MSELECTs requiring full table scan0358ae482ac32aacc5aaf26ce00993dbU ] M Buffer for full table scans (per client)ae47674817f7363a097e9e2e5f7dbe7d QBKT]fox#,5>GPYbkt} (1:CLU^gpy90' ? ( ) m           a!n"o#p$q     *+XY d -Q cI-d44  MUPDATEsb2dd27a19bda56377be4a93cf08d68a21XP/ S MXSynchronized to disk at each write?73aefe557c75ca2458e6227ba2a41dc1c. y MpPercentage of transactions that went in temporary file1da229d32b14f3e85967b0867a255e18Z- g MTransactions that got saved in temporary filee48f4f06784aacf8bd49e3f76cf398adI, E MTransactions that used cache27da4db9878c584a1a30d168c2b1aca9B+ 7 M Binary log cache size057fdc827a5d5e7997f7d2d9e245331d5*  MLimited?973ee7c7f9f626ade1c01c46df0579c6@  MEnabled?4b7c9!71X45  MDELETEsab2d882a1606465d03e62023f9bb0826 -knJZPky882>I >I / M .Last error number3fb4a7bea406ae88b5>D / MXSlave SQL runningc6e516cc4e4082e1abdf25ff48114d51!+Slave I/O state!71X=@ - M Slave read only?3cf635ea2d964b13e4c2b554420de3a6!?1:> ) MSlave running?6b2a3af3980eb64305578fd509ce7e54R= W M 2Max Prepared statements configurationfc18e72d07cd9ef85a8c8a17b1e072e0V< _ M .Percentage of rows returned using indexesf938eee1a674388a6ab4dbc24aababda?; 1 M *Avg rows per query32f7cef8a6ee06a300cad9a802934409!:1 'L9 K M #(Total rows returned via indexes403479cd2d03abceafc2fe749320e423@8 3 M@Total rows returned2ad40e0062b8c2d173d1ac8ce6ddb793 ,v G#,?Ve _ M #(Buffer for in-memory sorting (per client)d251491e981b40bbc3521b2082413f42dj { M6For reading rows in sorted order after a sort operation2d35eba51153ae1ea64ebd6ccea7a1bfPi S M 2For fast rebuilds of MyISAM indexesadacdc5db380293658541da87508eebbnh  M .Temporary files created because of insufficient sort_buffer_sizec538dde7919eae1d3c87d4807f2be64e6g  M *Sort scane5fe4a7e6297a515c532b51dd46456727f ! M 'Sort range0f88fdb9d91e0158d428cd80296d90ef!d1@ac u MXData being flushed to disk after each SQL statement?af47c8ea153685129bb216ce02087056_b q MpMultiple threads used when repairing MyISAM tables22a9adc94898e419ceec545a6bf43d30fa  MPortability issues because identifiers are case sensitive7884ecb8238aba9e158547369ee2450aB` 7 MTransaction Isolationd581a2cf5fc04c3176824cb020e0cf73B_ 7 M INSERT DELAYED errorse6bece1258216abedb233c594db404d1 *|AH*$je8r # M@Show Fields56aded9af67ec99e32037ee43173b59fHz C M>Number of functions created71ee22d7766ce9c50057206566c15adb!y1:Hx C M6Number of databases dropped40499b7dc7cbdf4a27ee3e93019f8f59Hw C M 2Number of databases createdfc2ecbfda14fdd0d267cd5f08f7dea55Kv I M .Number of database alterations34dc9232e1c2b5a5e92173da1d321a27!u1 *Et = M 'Object changes detected?5a6f911ee1fb91c059144157be05a47b!s1 #(?q 1 MXShow Create Tablesc5e0061d208ce359a37174511fbae7408p # MpLock Tables69b4fb347f904c3df38c6b1c19f25878>o / MClose Prepare SQL67420175e011846d070064409c02b7a18n # MDealloc SQL2d3537ab38e4ceb1ffc2c47c35c82a728m # M Prepare SQLa6352ded058d0f60018e6af11d3bb6b17l ! MChange DBs22eda9b739f14309da67332526932658Gk C MTotal no. of Admin Commandsde2b89b440b4aec87f9d51cf73a69b21 ffy lyAvailableb?function() { if(MONyog.MySQL.Custom.Available == 1) return "Yes"; return "No"; }+SIs MONyog able to connect to MySQL?`;function() { if(this.Value == "No") return "Critical"; else return "None"; } YessaIf MONyog is not able to connect to MySQL, it simply means that connection is not possible for one of the following (or similar) reasons:

* There is no MySQL server running at the specified host.

* Connection to the MySQL server is not allowed using TCP-IP. Check the 'skip-networking' setting in the MySQL configuration file (my.ini on Windows, my.cnf on Unix/Linux). It shall be commented out like '#skip-networking'. If it is not commented out, then do it and restart the MySQL server for the change to take effect. MONyog needs to connect using TCP-IP.

* MySQL username/password is incorrect.Version MM&7!=function() { if(typeof(MONyog.MySQL.GlobalVariables.version) == "undefined") return "(n/a)" return MONyog.MySQL.GlobalVariables.version; }# CThe version of MySQL Server Uptime) Mfunction() { if(typeof(MONyog.MySQL.GlobalVariables.version) == "undefined") return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalStatus.Uptime); }= wMySQL server has been running for this amount of timet cfunction x() { if(MONyog.MySQL.Custom.Available == 1) { var starttime = new Date(MONyog.MySQL.Custom.ServerStartTime * 1000); return starttime.toDateString()+ " " + starttime.toLocaleTimeString(); } return "(n/a)"; }-WThe start date and time of the serverFfunction x() { var firstcapturetime = new Date(MONyog.MySQL.Custom.FirstCaptureTime * 1000); return firstcapturetime.toDateString() + " " + firstcapturetime.toLocaleTimeString(); } ``fU?yMONyog data before this time is not available.
The reasons may be

1. It has been purged. You can configure purge settings by editing the server registration details

2. MONyog started collecting data from this time.
Note: Custom SQL Objects are not considered with this Advisor.A}function x() { var lastcapturetime = new Date(MONyog.MySQL.Custom.LastCaptureTime * 1000); return lastcapturetime.toDateString()+ " " + lastcapturetime.toLocaleTimeString(); }+SWhen MONyog collected the last datajO function x() { var basetimeformatted; var basetime = MONyog.MySQL.Custom.Basetime; if(basetime > 0) { basetimeformatted = new Date(MONyog.MySQL.Custom.Basetime * 1000); return basetimeformatted.toDateString()+ " " + basetimeformatted.toLocaleTimeString(); } else { return "(not configured)"; } } T2_function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Accounts_with_broad_host_specifier; }*QAccounts_with_broad_host_specifierTo identify security vulnerabilities, MONyog needs to read and analyze the mysql system database. Make sure that the MySQL user registered with MONyog has permissions to read the mysql system database.

The MySQL user registered with MONyog should have one of the following privileges:
1)SUPER global privilege
2)SELECT access to mysql system database
oYfunction() { if(this.Value == "No") return "Critical"; else return "None"; }9oIs MONyog able to read the mysql database? ]]+?yEach MySQL account is identified by both a user name and a hostname, which are found in the User and Host columns of the user table. The User value is the name that a client must supply when connecting to the server. The Host value indicates the host or hosts from which the user is allowed to connect. If this is a literal hostname, the account is limited to connections only from that host. If the hostname is a pattern such as %.abc.com or % that contains the % wildcard character, the user can connect from any host in the abc.com domain or from any host at all.  function() { if(this.Value != "None" && this.Value != "(n/a)") return "Critical"; else return "None"; }( KFor maximum security, literal Host values are best. Avoid using % as much as possible. Accounts that have literal Host values are much more secure than Host values! !=Anonymous_accounts_count containing wildcards. Wildcards give attackers the opportunity to connect from a broader range of machines. For example, if an account has User and Host values of root and %, it means that you can connect as root from anywhere if you know the password. An attacker must guess the password, but may attempt to do so by connecting from any host. However, if the host name is a literal (localhost), the attacker can attempt to connect as the root user only after first gaining access to that host (localhost).

Find existing accounts that contain the '%' wildcard character anywhere in the Host column of the user table, use the following query: SELECT * FROM user WHERE Host LIKE "%\%%"; If you discover a Host value that is overly broad (for example, very few accounts really require a value of % in the Host column), change it with UPDATE to something more restrictive.

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to change the Host values for a particular user. TD#function() { var obj=MONyog.UserObject('Host_Hitting_The_Server_The_Most_by_Tablescans'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL object for this monitor is not enabled.
Click here to enable it.
'; } if (!obj || !MONyog.MySQL.Custom.Available) J#Anonymous MySQL Users allow clients to connect to the server without specifying a user name. Under Windows, the default accounts may even have full access to any database managed by the server.)"Mfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Anonymous_accounts_count; } S$'Cfunction() { if(MONyog.MySQL.Security.Is_mysql$function() { if(this.Value != "(n/a)" && this.Value > 0) return "Critical"; else return "None"; }*%OTo remove anonymous accounts, connect to the server as the MySQL root user to access the mysql database, then issue the following statements: DELETE FROM user WHERE User=""; FLUSH PRIVILEGES; The DELETE statement removes accounts that have an empty value in the User column of the user table that lists MySQL accounts, and FLUSH PRIVILEGES tells the server to reload the grant tables so the changes take effect. You may also want to check the other grant tables in the mysql database for rows that have empty User values. Those rows can be removed, too.

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to delete Anonymous users O*Rename the root MySQL user to something obscure. Treat it like a password! Execute the following SQL: UPDATE user SET user = "obscure_name" WHERE user = "root"; FLUSH PRIVILEGES;

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to change the name of the root user.$+EIs_root_remote_login_enabled)function() { if(this.Value != "(n/a)" && this.Value > 0) return "Critical"; else return "None"; }v(gThe default MySQL installation includes a root User with super(full) privileges that is used to administer the MySQL server. The name root is created by default and is very well known. The literal value root does not have any significance in the MySQL privilege system. Hence there is no requirement to continue with the user name root. 0(0u-eThe root User can log in remotely. It means that you can connect as root from remote hosts if you know the password. An attacker must guess the password, but may attempt to do so by connecting from remote hosts. However, if remote access is disallowed, the attacker can attempt to connect as the root user only after first gaining access to localhost.

The default MySQL installation includes a root account with super (full) privileges that is used to administer the MySQL server. The name root is created by default and is very well known. The literal value root does not have any significance in the MySQL privilege system. Hence there is no requirement to continue with the user name root.U,%function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; if(MONyog.MySQL.Security.Is_root_remote_login_enabled > 0) return "Yes"; return "No"; } qQ1 function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; if(MONyog.MySQL.Security.Is_root_without_password > 0) return "Yes"; return "No"; } 0= Is_root_without_passwordy/m
  1. Rename the root MySQL user to something obscure and disallow remove access (best for security).
  2. If you still want to keep the root user for some reason, make sure remote access is disallowed. Use the following SQL: DELETE FROM mysql.user WHERE user = "root" AND host NOT IN ('127.0.0.1','localhost',);FLUSH PRIVILEGES;

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to change the Host value of the root user.o.Yfunction() { if(this.Value == "Yes") return "Critical"; else return "None"; } GTo3Y function() { if(this.Value == "Yes") return "Critical"; else return "None"; } )2M The root account has a blank password. The default MySQL installation includes a root account with super(maximum) privileges that is used to administer the MySQL server. The name root is created by default and is very well known The literal value root does not have any significance in the MySQL privilege system. Hence there is no requirement to continue with the user name root. ,,"6? function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Is_test_db_exists; }5/ Is_test_db_exists4 
  1. Rename the root MySQL user to something obscure and disallow remove access(best for security).
  2. If you still want to keep the root account for some reason, make sure you provide a strong password for this account. Use the following SQL: UPDATE user SET password = PASSWORD("

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to change the password for the root User. 00E7 The default MySQL installation comes with a database named test that anyone can access. This database is intended only for tutorials, samples, testing, etc. Databases named "test" and also databases with names starting with - depending on platform - "test" or "test_" can be accessed by users that do not have explicit privileges granted to the database. You should avoid such database names on production servers.*;O function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Accounts_without_password; }!:? Accounts_without_passwordD9 Drop databases named "test" and also all databases with names starting with - depending on platform - "test" or "test_" and remove all associated privileges.o8Y function() { if(this.Value == "Yes") return "Critical"; else return "None"; } {r?'old_passwords^@7function () { if(typeof(MONyog.MySQL.GlobalVariables.old_passwords) == "undefined") return "(n/a)"; if(MONyog.MySQL.GlobalVariables.old_passwords == "ON") return "Yes"; return "No"; }#secure_authS>! MySQL Users that do not have passwords should either be removed or assigned passwords. Use the following SQL: UPDATE user SET Password=PASSWORD([strong_password]) WHERE User=[user_name] AND Host=[host_name];

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to set a strong password for that user =  function() { if(this.Value != "(n/a)" && this.Value != "None") return "Critical"; else return "None"; } < Accounts without passwords make your MySQL installation extremely prone to attacks. The attacker just needs to know the username! y^E7function () { if(typeof(MONyog.MySQL.GlobalVariables.old_passwords) == "undefined") return "(n/a)"; if(MONyog.MySQL.GlobalVariables.old_passwords == "ON") return "Yes"; return "No"; }D'old_passwords0C[You should disable authentication for accounts that have old password hashes. To disable, ensure that you have secure_auth=1 in my.cnf/my.ini and restart MySQL server.oBYfunction() { if(this.Value == "Yes") return "Critical"; else return "None"; }D#secure_auth[E1function () { if(typeof(MONyog.MySQL.GlobalVariables.secure_auth) == "undefined") return "(n/a)"; if(MONyog.MySQL.GlobalVariables.secure_auth == "OFF") return "Yes"; return "No"; } A1 ynJWfunction() { if(typeof(MONyog.MySQL.GlobalVariables.local_infile) != "undefined" && MONyog.MySQL.GlobalVariables.local_infile != -1) return MONyog.MySQL.GlobalVariables.local_infile; else return "(n/a)"; }I%local_infile'HIYou should disable generation of old password hashes. To disable, remove the old_passwords variable from your my.cnf/my.ini file and restart your MySQL serveroGYfunction() { if(this.Value == "Yes") return "Critical"; else return "None"; }F!The password hash computation algorithm was changed in MySQL 4.1 to produce a longer 41-byte hash value. In earlier versions of MySQL, password hashes were 16 bytes long. For maintaining backward compatibility, MySQL provides an option to accept old password hashes. 66EGKThere are multiple security issues with LOAD DATA LOCAL which is best explained in MySQL documentation at http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html.{PqWhile it is normal to make frequent changes to database security privileges during testing and development, you should be careful about frequent changes in the production server. Always make sure that such changes are authorized and required. Ofunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_grant; }NCom_grant&MGMake sure that you disable the "LOAD DATA LOCAL" option. To disable, set local-infile = 0 in your my.cnf/my.ini file and restart your MySQL server.nLWfunction() { if(this.Value == "ON") return "Critical"; else return "None"; } xvUgWhile it is normal to have frequent changes to database security privileges during testing and development, you should be aware of frequent changes in the production server. Always make sure that such changes are authorized and required.ZT/function () { var ret = 0; if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalStatus.Com_revoke) ret += ToInt(MONyog.MySQL.GlobalStatus.Com_revoke); if(MONyog.MySQL.GlobalStatus.Com_revoke_all) ret += ToInt(MONyog.MySQL.GlobalStatus.Com_revoke_all); return ret; }#SCCom_revoke + Com_revoke_allR)Dump the binary log for that timeframe and determine who made the changes, what changes actually took place and the reasons for those changes.jQOfunction() { if(this.Value > 0) return "Critical"; else return "None"; } M'1;EOYcmw&1<GR\fpz$.8BLV`jt~! _ ^  ]   E   D   C                                ;   <   =   >   ?   @   A   B           ! " # $ % & ' ( ) * + , - . /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  > ? @ A H%%/9CMWaku )3=GQ[fq| !+5?IS]gq{ C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a            b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~     Y:YmZUSymlinks are convenient for moving files around but they can be a potential security risk. Disabling symlinks will prevent the possibility of escalated privileges given to the owner of whoever started the mysqld process. Ultimately this could result in accidental or deliberate overwriting of files on your system, so it is best to just remove their usage.o[Yfunction() { if(this.Value == "Yes") return "Critical"; else return "None"; }'YIfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (MONyog.MySQL.GlobalVariables.have_symlink == "YES")?"Yes":"No"; }X%have_symlinkW)Dump the binary log for that timeframe and determine who made the changes, what changes actually took place and the reasons for those changes.jVOfunction() { if(this.Value > 0) return "Critical"; else return "None"; } #W\_3The SHOW DATABASES privilege should be granted only to users who need to see all the databases on a MySQL Server. Normally users do not need this privilege unless they need to create temporary tables, etc. Some global privileges like CREATE TEMPORARY TABLES or LOCK TABLES implicitly allow SHOW DATABASES unless this is explicitly disabledo`Yfunction() { if(this.Value == "Yes") return "Critical"; else return "None"; }-^Ufunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (MONyog.MySQL.GlobalVariables.skip_show_database == "OFF")?"Yes":"No"; }]1skip_show_databaseZ\/Start up MySQL with the parameter to disable the use of symlinks (via the
-skip-symlink option). Alternatively, put the variable skip-symbolic-links to your my.cnf/my.ini file and restart the MySQL server. v;z==5aeTo disable SHOW DATABASES, start the MySQL Server with the --skip-show-database option enabled. Also note that GUI clients5aeTo disable SHOW DATABASES, start the MySQL Server with the --skip-show-database option enabled. Also note that GUI clients will mostly need this privilege to be functional.b3Super_account_count%cEfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Super_account_count; }BdDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases. FF8W>ZZifMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

If you prefer GUI, you caefunction() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }ifMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a userg7Process_account_count&hGfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Process_account_count; } IIZ%$BiDo not grant gloBiDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.jfunction() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }ikMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user <Y>Z;j# C _GLOBAL_EXCES_PRIV_DOC_TEXT% BxDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that ipMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a userq3Grant_account_count$rCfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Grant_account_count; } >Z8W0 function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }#C BDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust.izMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user{1Drop_account_count#|Afunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Drop_account_count; } 8W8WB  Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that youiMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user5Insert_account_count%Efunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Insert_account_count; } v$&Gfunction() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { return MONyog.System.General.version; } return "(n/a)"; }oYfunction() { if(this.Value == "No") return "Critical"; else return "None"; }QThis option indicates whether MONyog is able to collect OS Data.
(Note: You have to configure MONyog to enable this feature. This feature is only available on Linux machines with SSH configured.)4!eSystem Uptime. Calulated from '/proc/uptime'' KThe version of the Linux kernelFMONyog is not able to collect OS Data. Check:
  • your OS connection parameters,
  • if your server is up, and,
  • if your server is accessible from the monitoring machine.
  • Version ;ww'2=HS^it$/:EP[fq|                                     M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d  e  f g h i j  k  l  m  n  o          47)44%cfunction x() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) ret = GetCpuUsed(MONyog.System.Cpu.sys_cpu_user, MONyog.System.Cpu.sys_cpu_nice, MONyog.System.Cpu.sys_cpu_system, MONyog.System.Cpu.sys_cpu_idle, MONyog.System.Cpu.sys_cpu_iowait, MONyog.System.Cpu.sys_cpu_hi, MONyog.System.Cpu.sys_cpu_si) + "%"; else ret = "(n/a)"; return ret; }c Yes,$UCalculated from values at /proc/stat7#kSystem has been running for this amount of timefunction() { if(CheckForSystem()) return TimeUnits(MONyog.System.General.uptime/1000); else return "(n/a)"; }4!eSystem Uptime. Calulated from '/proc/uptime'' KE"function() { if(CheckForSystem() && typeof(MONyog.System.General.uptime) != "undefined") return TimeUnits(MONyog.System.General.uptime/1000); else return "(n/a)"; } V&Vd9Cfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } 870 750D6This indicates the cycles spent by the CPU waiting on I/O operations. Excessive CPU I/O usage reflects on a poorly configured server and is indicative of poor disk or network performance.5 function() { if(CheckForSystem()) return MONyog.System.General.uptime/1000; else return "(n/a)"; }V4'function x() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) ret = GetCpuIOPercentage(MONyog.System.Cpu.sys_cpu_user, MONyog.System.Cpu.sys_cpu_nice, MONyog.System.Cpu.sys_cpu_system, MONyog.System.Cpu.sys_cpu_idle, MONyog.System.Cpu.sys_cpu_iowait, MONyog.System.Cpu.sys_cpu_hi, MONyog.System.Cpu.sys_cpu_si) + "%"; else ret = "(n/a)"; return ret; } 8&D$68VB' If free memory is low, use system tools (e.g. ps, top, vmstat, perfmon, etc.) to investigate how the memory is being consumed, so you can determine the appropriate action to take to improve the situation.!A? Available Physical Memory.@W function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return NumCounter(MONyog.System.Mem.sys_mem_free * 1024); return "(n/a)"; } ? Avg+>S Value of 'MemFree' in /proc/meminfo=7Total Physical memory/<Yfunction() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return NumCounter(MONyog.System.Mem.sys_mem_total * 1024); return "(n/a)"; },;UValue of 'MemTotal' in /proc/meminfoV:'If CPU I/O usage is high, use system tools (e.g. ps, top, vmstat, perfmon, etc.) to investigate how and why the CPU is waiting, so you can determine the appropriate action to take to improve the situation. **TG# function x() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { var mem_available = ToInt(MONyog.System.Mem.sys_mem_available); if (mem_available == -1) { mem_available = ToInt(MONyog.System.Mem.sys_mem_free) + ToInt(MONyog.System.Mem.sys_mem_buffers) + ToInt(MONyog.System.Mem.sys_mem_cached); } var type = mem_available / ToInt(MONyog.System.Mem.sys_mem_total) * 100; return ((100 - type).toFixed(1)) + "%"; } else return "(n/a)"; }H1 The operating system uses a complex paging algorithm to manage virtual memory. Low physical memory may cause thrashing (frequent swapping of memory pages), which inhibits any useful work being done. Moreover, with low memory, new processes and threads will not start. F Yes E YesD System/C[ Calculated from values at /proc/meminfo +8^L7 If too much memory is occupied, use system tools (e.g. ps, top, vmstat, perfmon, etc.) to investigate how the memory is being consumed, so you can determine the appropriate action to take to improve the situation. I 95 J 99dKC function() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); }^L7 If too much memory is occupied, use system tools (e.g. ps, top, vmstat, perfmon, etc.) to investigate how the memory is being consumed, so you can determine the appropriate action to take to improve the situation.:Mq Value of 'VmRSS' in /proc/<MySQL_PID>/status N YesO SystemP! NumCounter Q Avg )qcR=Y! NumCounterX System W YesV Total amount of virtual memory used by MySQL. It includes all code, data and shared librarFR function() { if(CheckForSystem () && MONyog.System.Custom.Available == 1) { if(MONyog.System.Mem.proc_mem_vmrss!= -1) { return MONyog.System.Mem.proc_mem_vmrss * 1024; } else { var ret = "Could not read PID file.
    "; if(MONyog.MySQL.Custom.Available == 1) ret += "Please add the SSH user to mysql group in Linux."; else ret += "MySQL is not available."; return ret; } } else { return "(n/a)"; } }SS! Memory used by MySQL. This value helps you determine whether external applications like web-servers, application servers, etc can coexist with MySQL server on the same host without degrading performance seT?Hd function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { return (MONyog.System.Swp.sys_swp_free * 1024); } else { return "(n/a)"; } }i! NumCounterhSystem g Yes @ A  ? B D E  C F H I  G J L M  K N P Q  O R T U  S V X Y  W Z \ ]  [ ^ ` a  _                                 D6( DyH7Ofunction() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { var memused = MONyog.System.Mem.sys_mem_total - MONyog.System.Mem.sys_mem_free ; var memusedbyapps = memused - MONyog.System.Mem.sys_mem_buffers - MONyog.System.Mem.sys_mem_cached; var memusedapppercent = (memusedbyapps / memused) * 100; return (memusedapppercent).toFixed(2) + "%"; } else { return "(n/a)"; } }7 NumCounterWithSecondsSystem.YCalculated from values at /proc/vmstat This is the percentage of occupied memory, being used by applications. This excludes buffers and cached memory from the used memorySystem  Yes  YesFThis is (Memory Used By Applications / Memory Used) * 100. The value of 'Memory Used by Applications' is calculated by subtracting the values of 'Buffers' and 'Cache' From the 'Memory Used' _yN=_ 9function x() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { var version = MONyog.System.Custom.Version; if(IsKernalVersionLessThan2dot6(version)) return (MONyog.System.Io.blocks_in * 1024); else return "(n/a)"; } else { return "(n/a)"; } } 7 NumCounterWithSeconds System. YCalculated from values at /proc/vmstat\ 3The value represents the total amount of data (in bytes) read from block device(s) attached to the system.
    Note: This statistic is available only in Linux systems with kernel version 2.6.x or greater function() { if(CheckForSystem()) return MONyog.System.General.uptime/1000; else return "(n/a)"; } 0X+function x() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { var version = MONyog.System.Custom.Version; if(IsKernalVersionLessThan2dot6(version)) return (MONyog.System.Io.blocks_out * 1024); else return "(n/a)"; } else { return "(n/a)"; } }Nfunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_admin_commands, MONyog.MySQL.GlobalStatus.Uptime); }1Com_admin_commands]5The value represents the total amount of data (in bytes) written to block device(s) attached to the system.
    Note: This statistic is available only in Linux systems with kernel version 2.6.x or greater 11Nfunction() { // warn if more than 40% of all Qeustions and Admin commands if(this.Value/MONyog.MySQL.GlobalStatus.Questions > .4) return "Warning"; else return "None"; }I function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_change_db, MONyog.MySQL.GlobalStatus.Uptime); }'Com_change_dbY-This variable generally increments for ping() or similar non-query commands. It's possible that the application is doing a lot of junk queries.

    Many applications execute unncessary admin commands and unncessary ping() calls The extra ping()-ing adds another round-trip over the network, which can really add up for the application, though it doesn't really hurt the server's performance.The effect is basically longer page load latency (assuming it's a web app)8mThe total number of 'admin' (non-query) commands IIv\function () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Com_prepare_sql) == "undefined") return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_prepare_sql, MONyog.MySQL.GlobalStatus.Uptime); }+Com_dealloc_sql2aThe total number of 'Prepare SQL' commands+Com_prepare_sql  Executing 'USE <db>' before each query is common mistake in many applications. It is wiser to just fully qualify your queries: instead of

    \nuse foo;\nselect * from tbl;\n
    you should write
    \nselect * from foo.tbl;\n
    and save a query0]The total number of 'Change DB' commandswifunction() { // warn if more than 40% of all Qeustions and Admin commands if(SafeDiv0(MONyog.MySQL.GlobalStatus.Com_change_db, MONyog.MySQL.GlobalStatus.Questions) > .4) return "Warning"; else return "None"; } U<1 ]function() { // warn if more than 40% of all Qeustions and Admin commands if((MONyog.MySQL.GlobalStatus.Com_prepare_sql > 0) && SafeDiv0(MONyog.MySQL.GlobalStatus.Com_dealloc_sql,MONyog.MySQL.GlobalStatus.Com_prepare_sql) < .6) return "Warning"; else return "None"; }")Com_stmt_close`!;If this is much lower than Com_prepare_sql, then prepared statements are being 'leaked'2aThe total number of 'Dealloc SQL' commandsfunction () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Com_dealloc_sql) == "undefined") return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_dealloc_sql, MONyog.MySQL.GlobalStatus.Uptime); } fO5fK(function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_lock_tables, MONyog.MySQL.GlobalStatus.Uptime); }'+Com_lock_tables`&;If this is much lower than Com_prepare_sql, then prepared statements are being 'leaked'~%wfunction() { // warn if more than 40% of all Qeustions and Admin commands if(SafeDiv0(MONyog.MySQL.GlobalStatus.Com_stmt_close/MONyog.MySQL.GlobalStatus.Com_prepare_sql) < .6) return "Warning"; else return "None"; }8$mThe total number of 'Close PREPARE SQL' commands #function () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Com_stmt_close) == "undefined") return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_stmt_close, MONyog.MySQL.GlobalStatus.Uptime); } )+1function () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Com_show_create_table) == "undefined") return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_show_create_table, MONyog.MySQL.GlobalStatus.Uptime); }*7Com_show_create_table)9The total number of LOCK TABLE commands. If there are only InnoDB tables, Com_lock_tables should not increase on an ongoing basis. There are certain programs like mysqldump that may use them anyway, but it's a typical mistake to use lock tables with transactional tables kT:kK.function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounterWithSeconds(MONyog.MySQL.GlobalStatus.Com_show_fields, MONyog.MySQL.GlobalStatus.Uptime); }-+Com_show_fields(,KSome 'frameworks' want to run SHOW CREATE TABLE or SHOW COLUMNS or DESCRIBE before each query. This is a bad idea. If this value increases nearly as fast as Questions or nearly as fast as Connections (which would indicate one per new connection from the app) then it's a problem. The application ought to cache its schema permanently instead of inspecting every time it queries W/)Some 'frameworks' want to run SHOW FIELDS or SHOW COLUMNS before each query. This is a bad idea. If this value increases nearly as fast as Questions or nearly as fast as Connections (which would indicate one per new connection from the app) then it's a problem. The application ought to cache its schema permanently instead of inspecting every time it queries.

    A high value for Com_show_fields is the signature of Ruby on Rails!(0M MONyog.MySQL.GlobalStatus.Uptime{1q Com_create_db > || Com_alter_db > 0 || Com_drop_db > 0 || Com_create_function > 0 || Com_drop_function > 0 || Com_create_index > 0 || Com_drop_index > 0 || Com_alter_table > 0 || Com_create_table > 0 || Com_drop_table > 0 || Com_drop_user > 0 q3] function() { if(this.Value == "Yes") return "Critical"; else return "Noi2M function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalStatus.Com_create_db > 0 || MONyog.MySQL.GlobalStatus.Com_alter_db > 0 || MONyog.MySQL.GlobalStatus.Com_drop_db > 0 || MONyog.MySQL.GlobalStatus.Com_create_function > 0 || MONyog.MySQL.GlobalStatus.Com_drop_function > 0 || MONyog.MySQL.GlobalStatus.Com_create_index > 0 || MONyog.MySQL.GlobalStatus.Com_drop_index > 0 || MONyog.MySQL.GlobalStatus.Com_alter_table > 0 || MONyog.MySQL.GlobalStatus.Com_create_table > 0 || MONyog.MySQL.GlobalStatus.Com_drop_table > 0 || MONyog.MySQL.GlobalStatus.Com_drop_user > 0) return "Yes"; return "No"; }q3] function() { if(this.Value == "Yes") return "Critical"; else return "None"; } MM@o4Y While it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.5) Dump the binary log for that timeframe and determine who made the changes, what changes actually took place and the reasons for those changes.6% Com_alter_db)7M function() { if(typeof(MONyog.MySQL.GlobalStatus.Com_alter_db) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_alter_db; }(8M MONyog.MySQL.GlobalStatus.Uptimeo9Y While it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.:' Com_create_db(;M MONyog.MySQL.GlobalStatus.Uptime M *5@KValw'2=HS^it$/:EP[fq|                                                                                                     jlyc8jE'@function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_drop_db; }(CM MONyog.MySQL.GlobalStatus.UptimeB3Com_create_functionoAYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.(?M MONyog.MySQL.GlobalStatus.Uptime>#Com_drop_dbo=Y While it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.< function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_create_db; } [fsW,[9H#function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_drop_function; }(KM MONyog.MySQL.GlobalStatus.UptimeJ-Com_create_indexoIYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.(GM MONyog.MySQL.GlobalStatus.UptimeF/Com_drop_functionoEYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.D'function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_create_function; } eiv]2e?%Pfunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_drop_index; }(SM MONyog.MySQL.GlobalStatus.UptimeR+Com_alter_tableoQYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.(OM MONyog.MySQL.GlobalStatus.UptimeN)Com_drop_indexoMYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.L!function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_create_index; } jw\1>X!function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_create_table; }oYYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.(WM MONyog.MySQL.GlobalStatus.UptimeV-Com_create_tableoUYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.Tfunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_alter_table; } {bkfunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Delayed_errors; }\m3The number of rows written with INSERT DELAYED for which some error occurredilMfunction() { if(this.Value > 1) return "Warning"; else return "None"; }j)Delayed_errorsWi)This value denotes the memory requirement by MySQL if max. users are connected'hIfunction () { if(!MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size) MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size = 0; if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MemoryRequired(MONyog.MySQL.GlobalVariables.max_connections); } N *5@KValw'2=HS^it$/:EP[fq|                                                                                                                       o-function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(typeof(MONyog.MySQL.GlobalVariables.tx_isolation) !== "undefined") return MONyog.MySQL.GlobalVariables.tx_isolation; else if(typeof(MONyog.MySQL.GlobalVariables.transaction_isolation) !== "undefined") return MONyog.MySQL.GlobalVariables.transaction_isolation; else return "(n/a)"; }3Ifunction() { if(this.Value != "RE4rcfunction() { if(this.Value != "REPEATABLE-READ" && this.Value != "READ-COMMITTED" && this.Value != "n/a") return "Warning"; else return "None"; }NqThis variable controls how transactions are isolated from one anotherp%tx_isolationsnaIf this is nonzero it needs investigation. This means that statements are causing errors that the application can't catch or observe. Check your INSERT DELAYED statements and be sure they aren't causing duplicate key or other errors vvbv?function() { if(this.Value == "Yes") return "Warning"; return "None"; }tucfunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var value = MONyog.MySQL.GlobalVariables.lower_case_table_names; if(value == 1) return "No"; else return "Yes"; }#tClower_case_table_names != 1sSetting it to anything but REPEATABLE-READ or READ-COMMITTED is generally not necessary; in fact the default setting of REPEATABLE-READ is usually the best idea. Other settings may cause inconsistent behavior and generally do not improve performance eVj{Ofunction() { if(parseInt(this.Value, 10) > 1) return "Warning"; return "None"; }[z1function x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalVariables.myisam_repair_threads > 1) return "Yes"; else return "No"; }e!y?myisam_repair_threads > 1exESet lower_case_table_names=1 in your configuration file and restart your MySQL server&wGCase sensitivity of identifiers is determined by the operating system where MySQL is running. This means database, table, and trigger names are not case sensitive in Windows, but are case sensitive in Unix. So if you are migrating data from one platform to the other, you may encounter problems.
    The lower_case_table_names system variable also affects how the server handles identifier case sensitivity XGXa=function() { if(this.Value == "Yes") return "Warning"; return "None"; }@{MySQL normally uses the write() system call, and allows the operating system to schedule writes to the disk. However, by setting flush=ON in your configuration file, you can force MySQL to flush data to the disk after the execution of each SQL statement. This would severely impact the performanceH function x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalVariables.flush != "OFF") return "Yes"; else return "No"; } ~flushh}KEnsure that you set myisam_repair_threads=1 in your configuration file and restart MySQL5|eYou can choose to use multiple threads when repairing MyISAM tables to improve performance. The side effect, however, is that it can also lead to table and index corruption ]BU\U% function() { // should not be more than 2MB if(this.Value != "(n/a)" && ToInt(MONyog.MySQL.GlobalVariables.sort_buffer_size) > 2097152) return "Warning"; else return "None"; }ue This buffer is used by ORDER BY, GROUP_BY, DISTINCT. You can improve the performance of 'ORDER BY' by increasing this value. The recommended value is 1MB. This buffer is allocated per client, so be careful about not making it very largeiM function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.sort_buffer_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.sort_buffer_size); }- sort_buffer_size9From a performance standpoint, you should ensure that this feature is disabled. Set flush=OFF in your configuration file and then restart MySQL \7#\ + function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Sort_scan); }(M MONyog.MySQL.GlobalStatus.Uptime  Sort_scan ' The number of sorts that were performed by queries that used range accesses. This variable gets increased if a range-access query does a sort( M MONyog.MySQL.GlobalStatus.Uptime - function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Sort_range); }! Sort_rangeN This variable should not be set larger than 2M for most purposes, and then only with benchmarks to prove that it helps. Making it too large can actually slow down queries. Instead of setting it to a large value globally, leave the global setting small, and set the local value larger for queries you know will benefit from it vV# function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Sort_merge_passes; }7 NumCounterWithSeconds(M MONyog.MySQL.GlobalStatus.Uptime/ Sort_merge_passes@} The number of sorts that were done by scanning the table tC!t)M function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.myisam_sort_buffer_size); }; myisam_sort_buffer_size9m MySQL first tries to sort all rows in memory. If the local @@sort_buffer_size is not large enough, a couple of temporary files will be created, one for storing the rows and second for storing the sorted rows. If the value is high, you should increase the local value of @@sort_buffer_size.

    It is NOT wise to increase sort_buffer_size based on this. The default sort_buffer_size should stay small, and for queries that need to do a large sort, the *local* value of @@sort_buffer_size should be increased just before the query is run (and then set back to the original value). The best sort_buffer_size is different for each query, and should be determined by benchmarking   Yesr_function () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.read_rnd_buffer_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.read_rnd_buffer_size); }'Slave_running+QYou can improve 'ORDER BY' performance by setting this variable to a large value. However, since it is allocated per client, be careful with extremely high values5read_rnd_buffer_size"? This buffer is created on demand when MySQL needs to rebuild the index after REPAIR, OPTIMIZE, ALTER table statements. Since this buffer is allocated only on demand, you can set it to a higher value. However, since it is allocated per client, be careful with extremely high values FFF#-function() { if(this.Value == "ON" || this.Value == 1 || this.Value == "(n/a)") return "None"; else return "Critical"; }!read_onlyc AIf this server is no longer running as a SLAVE connected to the MASTER, use SHOW SLAVE STATUS and try to determine whether there was an error or the slave was stopped manually. Check the last 100 lines of the slave's error log to see if that gives a clue.

    Look at Last Error Number and Last Error Message for specific error information.

    Determine if and why an explicit STOP SLAVE was issued. Try restarting the slave with START SLAVEnWfunction() { if(this.Value == "No") return "Critical"; else return "None"; } 6m*UThis value indicates if the slave I/O thread was started and is successfully connected to the masterp)[function() { if(this.Value == "No") return "Critical"; else return "None"; } (Yes&-Slave_IO_RunningD%This variable may help prevent some unsafe writes from occurring on slaves, but only if users are not needlessly granted the SUPER privilege. It is a good idea to set slaves as read_only~$wIf it is enabled, the server allows no updates except from SUPER users from updates performed by slave threads dfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Slave_SQL_Running || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Slave_SQL_Running; } cfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Slave_IO_State || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return (MONyog.MySQL.Slave.Slave_IO_State); }b/function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Slave_IO_Running || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; else return MONyog.MySQL.Slave.Slave_IO_Running; } r._This value is same as the State Field of SHOW PROCESSLIST of slave I/O Thread. This gives you more details on what the thread is doing - whether its trying to connect to the master, waiting for events, reconnecting to the master, etc,)Slave_IO_Stateh+KIf the Slave I/O thread is no longer running on this server, check the slave's error log for messages that may indicate why this thread may have stopped. Check the last 100 lines of the error log to see if that gives a clue. Usually the problem is a wrong position given in the CHANGE MASTER TO command. Often the easiest fix is to set up the slave again just as if it was a new slave.

    The last error can be determined by Last Error Number and Last Error  B5l^PBBB 9 600 8 450 7 Yes57 Seconds_Behind_Master%4ETry to find out why the slave SQL thread is no longer running on this server.

    The last error can be determined by 'Last Error Number' and 'Last Error'

    R3This value indicates whether the slave SQL thread is running successfully 2Yesn1Wfunction() { if(this.Value == "No") return "Critical"; else return "None"; }//Slave_SQL_Running N/lw'2=HS@K*V^5a q$|tif[PE:                                           !  "  #  %  $  &  " " " " " " " ! ! ! ! ! ! ! ! !      # # # " "   " " #      #     UU/S7^:7 function() { if(this.Value == "(n/a)") return "None"; else if(this.Value == "NULL") return "Critical"; else return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); }=/ slave_skip_errorsX<+ This value is useful only if the network between Slave and Master is fast. If the network is fast, investigate why this server is so far behind the master. Sometimes, other processes on the slave can impact the MySQL server. Try to improve the connectivity between the Master and Slave.

    This value can also get very high if the Slave was unable to to connect to MASTER at some point in time. In that case, the slave would eventually catch up with the master

    c;A This value gives an indication of how much (if any) is the slave lagging behind the masterkc:A function() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } ::lWN2@- function() { // should not be less than 1MB if(this.Value != "(n/a)" && (MONyog.MySQL.GlobalVariables.slave_skip_errors == "ON" || MONyog.MySQL.GlobalVariables.slave_skip_errors == 1)) return "Warning"; else return "None"; }B! Last_Errno!A= It is generally not safe to set this. If you have slave errors, you should solve the problems instead of skipping errors. Skipping errors usually means the slave will end up with different data than the master, making it untrustworthy for queries and unusable for taking backupsI?  This variable controls which errors the slave thread should skipUH/slave_net_timeoutLG The last Error Message returned by the most recently executed queryE! Last_ErrorKD The last Error Number returned by the most recently executed query 8Jkfunction() { if(IsReplicationSlave(MONyog.ServyJmfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false) return "None"; else if(MONyog.MySQL.GlobalVariables.slave_net_timeout >= 3600) return "Warning"; else return "None"; }MLWhen the network connection between a master and slave database is interrupted in a way that neither side can detect, the slave will wait slave_net_timeout seconds before trying to reconnect to the master. The default value of 3600 seconds (1 hour) is not practical. A value of less than 60 seconds would be optimum.kKQThe number of seconds to wait for more data from a master/slave connection before aborting the read. This timeout applies only to TCP/IP connections, not to connections made via Unix socket files, named pipes, or shared memory mfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Master_Port || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Master_Port; }lfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Master_Host || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Master_Host; }(kKfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.GlobalStatus.Slave_open_temp_tables || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.GlobalStatus.Slave_open_temp_tables; } r~gI_Ya-The position upto which the I/O thread has read in the current master binary log_3Read_Master_Log_PosC^The Username used for connecting to the Replication MasterV#Master_Port?U{The Host Name of the Replication Master for this serverS#Master_HostTR#The number of temporary tables that the Slave SQL thread currently has openP9Slave_open_temp_tablesoOYThe total number of times since startup that the replication slave SQL thread has retried transactions\#Master_User^[7The name of the master binary log file from which the I/O thread is currently readingY+Master_Log_File@X}The MySQL Port of the Replication Master for this server"MASlave_retried_transactions Xx<$^m7The position upto which the SQL thread has read and executed in the current relay logk'Relay_Log_PosdjCThe name of the Relay Log File from which the SQL thread is currently reading and executingGkdQThe name of the master binary log file containing the most recent event executed by the SQL threadb7Relay_Master_Log_Fileh)Relay_Log_FileogYThe position in the master binary log file containing the most recent event executed by the SQL threade3Exec_Master_Log_Pos .S^itH=2'/$:EP[fq|                    ! " # $ % & ( ) ' * + , - . /  1  2  4  3  0  5  6  7  9  8  :  < p#function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Read_Master_Log_Pos || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Read_Master_Log_Pos; }ofunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Master_User || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Master_User; } nfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Master_Log_File || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Master_Log_File; }  sfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Relay_Log_File || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Relay_Log_File; }r#function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Exec_Master_Log_Pos || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Exec_Master_Log_Pos; }q+function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Relay_Master_Log_File || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Relay_Master_Log_File; } zO/ tfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Questions; }s7 NumCounterWithSeconds(rM MONyog.MySQL.GlobalStatus.UptimeqQuestions:pqThe total combined size of all existing relay logsn+Relay_Log_Space5 a_J!k=(aCfunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (ToInt(MONyog.MySQL.GlobalStatus.Com_insert)+ToInt(MONyog.MySQL.GlobalStatus.Com_replace)); }~! Statements+}SMONyog.MySQL.GlobalStatus.Questions(|M MONyog.MySQL.GlobalStatus.Uptime.{Y(Com_insert + Com_replace) / QuestionsWz)The total number of SELECT statements that all clients have sent to the server%yEfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(!MONyog.MySQL.GlobalStatus.Qcache_hits) MONyog.MySQL.GlobalStatus.Qcache_hits = 0; return (ToInt(MONyog.MySQL.GlobalStatus.Com_select)+ToInt(MONyog.MySQL.GlobalStatus.Qcache_hits)); }x! Statements(wM MONyog.MySQL.GlobalStatus.Uptime v=Com_select + Qcache_hitsPuThe total number of statements that all clients have sent to the server iZ,}#i: 'function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (ToInt(MONyog.MySQL.GlobalStatus.Com_delete)); }! NumCounter ; max_prepared_stmt_countW )The total number of DELETE statements that all clients have sent to the server ! Statements+ SMONyog.MySQL.GlobalStatus.Questions(M MONyog.MySQL.GlobalStatus.Uptime9Com_delete / QuestionsW)The total number of UPDATE statements that all clients have sent to the server'function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (ToInt(MONyog.MySQL.GlobalStatus.Com_update)); }! Statements+SMONyog.MySQL.GlobalStatus.Questions(M MONyog.MySQL.GlobalStatus.Uptime9Com_update / QuestionsW)The total number of INSERT statements that all clients have sent to the server 5S^it$/:EP[fq|H=2'  _  ^  ]        4  3  2  1  0 x y z | { } ~                                                      b4 function x() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.max_prepared_stmt_count) == "undefined") return "(n/a)"; var count = MONyog.MySQL.GlobalVariables.max_prepared_stmt_count; return count; }! Statements+SMONyog.MySQL.GlobalStatus.Questions(M MONyog.MySQL.GlobalStatus.Uptime~w Ensure that an appropriate value for max_prepared_stmt_count is set, depending on your application requirement{q This variable limits the total number of prepared statements in the server. Although using prepared statements in applications that execute the same query several times increases their performance, prepared statements consume memory in the MySQL server until they are closed.
    Allowing a huge number of prepared statements may lead to the server running out of memoryp[ function() { if(parseInt(this.Value, 10) == 16382 ) return "Warning"; return "None"; } ooWBOThe total number of Data Manipulation Statements that all clients have sent to the server. Typically, a large fraction of your incoming traffic to the MySQL server should consist of these statements! NumCounter(M MONyog.MySQL.GlobalStatus.Uptime Handler_read_first + Handler_read_key + Handler_read_next + Handler_read_prev + Handler_read_rnd + Handler_read_rnd_next + Sort_rowsiMfunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var dms = 0; dms += ToInt(MONyog.MySQL.GlobalStatus.Com_select)+ToInt(MONyog.MySQL.GlobalStatus.Qcache_hits); //selects dms += ToInt(MONyog.MySQL.GlobalStatus.Com_insert)+ToInt(MONyog.MySQL.GlobalStatus.Com_replace); //inserts dms += ToInt(MONyog.MySQL.GlobalStatus.Com_update); //updates dms += ToInt(MONyog.MySQL.GlobalStatus.Com_delete); // deletes return (dms); } lA,H function() { var rows = 0; if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_first); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_prev); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Sort_rows); return (ToInt(rows)); }! NumCounter(M MONyog.MySQL.GlobalStatus.UptimeV' Handler_read_first + Handler_read_key + Handler_read_next + Handler_read_prev8mThe total number of rows returned by all queries mm#  function() { var rows = 0; if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_first); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_prev); return (rows); }-!W The total rows returned using indexes"- (Handler_read_first + Handler_read_key + Handler_read_next + Handler_read_prev + Handler_read_rnd + Handler_read_rnd_next + Sort_rows)/Questions(#M MONyog.MySQL.GlobalStatus.Uptime$! NumCounter 0mh%K function() { var rows = 0; if(MONyog.MySQL.Custom.Avail % function() { var rows = 0; if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_first); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_prev); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Sort_rows); var result = SafeDiv0(rows, MONyog.MySQL.GlobalStatus.Questions); return ToInt(result); }:&q The average number of rows returned for each queryW') (Handler_read_first + Handler_read_key + Handler_read_next + Handler_read_prev((M MONyog.MySQL.GlobalStatus.Uptime ) Yes @@S^it=2'wlaVK$/H:EP[fq|@  $ ` $ _ $ $ ] # \ # [ # # Y " X " W " " U ! T ! S ! ! Q                                        b c d e f h i  g j k m l n p o q r s t u w ]*5 function() { var rows = 0; var rowsviaindexes = 0; var result; if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_first); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_prev); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd); rows += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next); rows += ToInt(MONyog.MySQL.GlobalStatus.Sort_rows); rowsviaindexes += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_first); rowsviaindexes += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key); rowsviaindexes += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_next); rowsviaindexes += ToInt(MONyog.MySQL.GlobalStatus.Handler_read_prev); result = SafeDiv0(rowsviaindexes, rows) * 100; return (result.toFixed(2) + "%"); } EE}u-efunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var type = MONyog.MySQL.GlobalVariables.log_bin; if(type == "OFF") return "No"; else if(type == "ON") return "Yes"; 5+g The percentage of rows returned using indexes,log_binu-efunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var type = MONyog.MySQL.GlobalVariables.log_bin; if(type == "OFF") return "No"; else if(type == "ON") return "Yes"; }x.kThe binary log stores all statements in a binary format. The binary log is necessary for point-in-time recovery=/uEnable binary logging by setting the log-bin option.

    If a restore of your backup is required, Binary logs enable you to roll-forward changes made after the full backup

    90obinlog_do_db != \"\" || binlog_ignore_db != \"\" NNb2?function() { if(this.Value == "Yes") return "Warning"; return "None"; };1qfunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var value = MONyog.MySQL.GlobalVariables.log_bin; if((value != "OFF") && (MONyog.MySQL.Master.Binlog_Do_DB != "" || MONyog.MySQL.Master.Binlog_Ignore_DB != "")) return "Yes"; else return "No"; }-3UAll changes (DDL, DML and security) to a database are recorded by MySQL in the binary log. This enables point-in-time recovery, thus preventing catastrophic data loss due to outages.
    Using the binlog-do-db and the binlog-ignore-db options you can limit binary logging on particular databases. However, doing so will limit your recovery options and also your ability to review changes made to the system] KN2KkK|:sfunction () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Binlog_cache_use) == "undefined") { return "(n/a)"; } return NumCounter(MONyog.MySQL.GlobalStatus.Binlog_cache_use); }=7 NumCounterWithSeconds<7Binlog_cache_disk_useH; The total number of transactions that used the binary log cache 9 Avg8-Binlog_cache_use 7 This buffer stores all SQL statements for the binary log during a transaction. It is used for transactional storage engines only"6?function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.binlog_cache_size); }5/binlog_cache_size.4WEnsure that binary logging is enabled for all important databases by reviewing the binlog-do-db and binlog-ignore-db options in your configuration file i?Mfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Binlog_cache_disk_use) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Binlog_cache_disk_use; } D Avg0C]Binlog_cache_disk_use / Binlog_cache_use}BuIf there is more than one transaction per minute then it needs investigation. Increase the size of binlog_cache_sizehAKThe number of transactions that used a temporary file because of insufficient binlog_cache_sizej@Ofunction() { // check if it is more than 1 per minute if(SafeDiv0(MONyog.MySQL.GlobalStatus.Binlog_cache_disk_use, MONyog.MySQL.GlobalStatus.Uptime*60) > 1) return "Warning"; else return "None"; } > Avg c6Efunction () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Binlog_cache_disk_use) == "undefined" || typeof(MONyog.MySQL.GlobalStatus.Binlog_cache_use) == "undefined") return "(n/a)"; return (SafeDiv0(MONyog.MySQL.GlobalStatus.Binlog_cache_disk_use,MONyog.MySQL.GlobalStatus.Binlog_cache_use)*100).toFixed(1) + "%"; }kLQThe percentage of transactions that used a temporary file because of insufficient binary log cache:KoEnable sync_binlog in your configuration file. Setting it to 1 will ensure that a crash will not result in the binary log getting out of sync with your transactional datadJCfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } I30 H10 G Yes F Yes qZQ/function x() { if(typeof MONyog.MySQL.ErrorLog.Size_changed == "undefined" || MONyog.MySQL.ErrorLog.Size_changed == 0 ) return "(n/a)"; else return MONyog.MySQL.ErrorLog.Size_changed; }xPkPlease ensure that the error log file is valid and that the MONyog user has sufficient privileges to access it.mOUfunction() { if(this.Value == "No") return "Critical"; else return "None"; } N;This Monitor/Advisor indicates whether MONyog is able to access the MySQL error log.
    (Note: You have to configure MONyog to enable this feature.) gMIfunction x() { if(typeof MONyog.MySQL.ErrorLog.Is_accessible == "undefined" || MONyog.MySQL.ErrorLog.Is_accessible == 0) return "(not configured)"; else return MONyog.MySQL.ErrorLog.Is_accessible; } ooPa WYes]R5MySQL records all errors it encounters in an error log. An error-prone server, obviously, is not performing optimally. This Monitor/Advisor indicates whether the error log has changed during the given time frame.SIf any errors are recorded in the error log file you should try and take corrective measures to ensure proper functionality of MySQL.>Twfunction x() { val = MONyog.MySQL.ErrorLog.Last_error; if(typeof val == "undefined" || val == 0 || val == "") return "(n/a)"; else return val; }dUCMySQL records all errors it encounters in an error log. An error-prone server, obviously, is not performing optimally. It helps to monitor the number of errors recorded in the MySQL error log to ensure smooth operation.qV]function() { if(this.Value != "(n/a)") return "Critical"; else return "None"; } M *5@KValw'2=HS^it$/:EP[fq|    ~   }   |   {  z                                                                                                                  vi^MEnable the slow query log. Refer to http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.htm WYesXIf any errors are recorded in the error log file you should try and take corrective measures to ensure proper functionality of MySQL. Y1 ZNo[-log_slow_queries\}function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var val=MONyog.MySQL.GlobalVariables.log_slow_queries; if(val == undefined) val = MONyog.MySQL.GlobalVariables.slow_query_log ; if(val == "ON") return "Yes"; else return "No"; }M]MySQL has a great feature - slow query log, which allows you to log all queries which took more than a specified amount of time to execute.

    The slow query log can be used to identify queries that take long time to complete. Enabling the slow query log is highly recommended as it allows you to record unoptimized queries ;_+long_query_time`9function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalVariables.long_query_time); }^a7If a query takes longer time than thisi^MEnable the slow query log. Refer to http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html for more information on the slow query log._+long_query_time`9function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalVariables.long_query_time); }^a7If a query takes longer time than this value, it is recorded into the slow query log. Nzz qh]function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.log_queries_not_using_indexes) == "undefined") return "(n/a)"; var val = MONyog.MySQL.GlobalVariables.log_queries_not_using_indexes; if(val == "ON") return "Yes"; else if(val == "OFF") return "No"; else return val; }8imThis option logs queries that don't use indexes.sjaYou should enable this option whenever you want to indentify queries that are not using indexes.

    If you keep this option always enabled, the slow query log can get potentially flooded with queries that read small static tables (for example country_master). You should enable this option for a particular task and disable it again when the task gets completed. _Q%A5le function x() { if(MONyog.MySQL.GlobalVariables.log === undefined) { if(MONyog.MySQL.GlobalVariables.general_log == "ON") return "Yes"; else return "No"; } else { if(MONyog.MySQL.GlobalVariables.log == "ON") return "Yes"; else return "No"; } } k logsma The general log records all requests sent by multiple clients to MySQL. This includes all SQL statements executed on the server along with clients' connection and disconnection information.
    It is not recommended that the general log be enabled on a production server, as it adds an overhead to the server, and grows rapidly consuming large amount disk space.an= function() { if(this.Value == "Yes") return "Warning"; return "None"; } |aG(}M MONyog.MySQL.GlobalStatus.Uptime|yThe total number of failed connection attempts.

    Excess aborted connection attempts indicates that
    - Client doesn't have privileges to connect to a database
    - A client uses an incorrect password
    - It takes more than connect_timeout seconds to get a connect packet

    If the number is high, it might indicate that someone is trying to hack your server!{!function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aborted_connects; }z-Aborted_connectsy7 NumCounterWithSeconds(xM MONyog.MySQL.GlobalStatus.UptimeOwThe total number of successful connection attempts to the MySQL server:vofunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Connections - MONyog.MySQL.GlobalStatus.Aborted_connects; }&uIConnections - Aborted_connects yy 30 25'High number of Connection attempts failed.

    If this number is high then it seems that your clients don't have privileges to connect or they are using an incorrect password to connect. A high number might also indicate that someone is trying to hack your server!X+function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (SafeDiv0(MONyog.MySQL.GlobalStatus.Aborted_connects,MONyog.MySQL.GlobalStatus.Connections)*100).toFixed(2)+ "%"; }&IAborted_connects / Connections*O1. Try to isolate users/applications that are using an incorrect password or trying to connect from unauthorized hosts.
    2. A client will be disallowed to connect if it takes more than connect_timeout seconds to connect.
    3. Switch on the General Query Log to log connection attempts.~7 NumCounterWithSeconds ~pE function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aborted_clients; } +Aborted_clientsx k1. Try to isolate users/applications that are using an incorrect password or trying to connect from unauthorized hosts.
    2. A client will be disallowed to connect if it takes more than connect_timeout seconds to connect.
    3. Set the value of log_warnings system variable to 2. This will force the MySQL server to log further information about the error.( M MONyog.MySQL.GlobalStatus.Uptime  Yes  Yes YescAfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } W~pW)Bytes_received 1) Make sure that your applications close the MySQL connections gracefully. For example: mysql_real_connect() without a corresponding mysql_close() may result in aborted connections

    2) Raise the value of wait_timeout and interactive_timeout7 NumCounterWithSeconds(M MONyog.MySQL.GlobalStatus.Uptime3 aConnections that were established successfully but got aborted abruptly. This might happen if the client does not close the connection gracefully or the client had been sleeping more than wait_timeout seconds.

    It would also be useful to check the values of wait_timeout and interactive_timeout and see if a timeout is really the problem. If there are processes in SHOW PROCESSLIST that have been idle (Sleep) for a time approaching one of these, you might advise either 1) close connections when you are done or 2) raise the value. N "B\function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Bytes_received; }X+The values indicates the amount of incoming network traffic to the MySQL server(M MONyog.MySQL.GlobalStatus.Uptime7 NumCounterWithSeconds! Bytes_sent  function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Bytes_sent; }Z/ The values indicates the amount of outgoing network traffic from the MySQL server(M MONyog.MySQL.GlobalStatus.Uptime7 NumCounterWithSeconds+max_connections ;function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.max_connections); } M *5@KValw'2=HS^it$/:EP[fq|   y  x  ! " # $  %  & ' ( ) * +  ,  - . / 0 1 2 3 4 5  6  7  8 9 : ; < = > ?  @ A B  C  D  E  F  G  H  I  J  K  L  M          s   t   u   v   w  N  O  P  Q  R  S  T  U  V  W  X      Y      Z  [  \  ]  ..+QThe total number of concurrent connections allowed by the MySQL server. If you are getting 'Too many connections' error, it means that you have reached this limit{If you are getting 'Too many connections' error frequently, you should try increasing this value. At the same time please note that if this is a very large value, it would make the system spend more time on thread scheduling and context switching./Threads_connected !function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Threads_connected; }&!IThe number of open connections " Yes#! NumCounter $ Avg+%SThreads_connected / max_connections`&;function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (SafeDiv0(MONyog.MySQL.GlobalStatus.Threads_connected,MONyog.MySQL.GlobalVariables.max_connections)*100).toFixed(2)+ "%"; } eeBP^lzQkZ'/The number of currently open connections as percentage of max allowed connections (75 )85c*Afunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } +Yes , Yes - Yes . AvgS/!1. The global variable max_connections determines the maximum number of concurrent connections to MySQL. Make sure that you have a high value for this variable.
    2. Design your application such that a MySQL connection is kept open for a very short period of time.
    3. Try pooling connections or switch to persistent connections. This will reduce the number of active MySQL connections. For example try using mysql_pconnect() instead of mysql_connect()0+Threads_running1function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Threads_running; } (~pbTG(:5Max_used_connections 9 If the database is overloaded you'll get an increased number of queries running. Occasional spikes are OK for very short period of time. Too many active threads indicate that:
    1. MySQL is taking too much time to process you requests.
    2. You are continuously retrieving/updating large datasets.

    Make sure that queries are tuned to use indexes. Execute SHOW FULL PROCESSLIST of find queries that are getting locked continuously. Try isolating long running queries by enabling the slow query log. 8 Avg 7 Yes 6Yesc5Afunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } 425 320~2wThe number of threads that are active at this point of time. Too many active threads indicates there is a severe load on the server and may be a sign of lock contention or unoptimized SQL queries. Too many active threads are bad for performance. ZWJ= G Avg F Yes E Yes D YescCA function() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } B 85 A 75s@a A high value indicates that you may run out of connections soon and new clients will be refused connectionc?A function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return (SafeDiv0(MONyog.MySQL.GlobalStatus.Max_used_connections,MONyog.MySQL.GlobalVariables.max_connections)*100).toFixed(2)+ "%"; }.>Y Max_used_connections / max_connections = Avgd<CThe maximum number of concurrent connections that have been in use since server was started";?function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Max_used_connections); } ABtdAN If there is more than this number of interrupted connections from a host, MySQL blocks that host from further connections.M+ function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalVariables.max_connect_errors; }L1 max_connect_errorsPK The server will disconnect the client after this duration of inactivityJ3 function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalVariables.wait_timeout); }I% wait_timeout:Ho 1. Make sure that you have a reasonable high value for max_connections.
    2. Design your application such that a MySQL connection is kept open for a very short period of time. M3xRk The number of seconds that the MySQL server waits for a connect packet before responding with an error message.Q9 function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalVariables.connect_timeout); }P+ connect_timeout/OY Unfortunately there is no way to query the server about the current value of this counter for each host. When the server rejects connections, for this reason it does so without warning. The default value is 10 and that is a rather low value particularly if connections from remote hosts are allowed. You can raise the number significantly. Optionally, you can execute FLUSH HOSTS as a daily or weekly scheduled job. ~d U;function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.key_buffer_size); }T+key_buffer_size~Sw In situations of network congestion (either at the client or server), it's possible for an initial connection to take several seconds to complete. Increasing this value might help if clients frequently encounter errors of the form Lost connection to MySQL server at 'XXX', system error: errno.
    Ideally, you should set the value to either 15 or 20 seconds. HXW+function() { // should not be less than 32MB if(this.Value != "(n/a)" && MONyog.MySQL.GlobalVariables.key_buffer_size < 33554432) return "Warning"; else return "None"; }Y5key_cache_block_sizepX[You should set it to at least 32M for machines that use no MyISAM tables, and larger for those that do.4VcThe MyISAM storage engine maintains a cache to keep the most frequently used index blocks in memory. Note that only index blocks are kept in this cache, for data blocks MyISAM uses the native filesystem cache. This should be 30-40% of available memory if you use MyISAM tables exclusively. If you dont use MyISAM tables set it to 32Mb so it is large enough to accommodate indexes for temporary tables which are created on disk. 1qZ]function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.key_cache_block_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.key_cache_block_size); }E_(key_buffer_size / key_cache_block_size) - Key_blocks_unused-^WThe number of blocks in the key cache`];function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalVariables.key_cache_block_size && MONyog.MySQL.GlobalVariables.key_buffer_size) return NumCounter(SafeDiv0(MONyog.MySQL.GlobalVariables.key_buffer_size, MONyog.MySQL.GlobalVariables.key_cache_block_size)); return "(n/a)"; }/\[key_buffer_size / key_cache_block_size 6[iThe size of the block buffers in the key cache  WbTF8%cEfunction() { var value = PercentUsed(); if(MONyog.M<`sfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.key_cache_block_size) == "undefined" || typeof(MONyog.MySQL.GlobalStatus.Key_blocks_unused) == "undefined") { return "(n/a)"; } return NumCounter(SafeDiv0(MONyog.MySQL.GlobalVariables.key_buffer_size, MONyog.MySQL.GlobalVariables.key_cache_block_size) - MONyog.MySQL.GlobalStatus.Key_blocks_unused); }2aaThe number of used blocks in the key cacheKb1 - (Key_blocks_unused / (key_buffer_size / key_cache_block_size))%cEfunction() { var value = PercentUsed(); if(MONyog.MySQL.Custom.Available != 1 || value == "(n/a)") return "(n/a)"; return value + "%" } K *5@KValw'2=HS^it$/:EP[fq|    ^  _  `  a  b  c  d   e   f   g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  {   |  }  ~                                                                                          )E@`(dMThe fraction of key cache in use e Yes f Yes g Avgi/Key_read_requestsj!function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Key_read_requests; }6kiThe number of read requests from the Key Cache(lM MONyog.MySQL.GlobalStatus.Uptimem7 NumCounterWithSecondsn3If the number of reads from the disk is high (more than 100/sec) then the key buffer may be too small. Increase the key_buffer_size variable Vq'The number of physical reads of a 'key block' from disk, ie, key cache missesoKey_reads pfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Key_reads; }B{The number of physical reads of a 'key block' from diskPrfunction() { // warn if more than 100/sec if(SafeDiv0(MONyog.MySQL.GlobalStatus.Key_reads,MONyog.MySQL.GlobalStatus.Uptime) > 100) return "Warning"; else return "None"; }(sM MONyog.MySQL.GlobalStatus.Uptimet7 NumCounterWithSeconds aDuTuning cache size is not an exact science. The method which proved most useful over the years is the ubiquitous 'trial-and-error'. Here's what you should do:

    • Chart the number of cache misses over time (you can use either 'Dashboard' or 'History/Trends' for this step)
    • Increase the cache size by a small amount (say, 10K bytes) and observe the new trend in cache miss rate
    • Repeat till cache miss rate stabilizes (ie, increasing cache size further produces no significant change in the graph) or reaches the value you wanted to achieve
    )vO 1-(Key_reads / Key_read_requests)sY function x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var cachehitratemyisam = CacheHitRatioMyISAM(MONyog.MySQL.GlobalStatus.Key_reads, MONyog.MySQL.GlobalStatus.Key_read_requests, MONyog.MySQL.Custom.Available); if(typeof cachehitratemyisam == "undefined") return "(n/a)" return cachehitratemyisam + "%"; } 344@MSao}{xq MyISAM tries to store all index pages in MyISAM key buffer pool. The cache hit ratio indicates the number of times MySQL was able to read the requested key block from memory instead of disk. You should try to bring this value close to 99.99%. 95 z 85{ function() { var value = CachePercentUsed(); if(MONyog.MySQL.GlobalStatus.Key_read_requests>1000 && parseInt(value)>80) { return G w function x() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Key_reads) == "undefined" || typeof(MONyog.MySQL.GlobalStatus.Key_read_requests) == "undefined") return "(n/a)"; var cachehitratemyisam = CacheHitRatioMyISAM(MONyog.MySQL.GlobalStatus.Key_reads, MONyog.MySQL.GlobalStatus.Key_read_requests, MONyog.MySQL.Custom.Available); if(typeof(cachehitratemyisam) == "undefined") return "(n/a)" return cachehitratemyisam + "%"; } \\Gr7xr# function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Key_write_requests; }P The number of requests to write a 'key block' into the MySIAM Key cache(M MONyog.MySQL.GlobalStatus.Uptime7 NumCounterWithSeconds! Key_writes  function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Key_writes; }> y The number of physical writes of a 'key block' to disk( M MONyog.MySQL.GlobalStatus.Uptime 7 NumCounterWithSeconds' K Key_writes / Key_write_requests } function x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return KeyCachePercentOnDisk(); }8m This ratio is generally 1 in an OLTP environment  Yes(M MONyog.MySQL.GlobalStatus.Uptime+delay_key_write <h<[1function() { // check for "ALL" if(MONyog.MySQL.GlobalVariables.delay_key_write == "ON" || MONyog.MySQL.GlobalVariables.delay_key_write == 1) return "Warning"; else return "None"; }JThis variable controls when MyISAM key blocks are flushed to disk#function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalVariables.delay_key_write; } ;innodb_buffer_pool_sizeOThe setting can have values ALL|ON|OFF (ALL indicates that it will always be ON also for tables where it was not specified in table definiton). Setting it ON (or ALL) introduces a high risk of index corruption in the event of a server crash. Setting it OFF will force the server to update indexes for every INSERT/UPDATE/DELETE what reduces risk of index corruption significantly. However no matter the value of this setting you should CHECK TABLES (and REPAIR TABLEs if required) after a server crash. If a table REPAIR is required your database and applications may be rendered more or less useless in the REPAIR period. So though you may achieve a performance inprovement with the setting ON|ALL (as the server will then be able to use idle periods for index maintenance) we generally do not recommend ON|ALL for the reasons mentioned. e_9function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_buffer_pool_size = MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size; if(typeof(innodb_buffer_pool_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size); })InnoDB buffer pool caches both data and index pages. You can set this value to 70-80% of available memory for Innodb-only installations ^^5S!function() { if(this.Value == "(n/a)") return "None"; var innodb_buffer_pool_size = MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size; var Innodb_pages_read = MONyog.MySQL.GlobalStatus.Innodb_pages_read; // check if default values are present for innodb buffer size and this is a Innodb installation if(Innodb_pages_read > 0 && innodb_buffer_pool_size == 8388608) return "Warning"; else return "None"; }9If your InnoDB buffer pool size is set to the default value of 8M, which is not suitable for any amount of InnoDB data that is actively being queried.%GInnodb_buffer_pool_pages_free iiV'function() { if(MONyog.MySQL.Custom.Available != 1!function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_buffer_pool_size = MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size; var Innodb_buffer_pool_pages_total = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_pages_total; var Innodb_buffer_pool_pages_data = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_pages_data; var Innodb_buffer_pool_pages_free = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_pages_free if(typeof(innodb_buffer_pool_size) == "undefined" || typeof(Innodb_buffer_pool_pages_total) == "undefined" || typeof(Innodb_buffer_pool_pages_data) == "undefined" || typeof(Innodb_buffer_pool_pages_free) == "undefined" ) return "(n/a)"; var page_size = innodb_buffer_pool_size/Innodb_buffer_pool_pages_total; var free = Innodb_buffer_pool_pages_free; if(Innodb_buffer_pool_pages_data>0) return NumCounter(free*page_size); else return "(n/a)"; return ""; }  =The number of free pages%Efunction() { if(this.Value == "(n/a)") return "None"; var v = MONyog.MySQL.GlobalVariables; var s = MONyog.MySQL.GlobalStatus; if (ToInt(this.Value) == 0 || s.Innodb_buffer_pool_pages_data>0) return "None"; // warn if more than 1GB free or more than 50% free for non-trivial cache size ( >= 100 MB) if(ToInt(this.Value) > 1073741824 || (v.innodb_buffer_pool_size >= 104857600 && SafeDiv0(v.innodb_buffer_pool_size, this.Value) > .5)) return "Warning"; else return "None"; } Yesk!QIf the free memory is a) more than 1GB or b) more than 50% of the buffer pool size, and the buffer pool is non-trivial (say, 100MB) then the buffer pool may be too big. You can reclaim some memory by reducing the buffer size.("MInnodb_buffer_pool_read_requests ^W#)function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_buffer_pool_read_requests = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_read_requests; if(typeof(Innodb_buffer_pool_read_requests) == "undefined") return "(n/a)"; return Innodb_buffer_pool_read_requests; }2$aThe number of read requests from the Cache(%M MONyog.MySQL.GlobalStatus.Uptime&7 NumCounterWithSeconds{'qIf the number of reads from the disk is high (more than 100/sec) then the buffer may be too small. Increase the innodb_buffer_pool_size variable You can set this value to 70-80% of available memory for InnoDB-only installations. (=Innodb_buffer_pool_reads L *5@KValw'2=HS^it$/:EP[fq|   r   q   p   o   n                             F   G   H                                                                                                                                   J+%function() { if(this.Value == "(n/a)") return "None"; // warn if more than 100/sec if(SafeDiv0(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_reads,MONyog.MySQL.GlobalStatus.Uptime) > 100) return "Warning"; else return "None"; }-7 NumCounterWithSeconds(,M MONyog.MySQL.GlobalStatus.UptimeL*The number of physical reads of a block from disk, ie, cache misses(;)qfunction() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_buffer_pool_reads = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_reads; if(typeof(Innodb_buffer_pool_reads) == "undefined") return "(n/a)"; return Innodb_buffer_pool_reads; }  3

    Tuning cache size is not an exact science. The method which proved most useful over the yeD.Tuning cache size is not an exact science. The method which proved most useful over the years is the ubiquitous 'trial-and-error'. Here's what you should do:

    • Chart the number of cache misses over time (you can use either 'Dashboard' or 'History/Trends' for this step)
    • Increase the cache size by a small amount (say, 10K bytes) and observe the new trend in cache miss rate
    • Repeat till cache miss rate stabilizes (ie, increasing cache size further produces no significant change in the graph) or reaches the value you wanted to achieve
    ## 0function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_buffer_pool_reads = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_reads; var Innodb_buffer_pool_read_requests = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_read_requests; if(typeof(Innodb_buffer_pool_reads) == "undefined" || typeof(Innodb_buffer_pool_read_requests) == "undefined") { return "(n/a)"; } return CacheHitRatioInnodb(Innodb_buffer_pool_reads, Innodb_buffer_pool_read_requests, MONyog.MySQL.Custom.Available) + "%"; }J/1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) }m

    Unlike the MyISAMj1OUnlike the MyISAM Key Cache, the InnoDB buffer pool caches both data and index pages. The cache hit ratio represents the proportion of data and index pages that are being read from cache in memory instead of from disk. Reading from the memory is many times faster than reading from the disk and therefore a DBA should strive to keep physical I/O to a minimum. When using InnoDB, most data access should occur in RAM, and therefore the InnoDB buffer cache hit ratio should be high. 295 385 $2@Nyu4efunction() { if(this.Value == "(n/a)") return "None"; if(CacheHitRatioInnodb(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_reads, MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_read_requests, MONyog.MySQL.Custom.Available) > 0) return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); return "None"; } 5Yes 6 Yes 7 Yes(8M MONyog.MySQL.GlobalStatus.Uptime79iTuning cache size is not an easy task. Cache hit ratio is not a metric you should use to tune cache size. Instead check Cache misses and follow the advise there. Remember you need to wait till the server is running for a reasonable warm-up time before you get a meaningful cache hit rate.I: Innodb_buffer_pool_wait_free / Innodb_buffer_pool_write_requests nDD'CK innodb_additional_mem_pool_size( D function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_additional_mem_pool_size = MONyog.MySQL.GlobalVariables.innodb_additional_mem_pool_size; if(typeof(innodb_additional_mem_pool_size) == "undefined" ) return "(n/a)"; if(ToInt(MONyog.MySQL.GlobalVariables.innodb_additional_mem_pool_size)>0) result = NumCounter(MONyog.MySQL.GlobalVariables.innodb_additional_mem_pool_size); else result = "(n/a)"; return result; }XE+ This pool is used to store InnoDB data dictionary and other internal structures{Fq function() { if(this.Value == "(n/a)") return "None"; // should not be more than 20MB if(MONyog.MySQL.GlobalVariables.innodb_additional_mem_pool_size > 20971520) return "Warning"; else return "None"; } *K1 function() { if(this.Value == "(n/a)") return "None"; // should not be more than 20MB if(SafeDiv0(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_wait_free, MONyog.MySQL.GlobalStatus.Uptime) > 1) return "Warning"; else return "None"; } ]J5 This total number of waits for pages to be flushed first from the InnoDB buffer pool(bI? function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_buffer_pool_wait_free = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_wait_free; if(typeof(Innodb_buffer_pool_wait_free) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_wait_free; }$HE Innodb_buffer_pool_wait_freeFG Setting this variable to more than 20MB is usually a mistake. L@3V+ Latest_deadlock U No T 11S] As an immediate solution, you can try and restart the victim transactions. Use the information on the deadlocks provided here to fine-tune your application to prevent them from occurring again. The following are general guidelines to avoid deadlocks:

    1. Commit your transactions often as smaller transactions are less likely to be caught in a deadlock.
    2. Access your tables and rows in a fixed order.
    3. Avoid use of locks as much as you can.
    4. While using locks, use a higher level of isolation, such as READ COMMITTED.
    R YesnQW function() { if(this.Value == "Yes") return "Critical"; else return "None"; } ::FW function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.InnodbStatus.Latest_deadlock) == "undefined" || MONyog.MySQL.InnodbStatus.Latest_deadlock == "") return "(n/a)"; return MONyog.MySQL.InnodbStatus.Latest_deadlock; }6Xg The InnoDB Engine employs row-level locking mechanisms to handle multiple simultaneous transactions. For instance, if a row were to be updated at the same time that a SELECT statement was retrieving it, the output of the SELECT statement would be inconsistent. InnoDB's locking mechanism prevents such inconsistencies from creeping in but is susceptible to deadlocks. Deadlocks occur when two or more transactions wait on the other to complete before executing, thereby entering an infinitely long cycle. InnoDB can instantly identify and break deadlocks, at the cost of rolling back one or more transactions (the victims). If deadlocks occur frequently, it should be cause for worry. 0Y[ As an immediate solution, you can try and restart the victim transactions. Use the information on the deadlocks provided here to fine-tune your application to prevent them from occurring again. The following are general guidelines to avoid deadlocks:
    1. Commit your transactions often as smaller transactions are less likely to be caught in a deadlock.
    2. Access your tables and rows in a fixed order.
    3. Avoid use of locks as much as you can.
    4. While using locks, use a higher level of isolation, such as READ COMMITTED.
    Z9 innodb_log_buffer_sizesmmrw| &,2>8DJPV\bhntz "(.4:@FLRX^djpv| !"##%'$+%-&1'3(6);*@+E,J-P.U1[2`3d4h5ko6ruy7|8 ;%9!3<9=B>H?Q@SYAiBqC~EF GHIJ"K(L+M.N1O3P;RCSKTSUYadgVmXrYvZ{[\]^_`a#b*d.e9g=hHiLkalmptqrtuvw$x)z*{0|3}=~DLQV]angjnt} p`2lrx~f &,28>DJPV\bhntz "(.4:@FLRX^djpv|`' x&1:GNRUY_cnvt"(-.03:?BFKcOdPVXZ]`jneqƇELJKȇTɇ]ʇhˇṗs͇x·zЈш҈ ӈԈՈ"ֈ+׈0؈28:وAۈF܈J݈OވQ߈U04@ENY]jq $&%&(+)2*<,A-I;J/P  ^[7 function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_log_buffer_size = MONyog.MySQL.GlobalVariables.innodb_log_buffer_size; if(typeof(innodb_log_buffer_size) == "undefined" ) return "(n/a)"; if(ToInt(MONyog.MySQL.GlobalVariables.innodb_log_buffer_size)>0) result = NumCounter(MONyog.MySQL.GlobalVariables.innodb_log_buffer_size); else result = "(n/a)"; return result; }}\u InnoDB uses this buffer to write to the log files on disk. It is flushed every second. Recommended value is 8MB-16MBt]c function() { if(this.Value == "(n/a)") return "None"; // should not be more than 8MB if(MONyog.MySQL.GlobalVariables.innodb_log_buffer_size > 8388608) return "Warning"; else return "None"; } (^K This variable generally does not need to be set larger than 4MB, except for workloads which have a lot of very large transactions (such as transactions involving many large BLOB or TEXT values). In these cases it may need to be set between 8 MB-128 MB, but generally no larger than this.,_U Innodb_log_waits / Innodb_log_writes1g`I function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_log_waits = MONyog.MySQL.GlobalStatus.Innodb_log_waits; var Innodb_log_writes = MONyog.MySQL.GlobalStatus.Innodb_log_writes; if(typeof(Innodb_log_waits ) == "undefined" || typeof(Innodb_log_writes ) == "undefined") { return "(n/a)"; } var val = InnoDBLogPercentOnDisk(Innodb_log_waits, Innodb_log_writes); return val + "%"; } :::HVdxak To achieve the best performance, Innodb should not have to wait before writing pages into the Innodb Log buffer b 0.01 c 0.1edE function() { return GetWarnStatusFloat(this.Value, this.Critical, this.Warning, true); } e  Yes f  Yes g  Avgh If Innodb is waiting too much to write to the log buffer, increase the innodb_log_buffer_size configuration variableliS function x() { var disk = ToInt(MONyog.MySQL.GlobalStatus.Innodb_log_waits); var total = ToInt(MONyog.MySQL.GlobalStatus.Innodb_log_writes); var hit = SafeDiv0(disk,total)*100; return hit.toFixed(2); }!j? innodb_log_files_in_group G* 5@KValw'2=HS^it$/:EP[fq|  %                                                                  I   J   K   L                                                      yMk function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_log_files_in_group = MONyog.MySQL.GlobalVariables.innodb_log_files_in_group; if(typeof(innodb_log_files_in_group) == "undefined") return "(n/a)"; return NumCounter(innodb_log_files_in_group); }_l9 Number of log files in the log group. InnoDB writes to the files in a circular fashionm5 innodb_log_file_size(5ne function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_log_file_size = MONyog.MySQL.GlobalVariables.innodb_log_file_size; if(typeof(innodb_log_file_size) == "undefined") return "(n/a)"; return NumCounter(innodb_log_file_size); } >>y^MHv3 function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var val = MONyog.MySQL.GlobalVariables.innodb_flush_log_at_trx_commit; if(typeof(val) == "undefined") return "(n/a)"; var result; if(val == 1) result = "1 - To disk on each transaction commit"; else if(val == 2) result = "2 - To OS cache on each transaction commit.
    To disk every second"; else if(val == 0) result = "0 - To OS and disk every second"; return result; }x- Innodb_log_waitsw The default value of '1 - To disk on each transaction commit.' is extremely expensive. Your applications can get incredible performance boost if you change the value to '2 - To OS cache on each transaction commit. To disk every second.'

    However you might lose 1 second of update in the event of an OS crash, which should be acceptable for most applications nN{ function() { if(this.Value == "(n/a)") return "None"; // should not be more than 20MB if(SafeDiv0(MONyog.MySQL.GlobalStatus.Innodb_log_waits, MONyog.MySQL.GlobalStatus.Uptime) > 1) return "Warning"; else return "None"; }]~5 ((innodb_log_file_size * innodb_log_files_in_group) / innodb_buffer_pool_size) * 100P} If this variable grows by more than 1/sec, the log buffer is too small.|7  NumCounterWithSecondsNz This total number of waits required for a free page in the log buffer(y% function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_log_waits = MONyog.MySQL.GlobalStatus.Innodb_log_waits; if(typeof(Innodb_log_waits) == "undefined") return "(n/a)" return Innodb_log_waits; } ~R function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_log_file_size = MONyog.MySQL.GlobalVariables.innodb_log_file_size; var innodb_log_files_in_group = MONyog.MySQL.GlobalVariables.innodb_log_files_in_group; if(typeof(innodb_log_file_size) == "undefined" || typeof(innodb_log_files_in_group) == "undefined") return "(n/a)"; var val = innodb_log_file_size * innodb_log_files_in_group * 100; val = SafeDiv0(val, MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size); return val.toFixed(2) + "%"; }! Optimally, the InnoDB redo logs should approximately be greater than or equal to 50% of the size of the InnoDB buffer pool, depending on its size. This avoids unnecessary checkpoints and reduces the overall physical I/O of MySQL, which can slow I/O-intensive systems   Yes ^7 function() { if(this.Value == "(n/a)") return "None"; var val = MONyog.MySQL.GlobalVariables.innodb_log_file_size * MONyog.MySQL.GlobalVariables.innodb_log_files_in_group; if(val >= MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size / 2 && val <= 1073741824) return "None"; else return "Warning"; }  Yes  Yes nn66O The maximum number of .ibd files that InnoDB can keep open at one timer_ Increase the size of your InnoDB redo logs. Note, however, that larger redo logs can mean increased crash recovery times, and more intense checkpointing periods, as more data must be flushed from the buffer pool and logs to the tablespace datafiles. With this in mind, the maximum recommended size is 1GB per log file.
    To change the size of your log files, make a clean shutdown of MySQL, alter the value of innodb_log_file_size accordingly within your my.cnf/my.ini file, move the current ib_logfile from the data directory to another location, and restart MySQL so the new log files can be creatd automatically./ innodb_open_files <tc function() { if(this.Value == "(n/a)") return "None"; var per_table = MONyog.MySQL.GlobalVariables.innodb_file_per_table; if((per_table == "ON" || per_table == 1) && parseInt(MONyog.MySQL.GlobalStatus.Open_tables) > parseInt(MONyog.MySQL.GlobalVariables.innodb_open_files)) return "Warning"; else return "None"; }O The maximum number of .ibd files that InnoDB can keep open at one timeo+y function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var val = MONyog.MySQL.GlobalVariables.innodb_open_files; if(typeof(val) == "undefined"){ return "(n/a)"; } return val; } TTw i function() { if(this.Value =="(n/a)") return "None"; var checksums = MONyog.MySQL.GlobalVariables.innodb_checksums; if(checksums != "ON" && checksums != 1 ) return "Critical"; else return "None"; }a = Use checksum validation on all pages read from the disk to ensure extra fault tolerance?rb6 g function() { if(MONyog.MySQL.Custom.Available != 1 || (!IsInnodb())) return "(n/a)"; var innodb_checksums = MONyog.MySQL.GlobalVariables.innodb_checksums; if(typeof(innodb_checksums) != "undefined"){ return innodb_checksums; }else { return "(n/a)"; } } t } This variable controls how InnoDB checks pages for corruption. It should not be disabled for the vast majority of cases.1 innodb_doublewrite{ function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var val = MONyog.MySQL.GlobalVariables.innodb_doublewrite; if(typeof(val) != "undefined") return val; else return "(n/a)"; }tc This variable controls whether InnoDB should perform doublewrites to guard against partially written pages.p[ function() { if(this.Value == "(n/a)") return "None"; var dwrite = MONyog.MySQL.GlobalVariables.innodb_doublewrite; if(dwrite != "ON" && dwrite != 1) return "Critical"; else return "None"; } jjZ/ It should not be disabled unless your filesystem already perform such safeguards.7 innodb_data_file_path>w function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var value = MONyog.MySQL.GlobalVariables.innodb_data_file_path; if(typeof(value) == "undefined") return "(n/a)"; if(value.search("autoextend")!= -1) return "Yes"; return "No"; } IIP InnoDB keeps its data in a tablespace, which is essentially a virtual filesystem spanning one or many files on disk. InnoDB concatenates the files end-to-end.
    You will encounter out-of-space errors besides other problems in your application if the tablespace is not allowed to expand automatically to meet the data demands.`; function() { if(this.Value == "No") return "Warning"; return "None"; } X%X ; function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; if(typeof(MONyog.MySQL.GlobalVariables.innodb_locks_unsafe_for_binlog) == "undefined") return "(n/a)"; if((MONyog.MySQL.GlobalVariables.log_bin != "OFF" ) && (MONyog.MySQL.GlobalVariables.innodb_locks_unsafe_for_binlog != "OFF")) return "Yes"; else return "No"; }&I innodb_locks_unsafe_for_binlogW) To allow the tablespace to grow if it runs out of space, you can change your configuration file to include the keyword autoextend in innodb_data_file_path.
    For example:
    innodb_data_file_path=ibdata1:10M:autoextend
    Reclaiming disk space from a single InnoDB tablespace can be difficult with a single tablespace. Consider to use the innodb_file_per_table option if you use -autoextend with innnodb_data_file_path
    I\-8 k Although disabling next-key locking may improve performance in some situations, in recovery and replication situations, this may lead to phantom errors creeping into the data.a!= function() { if(this.Value == "Yes") return "Warning"; return "None"; }j"O Ensure that innodb_locks_unsafe_for_binlog=0 in your configuration file and restart MySQL.#/ innodb_support_xaV]$5 function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_support_xa = MONyog.MySQL.GlobalVariables.innodb_support_xa; if(typeof(innodb_support_xa) == "undefined") return "(n/a)"; if(innodb_support_xa != "OFF") return "Yes"; else return "No"; } XX`&; function() { if(this.Value == "Yes") return "Warning"; return "None"; }' Ensure Innodb_support_xa = 1 (The server default value) in your config file if binary logging is enabled - this would ensure proper syncing of binary logs to the disk. Set Innodb_support_xa = 0 if binary logging is disabled on your server.(/ thread_cache_size)1 function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(ToInt(MONyog.MySQL.GlobalVariables.thread_cache_size) > 0) return NumCounter(MONyog.MySQL.GlobalVariables.thread_cache_size); else return "0 (No threads in cache)"; } 55iwZw,i This variable controls the size of the thread cache, in units of threads cached. You should set it large enough that Threads_created does not increase, if possible. The ideal setting is the difference between the typical minimum and maximum number of threads connected at a time. For example, if Threads_connected varies from 75 to 100, set thread_cache_size to 25.-) Threads_cached.3 function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Threads_cached); } /  Avg10_ The number of threads in the thread cache1+ Threads_created2 function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Threads_created; }x3k The number of threads created to handle connections. A high number indicates insufficient size for thread cache(4M  MONyog.MySQL.GlobalStatus.Uptime G *5@KValw'2=HS^it$/:EP[fq| 8 9 : ;  <  =  > ? F G H I J K L  M  N  O P Q R S T U                                                               | 44Tt57  NumCounterWithSeconds%6G 1-Threads_created/Connectionsl7S function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalVariables.thread_cache_size <= 0) return "0.0%"; var created = MONyog.MySQL.GlobalStatus.Threads_created; var conns = MONyog.MySQL.GlobalStatus.Connections; var miss; if(parseInt(created) > parseInt(conns)) { miss = 100; } else { miss =(1-SafeDiv0(created,conns))*100; } return miss.toFixed(1)+"%"; } 8 This fraction gives an indication of thread cache hit rate. If the value is low, you should consider increasing the thread cache 9 93 : 907;i function() { if(MONyog.MySQL.GlobalVariables.thread_cache_size > 0) return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); return "None"; } < Yes =  Yes >  Yes DDo$?Ig(?M  MONyog.MySQL.GlobalStatus.Uptime1@] Thread cache size may not be optimal. Set your thread_cache_size variable high enough that the Threads_created (Threads created to handle connections) value stops increasing dynamically.

    Once the value of Threads_created stabilizes, edit my.ini/my.cnf to apply the change permanently.

    Remember you need to wait till the server has been up for a reasonable warm-up time before you get a meaningful cache hit rate.A- slow_launch_time B; function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalVariables.slow_launch_time); }cCA If creating a thread takes longer than this time, the thread creation is considered 'Slow'D3 Slow_launch_threadsE% function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Slow_launch_threads; } IV+ lVI K function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(!MONyog.MySQL.GlobalVariables.table_cache) MONyog.MySQL.GlobalVariables.table_cache = MONyog.MySQL.GlobalVariables.table_open_cache; if(MONyog.MySQL.GlobalVariables.table_cache) return NumCounter(MONyog.MySQL.GlobalVariables.table_cache); else if(MONyog.MySQL.GlobalVariables.table_open_cache) return (MONyog.MySQL.GlobalVariables.table_open_cache); else return "Undefined"; }J# table_cacheI1 Tune your queries to use indexes. Also, avoid queries returning large result sets.

    You can also try increasing the value of thread_cacheH7  NumCounterWithSeconds(GM  MONyog.MySQL.GlobalStatus.Uptime&FG If too many threads are taking a long time to launch, it indicates a general system overload. General system overload happens because of non-optimal queries. hchM- function() { // should not be 0 if(this.Value != "(n/a)" && this.Value == 0) return "Warning"; else return "None"; }T function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Opened_tables; }S' Opened_tables R  Avg5Qg The number of tables that are currently open.P- function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Open_tables); }O# Open_tables6Ng This variable controls the size of the table cache, in units of tables cached. You should set it large enough that Opened_tables does not increase very quickly, if possible.L- Each time MySQL accesses a table, it places it in the table cache. If your system accesses many tables, it is faster to have these in the cache. 1PZ/1T0Y[ If the number of table cache misses is high (typically, more than 10 per second), increase the value of the table_cache variable within your my.cnf/my.ini file.(]M  MONyog.MySQL.GlobalStatus.UptimeA\ The number of times table locks was acquired immediately.[) function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Table_locks_immediate; }Z7 Table_locks_immediateX7  NumCounterWithSeconds(WM  MONyog.MySQL.GlobalStatus.UptimerV_ function() { // warn if more than 40% of all Qeustions and Admin commands if(SafeDiv0(MONyog.MySQL.GlobalStatus.Opened_tables,MONyog.MySQL.GlobalStatus.Uptime) > 10) return "Warning"; else return "None"; },US The number of open table requests that were not served by the table cache. If the number is high or increases rapidly, you should increase the size of table cache. \+F\1e] function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var val = SafeDiv0(MONyog.MySQL.GlobalStatus.Table_locks_waited,ToInt(MONyog.MySQL.GlobalStatus.Table_locks_waited)+ToInt(MONyog.MySQL.GlobalStatus.Table_locks_immediate)) ; return val.toFixed(2) * 100 + "%"; } h 60 g 30f) Performance can be degraded if the percentage of table operations that have to wait for a lock is high compared to the overall number of locksJd Table_locks_waited / (Table_locks_waited + Table_locks_immediate)c7  NumCounterWithSeconds(bM  MONyog.MySQL.GlobalStatus.UptimeJa The number of times wait was required before getting a table lock`# function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Table_locks_waited; }_1 Table_locks_waited^7  NumCounterWithSeconds \~pE\*4Tn# If table lock contention is excessive, check that no sessions are using the LOCK TABLES statement unnecessarily. Make sure that queries are tuned to use indexes. Execute SHOW FULL PROCESSLIST of find queries that are getting locked continuously. Try isolating long running queries by enabling the slow query log.

    If your tables use the MyISAM storage engine, they could be candidates for migration to a row-level locking storage engines like InnoDB.rp_function x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var type = MONyog.MySQL.GlobalVariables.have_query_cache; if(type=="ON" || type=="YES") return "Yes"; else return "No"; }o-have_query_cache(mM  MONyog.MySQL.GlobalStatus.Uptime l  Yes k  Yes j YesciA function() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } )D)s-query_cache_typeFrTo make sure MySQL uses the query cache, there are a few variables you need to set in the configuration file (my.cnf/my.ini).
    First, is the query_cache_type. There are three possible settings:
      0 (for off, do not use)
      1 (for on, cache queries)
      2 (on demand, discussed more below)
    To ensure it is always on, place: query_cache_type = 1 in the configuration file.

    If your application frequently sends queries that are repetitive in nature, you can set the size of the query cache as high as 25% of the available RAM for optimal performance. Use the system variable query_cache_size to set the size of the query cache.nqWIn a situation where the database has to repeatedly run the same queries on the same data set, returning the same results each time, MySQL can cache the result set, avoiding the overhead of running through the data over and over. {tqfunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var type = MONyog.MySQL.GlobalVariables.query_cache_type; if(type == 0 || type=="OFF") return "Off"; else if(type == 1 || type=="ON") return "Always"; else if(type == 2 || type=="DEMAND") return "Demand"; else return "Unknown Type"; },uSThe following can be used to determine the type of query cache

    'Off': The query cache has been disabled.
    'Always': All statements are cached except those that begin with 'SELECT SQL_NO_CACHE'.
    'Demand' Caching is done only for those statements that begin with 'SELECT SQL_CACHE'v-query_cache_sizexwkfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var size = MONyog.MySQL.GlobalVariables.query_cache_size; if(size > 0) return NumCounter(size); else return "(not configured)"; }#xCThe size of the query cache 77dyCfunction() { var type = MONyog.MySQL.GlobalVariables.query_cache_type; // warn if cache was turned on bu no buffer was allocated if(this.Value != "(n/a)" && (type == 1 || type == "ON" || type == 2 || type == "DEMAND") && MONyog.MySQL.GlobalVariables.query_cache_size == 0) return "Warning"; else return "None"; }[z1Enable the query cache by setting the query cache variables as follows within your my.cnf/my.ini file and restarting the server:

    query_cache_type = 1 (Large values are not recommended on multi-core machines. 256MB would be optimum)
    query_cache_limit = 1048576

    query_cache_limit should be around 1-2Mb generally to cache as many queries as possible. Experiment with different values of query_cache_size and query_cache_limit until you achieve optimum performance based on your application's use of queries and the amount of memory available on your system. N *5@KValw'2=HS^it$/:EP[fq|     P   O   N   M  :  , - . / 0 1 3 2 4 5 6 7 8 : ;  9 < ? A @  =  > B C E L H I J  F  G  D      K   $   %   &   (  5   '   *   +   ,   .   -                               6%{/query_cache_limitk|Qfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.query_cache_limit) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.query_cache_limit); }}+The maximum size of an individual query results that can be cached. This should be around 1-2Mb generally to cache as many queries as possible.~1Qcache_free_memorygIfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_free_memory) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Qcache_free_memory); }4eThe amount of free memory in the query cache ) nWfunction() { // check if more than 50% free and it free size is more than 8MB if(MONyog.MySQL.GlobalStatus.Qcache_queries_in_cache > 100 && (SafeDiv0(MONyog.MySQL.GlobalStatus.Qcache_free_memory/MONyog.MySQL.GlobalVariables.query_cache_size) > .5) && this.Value > 8388608) return "Warning"; else return "none"; }oYfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.query_prealloc_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.query_prealloc_size); }3query_prealloc_size7iIf your Query Cache has more than 50% free memory and the free memory is more than 8MB, it is too large. You can reclaim some memory by decreasing the size of the Query Cache  Avg Yes L), 3 Qcache_total_blocksF The query cache allocates memory in blocks for storing cached data. This value indicates the size of each block. If your queries have large result sets, you can get better performance with a larger block size. However, if you have lot of queries with small results, a large block size may lead to memory fragmentationy mfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.query_cache_min_res_unit) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.query_cache_min_res_unit); } =query_cache_min_res_unit0[This is a persistent buffer used by MySQL for query parsing and execution. If you have lots of complex queries, you might get better performance by increasing the size =z=:q Qcache_free_blocks / ceil(Qcache_total_blocks / 2)  Avg:q The total number of free blocks in the query cachegI function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_free_blocks) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Qcache_free_blocks); }1 Qcache_free_blocks  Avg5 g The total number of blocks in the query cachei M function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_total_blocks) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Qcache_total_blocks); } wtfXJ< function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_free_blocks) == "undefined" || typeof(MONyog.MySQL.GlobalStatus.Qcache_total_blocks) == "undefined") return "(n/a)"; return (SafeDiv0(MONyog.MySQL.GlobalStatus.Qcache_free_blocks,Math.ceil(MONyog.MySQL.GlobalStatus.Qcache_total_blocks/2))*100).toFixed(2)+ "%"; }  Avg  Yes  Yes  Yesy function() { if(MONyog.MySQL.GlobalStatus.Qcache_total_blocks >= 300 && MONyog.MySQL.GlobalStatus.Qcache_queries_in_cache > 100) return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); else return "none"; }  70ym The query cache allocates a block on demand. This value indicates the extent of fragmentation in the query cache //{kQ The fragmentation is high. This may occur if you have a lot of queries returning small result sets.

    Please consider the following options.
    1) Decrease the query_cache_min_res_unit
    2) Issue (may be periodically) FLUSH QUERY CACHE to defragment the Query Cache.
    3) Add SQL_NO_CACHE to queries you know will not be beneficial to cache.Y"-function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_not_cached) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Qcache_not_cached; }!/Qcache_not_cached  AvgA The number of queries currently stored in the Query Cacheq] function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_queries_in_cache) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalStatus.Qcache_queries_in_cache); }; Qcache_queries_in_cache DD(Ha8s&J-The number of queries that served successfully by the query cacheM,function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_hits) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Qcache_hits; }5#eThe number of queries that cannot be cached. Prepared statements and queries containing user variables, UDFs or queries accessing the MySQL system database cannot be cached($M MONyog.MySQL.GlobalStatus.Uptime%7 NumCounterWithSeconds&)Qcache_insertsS'!function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_inserts) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Qcache_inserts; }d(CThe number of queries that were inserted into the query cache; translates into cache misses()M MONyog.MySQL.GlobalStatus.Uptime*7 NumCounterWithSeconds+#Qcache_hits SS$q_39function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_lowmem_prunes) == "undefined") return "(n/a)"; M,function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_hits) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Qcache_hits; }J-The number of queries that served successfully by the query cache@.{function() { if(MONyog.MySQL.GlobalStatus.Qcache_total_blocks >= 300 && MONyog.MySQL.GlobalStatus.Qcache_queries_in_cache > 100 && SafeDiv0(MONyog.MySQL.GlobalStatus.Qcache_hits / MONyog.MySQL.GlobalStatus.Qcache_inserts) < .5) return "Warning"; else return "none"; }(/M MONyog.MySQL.GlobalStatus.Uptime07 NumCounterWithSeconds 4`uh(5M MONyog.MySQL.GlobalStatus.Uptime :50g9IThis shows the rate of queries pruned (removed from the cache because of low memory) A1}If more than 50% of the queries are being inserted but never hit, there are some queries that ought to have SQL_NO_CACHE added to them to prevent this work of storing and invalidating.25Qcache_lowmem_prunes ~Ss<A+function() { var cachehitratequery = CacheHitRatioQuery(MONyog.MySQL.GlobalStatus.Qcache_inserts, MONyog.MySQL.GlobalStatus.Qcache_hits, MONyog.MySQL.Custom.Available); if(cachehitratequery) { if(!isNaN(cachehitratequery)) return cachehitratequery + "%"; } return "(n/a)"; }4@eQcache_hits / (Qcache_inserts + Qcache_hits)\?3You should increase the query_cache_size system variable. Also consider using 'SELECT SQL_NO_CACHE...' for :
    1) Queries that are too big for the query cache
    2) Queries that are non-repetitive in nature.(>M MONyog.MySQL.GlobalStatus.Uptime = Yes < Yesc;Afunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } >KKValw'2=HS^it$/:EP[fq|                           !      "  %  &  #  $  '  *  +  )  (               o  p                        0F[(Handler_read_rnd_next + Handler_read_rnd) / (Handler_read_rnd_next + Handler_read_rnd + Handler_read_first + Handler_read_next + Handler_read_key + Handler_read_prev)(EM MONyog.MySQL.GlobalStatus.Uptime D Yes C Yes6BgThe Query Cache can speed up your applications dramatically in situations where the application has to repeatedly run the same queries on the same data set, returning the same results each time. You should try to increase the cache hit rate by increasing the query cache and checking the improvements. 9 J40 I20]H5This value indicates the percentage of rows that were accessed via full table scans.CGfunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var tablescans = 0; var nonkeyread = ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next)+ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd); var allread = ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next)+ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd)+ToInt(MONyog.MySQL.GlobalStatus.Handler_read_first)+ ToInt(MONyog.MySQL.GlobalStatus.Handler_read_next)+ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key)+ToInt(MONyog.MySQL.GlobalStatus.Handler_read_prev); if(nonkeyread && allread) tablescans = SafeDiv0(nonkeyread, allread)*100; return tablescans.toFixed(1)+"%"; } / (OM MONyog.MySQL.GlobalStatus.Uptime N Yes M Yes LYesMKfunction() { if(ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next) > 4000) return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); else return "None"; } P You should try to keep this value as low as possible. Try to isolate queries that are not using indexes. Once you have indentified the queries, create the appropriate indexes or rewrite the queries to use indexes. MySQL has a great feature - slow query log, which allows you to log all queries that took more than a specified amount of time to execute. The slow query log can be used to identify queries that takes a long time to complete. Enabling the slow query log is highly recommended as it allows you to record unoptimized queries. Enable the slow query log refer to http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html for more information on the slow query log.Q-read_buffer_size T-]-QUThis variable should not be set larger than 1MB for most purposes, and then only with benchmarks to prove that it helps. Making it too large can actually slow down queries. Instead of setting it to a large value globally, leave the global setting small, and set the local value larger for queries you know will benefit from itNTfunction() { // should not be more than 1MB if(this.Value != "(n/a)" && MONyog.MySQL.GlobalVariables.read_buffer_size > 1048576) return "Warning"; else return "None"; } 2S_This buffer is used for full table scans of MySQL tables. The recommended value is 1MB. This buffer is allocated per client, so be careful about not making it very largeiRMfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.read_buffer_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.read_buffer_size); } PPG ,function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Select_scan; }0-join_buffer_size/7 NumCounterWithSeconds(.M MONyog.MySQL.GlobalStatus.Uptime-9This value indicates the number to times a full table was read for a SELECT. A high value indicates your queries are not properly tuned to use indexes+#Select_scan O[O"4?This variable is set to a non-default size, which is usually not justified without benchmarks to support the non-default setting. Also, this variable should not be set larger than 4M globally, because it is allocated to its full size when needed. If you know that a certain query will benefit from a large setting, it is likely due to poorly optimized JOINs. You should rather optimize schemas and/or queries.A3}function() { // should not be more than the default 128K if(MONyog.MySQL.GlobalVariables.join_buffer_size > 131072) return "Warning"; else return "None"; }25This buffer is used for joins that don't use indexes. Such JOINs are bad. However you can decrease disk usage in such cases by increasing this value!1=function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.join_buffer_size); } 1Os8 1@9function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.tmp_table_size); }?)tmp_table_size>7 NumCounterWithSeconds(=M MONyog.MySQL.GlobalStatus.Uptime<9 Number of Joins that reevaluate index selection for each row in a join. If you have a high value here, you should optimize your queries to use indexes;# function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Select_range_check; }:1 Select_range_check97 NumCounterWithSeconds(8M MONyog.MySQL.GlobalStatus.Uptimeq7]Full table scans are bad. If you have a high value here, you should optimize your queries to use indexes6function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Select_full_join; }5-Select_full_join DbLDEfunction() { // should not be less than 32MB if(this.Value != "(n/a)" && ToInt(MONyog.MySQL.GlobalVariables.max_heap_table_size) < ToInt(MONyog.MySQL.GlobalVariables.tmp_table_size)) return "Warning"; else return "None"; }kDQThis value defines the maximum size of a MEMORY (storage-engine) table that is created explicitly.$CCfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.max_heap_table_size); }B3max_heap_table_size|AsThis value defines the maximum size of temporary tables created in memory. In fact, MySQL also uses another variable 'max_heap_table_size' and uses the lowest of these variables. Please note that this size defines the maximum size of an internal table that can be created in memory. If an internal table is larger than this size, it is converted to a MyISAM table on disk nQ~S3t HN The number of temporary tables created on disk. If this value is high, you should consider increasing the value of tmp_table_size and max_heap_table_size. MySQL uses the lowest of these variables to determine whether a temporary table can be created in memory. Excessive temporary tables on disk are bad for pM-function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Created_tmp_disk_tables; }L;Created_tmp_disk_tablesK7 NumCounterWithSeconds(JM MONyog.MySQL.GlobalStatus.Uptime8ImThe number of temporary tables created in memoryH#function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Created_tmp_tables; }G1Created_tmp_tablesFThis variable should be at least as large as tmp_table_size, and may need to be much larger if you use explicit Memory tables.erformance

    Temp tables are used for internal operations such as group by and distinct, some ORDER BY queries, UNION, and subqueries in the FROM clause (derived tables). They are created in-memory as Memory tables, and if they exceed min(tmp_table_size, max_heap_table_size) they are converted to an on-disk MyISAM table. The conversion is expensive.

    Temporary tables always go right to MyISAM if the query involves BLOB or TEXT columns, which can't be stored in Memory tables. Also, the size of the in-memory temporary table is influenced by the worst-case. Memory tables always use fixed-length columns, so VARCHAR(255) that holds 'y' or 'n' will take 255 characters per row regardless. This is a very good reason not to use larger columns than necessary. Also, if it's utf8, it's 255*3 because the worst-case has to be prepared for. This can make the in-memory temporary tables much larger than you'd think -- many times larger than the total size of the table that's being queried! 4~E^PB4 Y Yes X Yes WYescVAfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); } U75 T50[S1The percentage of temporary tables that got created on disk because of insufficient tmp_table_size or max_heap_table_size.
    MySQL creates temporary tables internally for executing various tasks. If the size of a temporary table exceeds tmp_table_size or max_heap_table_size, MySQL creates the temporary files in5Refunction x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var disk = ToInt(MONyog.MySQL.GlobalStatus.Created_tmp_disk_tables); var total = ToInt(MONyog.MySQL.GlobalStatus.Created_tmp_tables); var hit = SafeDiv0(disk,total)*100; return hit.toFixed(1) + "%"; }4QeCreated_tmp_disk_tables / Created_tmp_tablesP7 NumCounterWithSeconds(OM MONyog.MySQL.GlobalStatus.Uptime disk instead of memory.

    Temp tables are used for internal operations such as group by and distinct, some ORDER BY queries, UNION, and subqueries in the FROM clause (derived tables). They are created in-memory as Memory tables, and if they exceed min(tmp_table_size, max_heap_table_size) they are converted to an on-disk MyISAM table. The conversion is expensive.

    Temporary tables always go right to MyISAM if the query involves BLOB or TEXT columns, which can't be stored in Memory tables. Also, the size of the in-memory temporary table is influenced by the worst-case. Memory tables always use fixed-length columns, so VARCHAR(255) that holds 'y' or 'n' will take 255 characters per row regardless. This is a very good reason not to use larger columns than necessary. Also, if it's utf8, it's 255*3 because the worst-case has to be prepared for. This can make the in-memory temporary tables much larger than you'd think -- many times larger than the total size of the table that's being queried! "]?function () { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.sync_binlog) == "undefined") return "(n/a)"; var type = MONyog.MySQL.GlobalVariables.sync_binlog; if(type == 0) return "No"; else return "Yes"; }\#sync_binlogq[]If this value is high, you should consider increasing the value of tmp_table_size and max_heap_table_size. MySQL uses the lowest of these variables to determine whether a temporary table can be created in memory. Excessive temporary tables on disk are bad for performance.

    Temporary tables having TEXT or BLOBS are always placed in disk, so try to see if you can change TEXT or BLOBs to some other column types. Also, check that you're not being too generous with varchar(ZM MONyog.MySQL.GlobalStatus.Uptime 3 V9u@e}["Attempts", "Refused", "Terminated Abruptly", "Cached"]4gc[MONyog.MySQL.GlobalStatus.Connections, MONyog.MySQL.GlobalStatus.Aborted_connects, MONyog.MySQL.GlobalStatus.Aborted_clients, MONyog.MySQL.GlobalStatus.Threads_cached]Lj["MyISAM Key Cache", "InnoDB Cache", "Query Cache", "Thread Cache"]i%Cache Missesh%RealTimeLine(fM MONyog.MySQL.GlobalStatus.UptimeBd#Connections cOnOffb%RealTimeLine[a1[MONyog.MySQL.Custom.Available == 1?1:"", MONyog.MySQL.Custom.Available == 1?"":1]&`I["Available", "Not Available"]_1MySQL Availability&^GSynchronizing is the safest and well as the slowest choice because in the event of a crash you loose at most one statement or transaction from the binary log ) |jd^XRF@:4.(" vpL)('&%$#"!       &VPk[MONyog.MySQL.GlobalStatus.Key_reads, MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_reads, MONyog.MySQL.GlobalStatus.Qcache_inserts, MONyog.MySQL.GlobalStatus.Threads_created]l%RealTimeLine m Yesn!StatementsQ4oe["SELECTs", "INSERTs", "UPDATEs", "DELETEs"](pM MONyog.MySQL.GlobalStatus.Uptime$qC[ToInt(MONyog.MySQL.GlobalStatus.Com_select) + ConvertToInt(MONyog.MySQL.GlobalStatus.Qcache_hits), ToInt(MONyog.MySQL.GlobalStatus.Com_insert) + ToInt(MONyog.MySQL.GlobalStatus.Com_replace), ToInt(MONyog.MySQL.GlobalStatus.Com_update), ToInt(MONyog.MySQL.GlobalStatus.Com_delete)] vu[CheckForSystem() && MONyog.System.Custom.Available == 1?1:"", CheckForSystem() && MONyog.System.Custom.Available == 1?"":1].yY["Kernel", "User", "IO Wait", "Total"]r%RealTimeLines3System Availability&tI["Available", "Not Available"]`v%RealTimeLine wOnOffxCPU Usage/Hz [CheckForSystem()?GetCpuKernalPercentage(MONyog.System.Cpu.sys_cpu_user, MONyog.System.Cpu.sys_cpu_nice, MONyog.System.Cpu.sys_cpu_system, MONyog.System.Cpu.sys_cpu_idle, MON0{%RealTimeLine | Yes } Yes ~ 1  No Q'oTKB9x#,5>GPYbkt}]f0' (1:CLU^gpy 0'o9?%$"#           b ! !-/0 2 3 4 5 6789:;<=>@?ABCDE     function() { if(this.Value != "(n/a)" && typeof(MONyog.MySQL.InnodbStatus.Deadlock_detected) != "undefined" && MONyog.MySQL.InnodbStatus.Deadlock_detected == "Yes") return "Critical"; else return "None"; }]5Increase the binary log cache by changing the binlog_cache_size value.

    Try to decrease the number of transactions that go into a temporary file by tuning binlog_cache_size and observing this percentage.!? Uptime_since_flush_status+key_buffer_sizeq]function x() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var buffsize = MONyog.MySQL.GlobalVariables.key_buffer_size; if(buffsize > 4294967296) return "Yes"; else return "No"; } zYY/#mAfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.File_account_count; }BnDo not grant global privilegesl1File_account_count#mAfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.File_account_count; }BnDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.ofunction() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; } GG U>ZBsDo not grant global pBsDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.tfunction() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }iuMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

    If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user  yXB}Do not grant global privilB}Do not grant global prv;Shut_down_account_count(wKfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Shut_down_account_count; }BxDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.yfunction() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; } HH 8W1B}Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.~function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }iMIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

    If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user DD .RXSy  functioBDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }i MIf there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

    If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user 8W"$ function() { if(this.Value != "(n/a)" && this.Value > 1) B Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwisiM If there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

    If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user5 Delete_account_count%E function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Delete_account_count; } ff2t & Yes3System 2 Yes 1 Yes,0UCalculated from values at /proc/statW/)If CPU usage is high, use system tools (e.g. ps, top, vmstat, perfmon, etc.) to investigate how and why the CPU is overloaded, so you can determine the appropriate action to take to improve the situation..CPU Usage d-Cfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); }, function() { if(CheckForSystem()) return MONyog.System.General.uptime/1000; else return "(n/a)"; } +Yes *80 )70(System ' Yes  xZZ(wKB}Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the M3Alter_account_count$Cfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Alter_account_count; }BDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }  xWW$CBDo not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MyS 5 Update_account_count% E function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Update_account_count; }B  Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases.  function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; } DD 8WW% E function() { if(MONyog.MySQB Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases. function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }iM If there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

    If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user hh:RRB Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allow!? Lock_tables_account_count*O function() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Lock_tables_account_count; }B Do not grant global privileges unnecessarily. You should always restrict the number of accounts that have global server privileges. Global privileges should be allowed only for the MySQL root user, and possibly for other accounts used by people that you trust. Global privileges should otherwise not be granted because they allow users to perform operations that may be dangerous.Any global privilege is a privilege for ALL databases. ^AiM If there are users with unnecessary global privileges, you can remove them using the REVOKE statement. To revoke all global privileges, use the following SQL: REVOKE ALL ON *.* FROM "user_name"@" host_name"

    If you prefer GUI, you can use SQLyog. Go to Tools->User Manager->Edit User to remove the global privileges for a user function() { if(this.Value != "(n/a)" && this.Value > 1) return "Critical"; else return "None"; }")Available;qfunction() { if(CheckForSystem()) { if(MONyog.System.Custom.Available == 1) return "Yes"; return "No"; } return "(not configured)"; } , JU function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { if (MONyog.System.Swp.proc_swp_vmsize != -1) { return (MONyog.System.Swp.proc_swp_vmsize * 1024); } else { var ret = "Could not read PID file.
    "; if(MONyog.MySQL.Custom.Available == 1) ret += "Please add the SSH user to mysql group in Linux."; else ret += "MySQL is not available."; return ret; } } else { return "(n/a)"; } }Y! NumCounterX System W YesV Total amount of virtual memory used by MySQL. It includes all code, data and shared libraries plus pages that have been swapped out;Ts Value of 'VmSize' in /proc/<MySQL_PID>/status O'4O+`Qfunction() { if(typeof(MONyog.MySQL.GlobalStatus.Com_drop_user) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_drop_user; }oaYWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.(_M MONyog.MySQL.GlobalStatus.Uptime^'Com_drop_usero]YWhile it is normal to have frequent changes to the database schema during testing and development, you should be careful of frequent changes in the production server. Always make sure that such changes are authorized and required.\function () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_drop_table; }([M MONyog.MySQL.GlobalStatus.UptimeZ)Com_drop_table ~~X'\Ifunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Com_drop_table; }*^'Com_drop_user(_M MONyog.Myb9myisam_recover_optionsXc+function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.myisam_recover_options) == "undefined") return "(n/a)"; var val = MONyog.MySQL.GlobalVariables.myisam_recover_options; if(val == "OFF" || val == "DEFAULT" || val == "") return "No"; else return "Yes"; }d{This option enables automatic MyISAM crash recovery whenever a MyISAM table becomes corrupt for some reason. If this option is not set, then a table will be 'Marked as crashed' when it becomes corrupt and no operations can be performed against it V;3eaSetting BACKUP options will ensure that MySQL makes a backup of the MyISAM data file (.MYD) before attempting automatic repair in case a table has crashed. You may also use the FORCE option, but automatic repair may then cause loss of rows. For that reason don't use FORCE unless also using BACKUP.f+innodb_buffer_pool_size + key_buffer_size + max_connections * (sort_buffer_size + read_buffer_size + binlog_cache_size) + max_connections * 2MB g Avg -S^itH2='$/:EP[fq|                                                                        Yi  function() { if(CheckForSystem()) return MONyog.System.General.uptime/1000; else return "(n/a)"; } "4GB"$CSet key_buffer_size to a value less than or equal to 4 GB, or upgrade to MySQL version 5.0.52 or later if you are not running the server on Windows.oYfunction() { if(this.Value == "Yes") return "Critical"; else return "None"; } YeskQThe MyISAM storage engine employs a key cache to keep the most frequently accessed index blocks in memory. This minimizes disk I/O. However, prior to MySQL version 5.0.52 this key cache is limited in size to 4 GB, even on 64-bit operating systems. If set to a larger value, mysqld may crash when it tries to increase the actual buffer beyond 4 GB. MTVm3MO Q MpQuery parsing and execution bufferbd395818ad2f94c39a57763d375f48a08 # MFree memoryd8e39cf1e77fab90e3317ddd5b7159bfV _ MMax size of result set that can be cachedcb6ccbf2defeb8acac37edc86bdc6e4d7 ! M Cache size92e8361dfd193ca65c29485c030dd6b91  MType021b2ef3428292fafdc0712453c3252b4  MEnabled?e9d1ba5b594185b97f843b00fea64d49< + M XLock contentionb2637a99446791cb71e2353d79ad972a< + M pWait was needed829f738aedfdc32bcc105a8295df9fb5G A M Locks Acquired immediately7a87a3df2e87371b647e2f181cd07140!1 I E M Number of table cache misses4f692df974c51d21ff926e63ef465356B 7 M Tables currently open9bcc4b1b89eade9e2e87794682f60e67a~ w M Number of tables that can be cached (for all clients)bf5d2e3075f7aef745f984c18495712bG} A M XNo. of slow launch threads5db93853d1723312a2bae36772fa1a03 8X=w Time from which the data will be considered and shown;q function x() { if(MONyog.MySQL.GlobalStatus.Uptime_since_flush_status > 0) return TimeUnits(MONyog.MySQL.GlobalStatus.Uptime_since_flush_status); else return "(n/a)"; }Z/ Number of seconds the MySQL server has been running, after FLUSH STATUS execution9Is_mysql_db_accessible%Efunction () { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.Security.Is_mysql_db_accessible; } {Y;-function x() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_buffer_pool_wait_free = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_wait_free; var Innodb_buffer_pool_write_requests = MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_write_requests; if(typeof(Innodb_buffer_pool_wait_free) == "undefined" || typeof(Innodb_buffer_pool_write_requests) == "undefined") { return "(n/a)"; } var val = InnoDBCachePercentOnDisk(Innodb_buffer_pool_wait_free, Innodb_buffer_pool_write_requests); return val + "%"; }y<mTo achieve the best performance, InnoDB should not have to wait before writing pages into the InnoDB buffer pool =0.01 >0.1e?Efunction() { return GetWarnStatusFloat(this.Value, this.Critical, this.Warning, true); } @@N @ Avg AIf InnoDB is waiting too much, increase the size of the InnoDB buffer pool by increasing the value of innodb_buffer_pool_size B function x() { var disk = ToInt(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_wait_free); var total = ToInt(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_write_requests); var hit = SafeDiv0(disk,total)*100; return hit.toFixed(2); } RR5 ,\_39function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_lowmem_prunes) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.Qcache_lowmem_prunes; }(4KThis values indicates the number of queries that were inserted into the query cache, but subsequently got pruned (removed from the cache because of low memory)(5M MONyog.MySQL.GlobalStatus.Uptime67 NumCounterWithSeconds-7WQcache_lowmem_prunes / Qcache_inserts 8;function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.Qcache_lowmem_prunes) == "undefined" || typeof(MONyog.MySQL.GlobalStatus.Qcache_inserts) == "undefined") return "(n/a)"; var val = SafeDiv0(ToInt(MONyog.MySQL.GlobalStatus.Qcache_lowmem_prunes), ToInt(MONyog.MySQL.GlobalStatus.Qcache_inserts)) * 100; return (val.toFixed(2) + "%"); } g9IThis shows the rate of queries pruned (removed from the cache because of low memory) relative to the number of queries inserted to query cache. If this rate is high, you should increase the query_cache_size system variable :50 }RD6( Yes Yes Yes  Yes( M MONyog.MySQL.GlobalStatus.Uptime7 iTuning cache size is not an easy task. Cache hit ratio is not a metric you should use to tune cache size. Instead check Cache misses and follow the advise there. Remember you need to wait till the server is running for a reasonable warm-up time before you get a meaningful cache hit rate.D Tuning cache size is not an exact science. The method which proved most useful over the years is the ubiquitous 'trial-and-error'. Here's what you should do:

    Xo5 Disable the general query log by removing the log option from your configuration file, if your server is running in a production environment.p#Connections qfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Connections; }Zr/The total number of successful and failed connection attempts to the MySQL server(sM MONyog.MySQL.GlobalStatus.Uptimet7 NumCounterWithSeconds r _ This variable controls how many file handles InnoDB keeps open internally. If you have set innodb_file_per_table and Open_tables is larger than this, you should set it large enough to hold all tables in the table_cache. - innodb_checksums MH=^2S'5@KwlaVti|qf[PE:/$ *  G   H  I   J   Q   P   O   U   S   R  ! $ $ % % % % %  % % ! $  !   :   W 3    T   V  ! $ # # # # #           % % !   9  8  7  6  F  E  D  >  =  <  ;                nn)iMemoryRequiredpNumUsersvar ret=0; if(!MONyog.MySQL.GlobalVariables.key_buffer_size) MONyog.MySQL.GlobalVariables.key_buffer_size = 0; if(!MONyog.MySQL.GlobalVariables.sort_buffer_size) MONyog.MySQL.GlobalVariables.sort_buffer_size = 0; if(!MONyog.MySQL.GlobalVariables.read_buffer_size) MONyog.MySQL.GlobalVariables.read_buffer_size = 0; if(!MONyog.MySQL.GlobalVariables.binlog_cache_size) MONyog.MySQL.GlobalVariables.binlog_cache_size = 0; ret = ToInt(MONyog.MySQL.GlobalVariables.innodb_buffer_pool_size) + ToInt(MONyog.MySQL.GlobalVariables.key_buffer_size) + ToInt(pNumUsers) * (ToInt(MONyog.MySQL.GlobalVariables.sort_buffer_size) + ToInt(MONyog.MySQL.GlobalVariables.read_buffer_size) + ToInt(MONyog.MySQL.GlobalVariables.binlog_cache_size))+ ToInt(pNumUsers)*(2*1024*1024); return NumCounter(ret); %$#1!."!  f  = =function() { var obj = MONyog.UserObject('FullText_Index'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].Table_Name + '.' + obj[i].Column_Name; } if (results.length == 0) results = '(n/a)'; return results; } ?UDO9>oThis shows list of tables having FullText Indexes  j%MuUnitWithNextpUnit, pUnitStr, pNextUnit, pSepvar ret = ""; if(!pSep) pSep="."; if(pUnit) { ret = String(pUnit); if(pNextUnit) ret += pSep + String(pNextUnit); ret += "" + pUnitStr; } return ret;V){SafeDiv0pNum, pDivisorif(pDivisor == 0) return 0; return(pNum/pDivisor);;_ToIntpNumreturn parseInt(Number(pNum).toFixed(5));v13IsReplicationSlavepIsReplicationSlave if(pIsReplicationSlave == "1") return true; return false;f)'IsSlaveRunningpSlaveRunningif(pSlaveRunning == "ON") return true; return false; Z TimeUnitspCountervar seconds = ToInt(pCounter); var ret=""; var years = days = hours = minutes = 0; years = ToInt(seconds / 31536000); seconds -=(years * 31536000); days = ToInt(seconds / 86400) seconds -=(days * 86400); hours = ToInt(seconds / 3600); seconds -=(hours * 3600); minutes = ToInt(seconds / 60); seconds -=(minutes * 60); if(years) { ret += String(years); if(years > 1) ret += " yrs "; else ret += " yr "; } if(days) { ret += String(days); if(days > 1) ret += " days "; else ret += " day "; } if(hours) { ret += String(hours); if(hours > 1) ret += " hrs "; else ret += " hr "; } if(minutes) { ret += String(minutes); if(minutes > 1) ret += " mins "; else ret += " min "; } if(seconds) { ret += String%!TimeUnitspCountervar seconds = ToInt(pCounter); var ret=""; var years = days = hours = minut ]zN%/[StorageUnitspBytes, pDecimalsvar ret="", temp; var tb = gb = mb = kb = 0; var ONE_K = 1024; vaM!1]NumCounterpCounter, pDecimalreturn StorageUnits(pCounter, pDecimal); 7/aNumCounterWithSecondspCounter, pUptimevar ret = ""; ret += NumCounter(pCounter, 0); if(!pUptime) return ret; var seconds = ToInt(pUptime); if(seconds>0 && pCounter>0) ret += " (" + NumCounter(ToInt(pCounter)/seconds, 3)+ "/sec)"; return ret;  IsInnodbvar value =MONyog.Server.Config.InnoDBSupport; if(value == '') { value = MONyog.MySQL.GlobalVariables.have_innodb; if(typeof(value) == "undefined") return false; } if(value != "NO" && value != "DISABLED") return true; return false;m )/CheckForInnoDBpHaveInnodb, pValif(IsInnodb(pHaveInnodb) == true) return pVal; return "(n/a)"; Q%If any connection is no longer running as a SLAVE connected to the MASTER, use SHOW SLAVE STATUS for that connection and try to determine whether there was an error or the slave was stopped manually. Check the last 100 lines of the slave's error log to see if that gives a clue.Look at Last Error Number and Last Error Message for specific error information.Determine if and why an explicit STOP SLAVE was issued. Try restarting the slave with START SLAVEsa%This value gives an indication of how much (if any) are different connection(s) lagging behind the master. B 3]CacheHitRatioInnodbpBufferPoolReads, pBufferPoolReadRequests, pIsMySQLAvailablevar disk = ToInt(pBufferPoolReads); var total = ToInt(pBufferPoolReadRequests); var hit = 0; if(pIsMySQLAvailable == 1) { if(total > 0) hit = (1 - SafeDiv0(disk, total)) * 100; return hit.toFixed(2); } return null;{3imCacheHitRatioMyISAMpKeyReads, pKeyReadRequests, pIsMySQLAvailablevar disk = ToInt(pKeyReads); var total = ToInt(pKeyReadRequests); var hit = 0; var percentage; if(pIsMySQLAvailable == 1) { if(total > 0) { percentage = (1 - SafeDiv0(disk, total)); if(percentage >= 0 && percentage <= 1) { hit = percentage * 100; return hit.toFixed(2); } else { return null; } } return hit.toFixed(2); } else return null; o1kUGetCpuIOPercentagepUser, pNice, pSystem, pIdle, pIowait, pHi, pSi// Get the percentage of CPU Io wait, in the mode whose value is passed as the parameter. var totalcpu = 0; totalcpu = Number (pUser); totalcpu += Number (pNice); totalcpu += Number (pSystem); totalcpu += Number (pIdle); totalcpu += Number (pIowait); totalcpu += Number (pHi); totalcpu += Number (pSi); if(totalcpu==0) { return 0; } var cp = (pIowait / totalcpu) * 100; cp = cp.toFixed(1); return Number(cp);81iiCacheHitRatioQuerypQCacheInserts, pQCacheHits, pIsMySQLAvailablevar cachehits = pQCacheHits; var total = ToInt(pQCacheInserts) + ToInt(cachehits); var hitrate = 0; if(pIsMySQLAvailable == 1) { hitrate = (SafeDiv0(cachehits, total) * 100).toFixed(2); return hitrate; } return null; &&&2 +-GetServerUptimepServerStartTimevar today = new Date(); var serverstarttime = new Date(pServerStartTime * 1000); return ((today - serverstarttime)/1000);I +oCheckForSystem if(MONyog.System) return true; return false;Y!k9GetCpuUsedpUser, pNice, pSystem, pIdle, pIowait, pHi, pSiret = GetCpuPercentage(pUser, pNice, pSystem, pIdle, pIowait, pHi, pSi); if(ret == -1) { return 0; } ret = (100-ret).toFixed(1); return ret;{-kqGetCpuPercentagepUser, pNice, pSystem, pIdle, pIowait, pHi, pSi// Get the percentage of CPU used, in the mode whose vaule is passed as the parameter. var totalcpu = 0; totalcpu = Number (pUser); totalcpu += Number (pNice); totalcpu += Number (pSystem); totalcpu += Number (pIdle); totalcpu += Number (pIowait); totalcpu += Number (pHi); totalcpu += Number (pSi); if(totalcpu==0) { totalcpu=1; return -1; } var cp = (pIdle / totalcpu) * 100; cp = cp.toFixed(1); return Number(cp); ssC*<*sfunction() { var obj = MONyog.UserObject('DiskInfo'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (obj[i]['Rows'] >= 1000000) { if (results.length > 0) results += "
    "; results += obj[i].Database + "." + obj[i].Table; } } if (results.length == 0) results = 'None'; return results; } ,UDO<+uThis shows tables which has more than a million rows 66%function() { var obj = MONyog.UserObject('Tables_Size'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].Tables + '   ' + obj[i].Total_Size; } if (results.length == 0) results = 'None'; return results; } 8UDO'7Kshows number of tables and size 5UDO :, F Yes EYeseDEfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); } C1 B105AgThis shows ratio of tables having primary key@function() { var obj = MONyog.UserObject('Primary_Key_Ratio'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += parseFloat(obj[i].Ratio).toFixed(2)+'%'; } if (results.length == 0) results = 'None'; return results; } cc_|Cw";;=m4  % Cache Misses#9 % M#(Total memory3eee8589472939dc3affc94ad37023d2! 1@8 # M 'Memory free17ef6eb3ca995144dfa426759b54bb43!1yR W Mu0Physical memory usage of applications0a99e75b865d9534b30bee4aecd2f42c3  MqHCached95735d2a8502163af02e96c0d49479194  Mm`Buffers08d201c8caa52281acb86353632001ac!1ix8 # MeSwap cachedf87b348a01bb769b3b0dffcbd570660b6  MaSwap usedb87d21ee71cee6959c0f8769c90fcc8f6  M]Swap freef8c8e686d8720dfcb30ffbd3b9e06da77 ! MYSwap total2b763a3b8b69f0f24c1dfe3c0a623e4e!1:I E M 6Virtual memory size of MySQLdc7af12e08efac340d32993eb6853698A 5 M 2Memory used by MySQLa540cab066ef007bfe8aabd31a833c2a!1 .6  M *RAM usage1251357745597e8550de89d2f9860647 index on every column in every possible combination, the index file would grow much more quickly than the data file. In the case when a table is of large table size, the index file could reach the operating system’s maximum file size.Indexes slow down the speed of writing queries, such as INSERT, UPDATE and DELETE. Because MySQL has to internally maintain the “pointers” to the inserted rows in the actual data file, so there is a performance price to pay in case of above said writing queries because every time a record is changed, the indexes must be updated. However, you may be able to write your queries in such a way that do not cause the very noticeable performance degradation.
    * Indexes don’t come for free.What you gain for in retrieval speed you lose in insertion and deletion speed because every time you alter a table the indexes must be updated accordingly. If your table is updating frequently it’s possible that having indexes will cause overall performance of your database to suffer. ~~t#_9>oThis shows list of tables having FullText Indexes ?UDO>Q3K3function() { var obj = MONyog.UserObject('Data_Types'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (obj[i].Number > 100) { if (results.length >0) results+='
    '; results += obj[i].Data_Type + '   '+ obj[i].Number; } } if (results.length == 0) results = '(n/a)'; return results; }04]Shows Number of columns of each datatype j9Ofunction() { var obj = MONyog.UserObject('WorstIndex'); if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enable=:wThis shows worst performing queries on MySQL instance99{function() { var obj = MONyog.UserObject('WorstIndex'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].Table + '.' + obj[i]['Field_Name']; } if (results.length == 0) results = '(n/a)'; return results; } ttu=efunction() { var obj = MONyog.UserObject('FullText_Index'); if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (!obj || !MONyog.MySQL.Custom.Available) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].Table_Name + '.' + obj[i].Column_Name; } if (resul=:wThis shows worst performing queries on MySQL instance <UDO2;_* Use EXPLAIN PLAN it shows (explains!) how your queries are being used. By putting it before a SELECT, you can see whether indexes are being used properly, and what kind of join is being performed.
    * Indexes take up disk space. Usually the space usage isn’t significant, but because of creating dd8020_function() { var obj = MONyog.UserObject('Storage_Engine'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].Engine+ ' :'+ obj[i].Tables+'   ' + obj[i].Total_Size; } if (results.length == 0) results = 'None'; return results; } 2UDOU1%This shows storage engine types and number of tables belongs to each of them +-%-Efunction() { var obj = MONyog.UserObject('Database_Size'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].Database + '   ' +obj[i].Database_Size+'M'; } if (results.length == 0) results = 'None'; return results; } /UDOF.This Shows top 5 databases and their size on a MySQL instance W*WP9S'InnoDBLogPercentOnDiskInnodb_log_waits, Innodb_log_writesvar disk = ToInt(Innodb_log_waits); var total = ToInt(Innodb_log_writes); var hit = SafeDiv0(disk,total)*100 return hit.toFixed(2);S7uKeyCachePercentOnDiskvar disk = ToInt(MONyog.MySQL.GlobalStatus.Key_writes); var total = ToInt(MONyog.MySQL.GlobalStatus.Key_write_requests); var hit = SafeDiv0(disk,total); return hit.toFixed(2); C  = aInnoDBCachePercentOnDiskInnodb_buffer_pool_wait_free, Innodb_buffer_pool_write_requestsvar disk = ToInt(Innodb_buffer_pool_wait_free); var total = ToInt(Innodb_buffer_pool_write_requests); var hit = SafeDiv0(disk,total)*100; return hit.toFixed(2); mm!-CachePercentUsedif(!MONyog.MySQL.GlobalStatus.Key_blocks_unused) MONyog.MySQL.GlobalStatus.Key_blocks_unused = 0; var blocks = SafeDiv0(MONyog.MySQL.GlobalVariables.key_buffer_size, MONyog.MySQL.GlobalVariables.key_cache_block_size).toFixed(0); if(MONyog.MySQL.GlobalStatus.Key_blocks_unused > 0) return((1 - MONyog.MySQL.GlobalStatus.Key_blocks_unused/blocks)*100).toFixed(3); else return 0;l#;PercentUsedif(!MONyog.MySQL.GlobalStatus.Key_blocks_unused) MONyog.MySQL.GlobalStatus.Key_blocks_unused = 0; if(MONyog.MySQL.GlobalVariables.key_cache_block_size && MONyog.MySQL.GlobalVariables.key_buffer_size) { var blocks=SafeDiv0(MONyog.MySQL.GlobalVariables.key_buffer_size, MONyog.MySQL.GlobalVariables.key_cache_block_size).toFixed(0); return((1 - SafeDiv0(MONyog.MySQL.GlobalStatus.Key_blocks_unused, blocks))*100).toFixed(3); } else return "(n/a)"; HPH1[GetWarnStatusFloatpValue, pCritical, pWarning, pIsGreaterif(pIsGreater == true) { if(parseFloat(pValue) > pCritical) return "Critical"; else if(parseFloat(pValue) > pWarning) return "Warning"; } else { if(parseFloat(pValue) < pCritical) return "Critical"; else if(parseFloat(pValue) < pWarning) return "Warning"; } return "None";|-[GetWarnStatusIntpValue, pCritical, pWarning, pIsGreaterif(pIsGreater == true) { if(parseInt(pValue) > pCritical) return "Critical"; else if(parseInt(pValue) > pWarning) return "Warning"; } else { if(parseInt(pValue) < pCritical) return "Critical"; else if(parseInt(pValue) < pWarning) return "Warning"; } return "None";-!5RatioUnitspCounter1, pCounter2var ratio; var ret = ""; ratio = SafeDiv0(pCounter1, pCounter2).toFixed(3); if(ratio>0) ret += String(ratio)+":1"; return ret; ==X*) Each connection to the MySQL database server runs in its own thread. Thread creation is a time consuming activity, so instead of killing the thread each time a connection is closed, the server can keep the thread in its thread cache and use it for a new connection later$+C function() { // should not be 0 if(MONyog.MySQL.GlobalVariables.thread_cache_size == 0) return "Warning"; else return "None"; } qq  function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)";g7 innodb_force_recovery q] "Innodb_force_recovery is set to a non-zero value ONLY when recovering data from a corrupt database and must be set to zero otherwise.
    Set this variable to zero in MySQL.ini if you are not backing up a corrupt database."  function() { if(MONyog.MySQL.GlobalVariables.innodb_force_recovery > 0) return "Warning"; else return "None"; }% log_warningsS! "This option is used ONLY to back up databases in case of database corruption.
    Setting the innodb_force_recovery to a value between 0 and 6 would force the innodb engine to start while preventing
    any kind of background operations from happening - there by allowing us to backup tables from a corrupt database. " xCxv! log_outputVa:o function() { var warnings = MONyog.MySQL.GG  This option logs the MySQL warnings. Set this value to zero to disable logging warnings, one to log warnings but not those related to "Aborted connections", two or above to log all warnings.9m function() { if(MONyog.MySQL.Custom.Available != 1) { return "(n/a)"; } var value; if(typeof(MONyog.MySQL.GlobalVariables.log_warnings) !== "undefined") value = MONyog.MySQL.GlobalVariables.log_warnings; else if(typeof(MONyog.MySQL.GlobalVariables.log_error_verbosity) !== "undefined") value = MONyog.MySQL.GlobalVariables.log_error_verbosity; else return "(n/a)"; if(value == 0) { return "No"; } else if(value == 1) { return "Enabled BUT warnings on Aborted connection wont be recorded"; } else if(value >= 2) { return "Enabled and all warnings are being recorded"; } } K-4&e Days after which the binary logs are purged.\%3 function() { if(MONyog.MySQL.Custom.Available != 1 || ( typeof MONyog.MySQL.GlobalVariables.expire_logs_days == "undefined")) return "(n/a)"; return MONyog.MySQL.GlobalVariables.expir! log_output{ function() { if(this.Value == 0 || this.Value == 1) return "Warning"; else return "None"; }  Ensure log_warnings is set to a value greater than 1 to log warnings related to‘Aborted connection information’ and replication.N  This variable specifies the destination of the Slow and General logs.O function() { if( MONyog.MySQL.Custom.Available != 1 || (typeof MONyog.MySQL.GlobalVariables.log_output == "undefined")) return "(n/a)"; return MONyog.MySQL.GlobalVariables.log_output; } `Uo\'3 Old binary logs need to be removed from the disk if binary logging is enabled, failing which the binary logs fill the disk.
    There is no ideal value for this variable as it depends on how busy your MySQL server is. To find the optimum value for this variable you will have to do trial and error such that binary logs are deleted after they are made use of.

    NOTE: Removing binary log files from the disk manually may result in erroneous behaviour.q(] function() { var isbinlog = MONyog.MySQL.GlobalVariables.log_bin; var days = MONyog.MySQL.GlobalVariables.expire_logs_days; if( isbinlog && days == 0) return "Warning"; else return "None"; }*+ max_binlog_size + function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalVariables.max_binlog_size; } ddmm, This variable defines the maximum size of a binary log file. Sometimes during big transactions, while writing to the binary log in chunks, the content are not split over files resulting in such log files exceeding this value. The default value is 1 GB._-9 This value should be set to its default(maximum) value which is 1 GB for all purposes.y.m function() { var isbinlog = MONyog.MySQL.GlobalVariables.log_bin; var size = MONyog.MySQL.GlobalVariables.max_binlog_size; if( isbinlog && size != 1073741824) return "Warning"; else return "None"; }0!flush_time1 function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalVariables.flush_time; }2All the tables are closed in order to free resources and all the un-synchronized data are flushed to the disk if this variable is set.  i)F| !O3If this option is set MySQL might spend considerable amount of time closing tables to release resources and flushing frequently there by affecting the performance.
    Disable this option in my.cnf4 function() { if(MONyog.MySQL.GlobalVariables.flush_time > 0) return "Warning"; else return "None"; }5! NumCounter 6RAM Usage71["MySQL", "Total"]28_[(SafeDiv0(MONyog.System.Mem.proc_mem_vmrss , MONyog.System.Mem.sys_mem_total) * 100).toFixed(2), (SafeDiv0(MONyog.System.Mem.sys_mem_total - MONyog.System.Mem.sys_mem_free - MONyog.System.Mem.sys_mem_buffers - MONyog.System.Mem.sys_mem_cached , MONyog.System.Mem.sys_mem_total) * 100).toFixed(2)]9%RealTimeLine:Current;7Database Transactions8<m["BEGINs", "COMMITs", "ROLLBACKs", "SAVEPOINTs"] }DHH\D}6  MCPU usage93a4161e7de5ff0518caa49ca46ff2a99 % MpCPU I/O wait5c50c3cfaa713d8933ea39e11545d156!18 # M Running for9eb5c85ddb372ef3b6ce442c1ea4f4d5; ) MKernel version1298e55ff18a8297ceeac07b340b2cd16 ! MAvailable?35e88a93f926c70021891e3df556589dD ; MeNumber of users dropped256eb289a6342b9d309247baa7db7d39!1aE = M]Number of tables droppede89bd2001b0edae0d3cf4c882af93a5bE = MYNumber of tables created217e8f89887cb56ffff7e42fd0bc1454H C MUNumber of table alterationsad227ae38b5c38deab1adda0de3180ac!1RF~ ? MN Number of indexes droppedb528d00b2491f0b13b53b265ba8aefadF} ? MJ8Number of indexes created2ab7b9d6615a1114acd5af73e8ac7365!|1FPH{ C MBhNumber of functions droppedb8567d445beae964782985e1e0cc56af ]]<eX=+[ToInt(MONyog.MySQL.GlobalStatus.Com_begin) + ToInt(MONyog.MySQL.GlobalStatus.Com_xa_start), ToInt(MONyog.MySQL.GlobalStatus.Com_commit) + ToInt(MONyog.MySQL.GlobalStatus.Com_xa_commit), ToInt(MONyog.MySQL.GlobalStatus.Com_rollback) + ToInt(MONyog.MySQL.GlobalStatus.Com_xa_rollback), ToInt(MONyog.MySQL.GlobalStatus.Com_savepoint)]>%RealTimeLine?;Database DDL StatementsJm*&@I["CREATEs", "DROPs", "ALTERs"]A)[ToInt(MONyog.MySQL.GlobalStatus.Com_create_db), ToInt(MONyog.MySQL.GlobalStatus.Com_drop_db), ToInt(MONyog.MySQL.GlobalStatus.Com_alter_db)] BeB H=Percentage of Cache Hits*EQ["Percentage of Connections Used"]B%RealTimeLineCCurrent D-Connections Used~Fw[(SafeDiv0(MONyog.MySQL.GlobalStatus.Threads_connected,MONyog.MySQL.GlobalVariables.max_connections)*100).toFixed(2)]GCurrent LI["MyISAM Key Cache", "InnoDB Cache", "Query Cache", "Thread Cache"] XX( 3CacheHitRatioThreadpThreadCreated, pConnections, pThreadCacheSize, pIsMySQLAvailablevar threadcachesize = ToInt(pThreadCacheSize); var threadcreated = ToInt(pThreadCreated); var connection = ToInt(pConnections); var hitrate = 0; if(pIsMySQLAvailable == 1) { if(connection > 0) { hitrate = ((1-SafeDiv0(threadcreated,connection))*100).toFixed(2); } return hitrate; } else return null;z9kcGetCpuKernalPercentagepUser, pNice, pSystem, pIdle, pIowait, pHi, pSi// Get the percentage of CPU used by Kernal, in the mode whose value is passed as the parameter. var totalcpu = 0; totalcpu = Number (pUser); totalcpu += Number (pNice); totalcpu += Number (pSystem); totalcpu += Number (pIdle); totalcpu += Number (pIowait); totalcpu += Number (pHi); totalcpu += Number (pSi); if(totalcpu==0) { return 0; } var cp = (pSystem / totalcpu) * 100; cp = cp.toFixed(1); return Number(cp); @@TN[CheckForSystem() && MONyog.System.Custom.Available == 1 && IsKernalVersionLessThan2dot6(MONyog.System.Custom.Version) ? (MONyog.System.Io.blocks_in * 1024) : 0, CheckForSystem() && MONyog.System.Custom.Available == 1 && IsKernalVersionLessThan2dot6(MONyog.System.Custom.Version) ? (MONyog.System.Io.blocks_out * 1024) : 0, CheckForSystem() && MONyog.System.Custom.Available == 1 && IsKernalVersionLessThan2dot6(MONyog.System.Custom.Version) ? MONyog.System.Io.blocks_in * 1024 + MONyog.System.Io.blocks_out * 1024 : 0]:Pq ["Hits", "Inserts", "Lowmem Prunes", "Not Cached"]O9 Query Cache EfficiencyM%RealTimeLine"LA["Read", "Write", "Total"]KDisk IOyog.System.Cpu.sys_cpu_iowait, MONyog.System.Cpu.sys_cpu_hi, MONyog.System.Cpu.sys_cpu_si):0, CheckForSystem()?GetCpuUserPercentage(MONyog.System.Cpu.sys_cpu_user, MONyog.System.Cpu.sys_cpu_nice, MONyog.System.Cpu.sys_cpu_system, MONyog.System.Cpu.sys_cpu_idle, MONyog.System.Cpu.sys_cpu_iowait, MONyog.System.Cpu.sys_cpu_hi, MONyog.System.Cpu.sys_cpu_si):0, CheckForSystem()?GetCpuIOPercentage(MONyog.System.Cpu.sys_cpu_user, MONyog.System.Cpu.sys_cpu_nice, MONyog.System.Cpu.sys_cpu_system, MONyog.System.Cpu.sys_cpu_idle, MONyog.System.Cpu.sys_cpu_iowait, MONyog.System.Cpu.sys_cpu_hi, MONyog.System.Cpu.sys_cpu_si):0, CheckForSystem()?GetCpuUsed(MONyog.System.Cpu.sys_cpu_user, MONyog.System.Cpu.sys_cpu_nice, MONyog.System.Cpu.sys_cpu_system, MONyog.System.Cpu.sys_cpu_idle, MONyog.System.Cpu.sys_cpu_iowait, MONyog.System.Cpu.sys_cpu_hi, MONyog.System.Cpu.sys_cpu_si):0 ] LL2!EIsKernalVersionLessThan2dot6pVersionvar version = (pVersion+"").split(); if(version[0] < 2) return false; else if (version[1] < 6) return false; else return true;| 5kkGetCpuUserPercentagepUser, pNice, pSystem, pIdle, pIowait, pHi, pSi// Get the percentage of CPU used by User Program, in the mode whose value is passed as the parameter. var totalcpu = 0; totalcpu = Number (pUser); totalcpu += Number (pNice); totalcpu += Number (pSystem); totalcpu += Number (pIdle); totalcpu += Number (pIowait); totalcpu += Number (pHi); totalcpu += Number (pSi); if(totalcpu==0) { return 0; } var cp = (pUser / totalcpu) * 100; cp = cp.toFixed(1); return Number(cp); lO*SQ ["Percentage of Query Cache Used"]_% RealTimeLine2^a ["Read", "Inserted", "Updated", "Deleted"]]1 InnoDB Row Details;\s [MONyog.MySQL.GlobalStatus.Qcache_queries_in_cache][ CurrentZ% RealTimeLine7Qi [MONyog.MySQL.GlobalStatus.Qcache_hits, MONyog.MySQL.GlobalStatus.Qcache_inserts, MONyog.MySQL.GlobalStatus.Qcache_lowmem_prunes, MONyog.MySQL.GlobalStatus.Qcache_not_cached]R1 Query Cache MemoryT% RealTimeLineU% RealTimeLine3Va [(SafeDiv0(MONyog.MySQL.GlobalVariables.query_cache_size - MONyog.MySQL.GlobalStatus.Qcache_free_memory, MONyog.MySQL.GlobalVariables.query_cache_size) * 100).toFixed(2)]W Current Y# ["Queries"]X- Queries in Cache g5*bQ InnoDB Buffer Pool Page Activitiesh/["Read", "Write"]g#InnoDB Data'ydm [ (SafeDiv0(parseFloat(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_pages_data) + parseFloat(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_pages_misc), parseFloat(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_pages_total)) * 100).toFixed(2) ]f Currente% RealTimeLine/c[ ["Percentage of Buffer Pool Page Used"]a% [MONyog.MySQL.GlobalStatus.Innodb_rows_read ? MONyog.MySQL.GlobalStatus.Innodb_rows_read : 0, MONyog.MySQL.GlobalStatus.Innodb_rows_inserted ? MONyog.MySQL.GlobalStatus.Innodb_rows_inserted : 0, MONyog.MySQL.GlobalStatus.Innodb_rows_updated ? MONyog.MySQL.GlobalStatus.Innodb_rows_updated : 0, MONyog.MySQL.GlobalStatus.Innodb_rows_deleted ? MONyog.MySQL.GlobalStatus.Innodb_rows_deleted : 0] N|qf[PE:$ *5@KValwti'2=H^S/   k  l   Z   \  m  n   o  p  q  r  s  u  t  v  w  >  ?   x  y  z  {   |  }    ~             !  !  !   !   ! !    !   Y   X  !     j  i  h  g   =   <   f   e   d   c   b   _   a   ^   ]    [ 0 f@Ii [MONyog.MySQL.GlobalStatus.Innodb_data_read ? MONyog.MySQL.GlobalStatus.Innodb_data_read : 0, MONyog.MySQL.GlobalStatus.Innodb_data_written ? MONyog.MySQL.GlobalStatus.Innodb_data_written : 0]j%RealTimeLine%kGInnoDB Row Lock Acquring Timel#["Current"]#sCMyISAM Key Block Activities8mm[MONyog.MySQL.GlobalStatus.Innodb_row_lock_time]n%RealTimeLine$oEMyISAM Key Buffer Activities:pq["Read Request", "Read", "Write Request", "Write"].qW[MONyog.MySQL.GlobalStatus.Key_read_requests, MONyog.MySQL.GlobalStatus.Key_read, MONyog.MySQL.GlobalStatus.Key_write_requests, MONyog.MySQL.GlobalStatus.Key_writes]r%RealTimeLine ^r^[I) h]u5["Percentage of MyISAM Key Blocks Used", "Percentage of MyISAM Key Blocks Modified"]&G[ToInt(MONyog.MySQL.GlobalStatus.Handler_read_key), ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd_next)+ToInt(MONyog.MySQL.GlobalStatus.Handler_read_rnd)]~%RealTimeLine/}[["via Indices", "via Full Table Scans"]|Row Reads{%RealTimeLine+zS[MONyog.MySQL.GlobalStatus.Queries]y5["Queries Executed"]x7Row Access StatisticswCurrentv%RealTimeLine t[100 - (SafeDiv0(MONyog.MySQL.GlobalStatus.Key_blocks_unused, SafeDiv0(MONyog.MySQL.GlobalVariables.key_buffer_size, MONyog.MySQL.GlobalVariables.key_cache_block_size))*100).toFixed(2), (SafeDiv0(MONyog.MySQL.GlobalStatus.Key_blocks_not_flushed, SafeDiv0(MONyog.MySQL.GlobalVariables.key_buffer_size, MONyog.MySQL.GlobalVariables.key_cache_block_size))*100).toFixed(2)] @`n,W@Lp8 # I) E M 'Maximum binary log file sized51a809aeca8ca1fd27291261fb84e4eL( K M #(Days before purging binary logs4f35c165d502481603759e4c892dc692<' + M 2Log destinatione754b3f916b1c6c248ba0bd6e81b52b1:& ' M .Log warnings?7b86acbab33ee8ecef08f040cf288352I% E M @Is innodb_force_recovery on?1ca907586d50b9b267c7d1bef56dbe5bM$ M M>Key buffer size greater than 4GB109eeec71bb1ee0c7ebf8577346d37906#  MCPU Usage1a94771ae9b90ceb932795c0cd88121c?" 3 MSystem Availability13b13716e3a35c63810c92a5b64256357! ! MStatements1c6b6ac9da7e09ea378fea02ed5037619 % M Cache Missesb70150a0335a1aea352de631f2e4b10e8 # MConnectionsbada3878fc4bc703a8e1e4b6a70d17c6> 1 MMySQL Availability4595f121448def178a7a7f851d2df42dN M MBytes written to block device(s)55d9043c960e2c931c184ea8085a8a33L K M}Bytes read from block device(s)b18732e6e66a8fbc2ff99f2654913f4d :<%+:iL, U["Percentage of Table Locks Waited"]> w[(SafeDiv0(MONyog.MySQL.GlobalStatus.Table_locks_waited, ToInt(MONyog.MySQL.GlobalStatus.Table_locks_waited)+ToInt(MONyog.MySQL.GlobalStatus.Table_locks_immediate))*100).toFixed(2)]9Table Lock ContentionshK[MONyog.MySQL.GlobalStatus.Table_locks_immediate, MONyog.MySQL.GlobalStatus.Table_locks_waited] 7["Immediate", "Wait"] #Table Locks!! %RealTimeLine%RealTimeLine}[MONyog.MySQL.GlobalStatus.Sort_merge_passes, MONyog.MySQL.GlobalStatus.Sort_range, MONyog.MySQL.GlobalStatus.Sort_scan]9o["Merge Passes", "Using Range", "By Table Scans"]+Sort Activities[MONyog.MySQL.GlobalStatus.Handler_write, MONyog.MySQL.GlobalStatus.Handler_update, MONyog.MySQL.GlobalStatus.Handler_delete]%RealTimeLine)O["INSERTs", "UPDATEs", "DELETEs"]/Row Modifications &Il&>x@%RealTimeLine =Temporary Tables Created =["In Memory", "On Disk"]7[MONyog.MySQL.GlobalStatus.Created_tmp_tables - MONyog.MySQL.GlobalStatus.Created_tmp_disk_tables, MONyog.MySQL.GlobalStatus.Created_tmp_disk_tables]%RealTimeLine'Tables Opened5g["Tables Opened", "Table Definitions Opened"]fG[MONyog.MySQL.GlobalStatus.Opened_tables, MONyog.MySQL.GlobalStatus.Opened_table_definitions]%RealTImeLine7Binlog Cache Effiency%G["Cache Write", "Disk Write"]fG[MONyog.MySQL.GlobalStatus.Binlog_cache_use, MONyog.MySQL.GlobalStatus.Binlog_cache_disk_use]%RealTimeLine/Replication Slave!?["Seconds Behind Master"] tt 42a[MONyog.MySQL.Slave.Seconds_Behind_Master]%RealTImeLine Current!5Database Throughputs%"G["Sent", "Received", "Total"]8#k[MONyog.MySQL.GlobalStatus.Bytes_sent, MONyog.MySQL.GlobalStatus.Bytes_received, ToInt(MONyog.MySQL.GlobalStatus.Bytes_sent) + ToInt(MONyog.MySQL.GlobalStatus.Bytes_received)]$%RealTimeLine%5Table DDL Statements&&I["CREATEs", "DROPs", "ALTERs"]'9[ToInt(MONyog.MySQL.GlobalStatus.Com_create_table), ToInt(MONyog.MySQL.GlobalStatus.Com_drop_table), ToInt(MONyog.MySQL.GlobalStatus.Com_alter_table)](%RealTimeLine)Current WW%JE[CacheHitRatioMyISAM(MONyog.MySQL.GlobalStatus.Key_reads, MONyog.MySQL.GlobalStatus.Key_read_requests, MONyog.MySQL.Custom.Available), CheckForInnoDB(MONyog.MySQL.GlobalVariables.have_innodb, CacheHitRatioInnodb(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_reads, MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_read_requests, MONyog.MySQL.Custom.Available)), CacheHitRatioQuery(MONyog.MySQL.GlobalStatus.Qcache_inserts, MONyog.MySQL.GlobalStatus.Qcache_hits, MONyog.MySQL.Custom.Available), CacheHitRatioThread(MONyog.MySQL.GlobalStatus.Threads_created,MONyog.MySQL.GlobalStatus.Connections,MONyog.MySQL.GlobalVariables.thread_cache_size, MONyog.MySQL.Custom.Available)] ps[ function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_log_file_size = MONyog.MySQL.GlobalVariables.innodb_log_file_size; var innodb_log_files_in_group = MONyog.MySQL.GlobalVariables.innodb_log_files_in_group; if(typeof(innodb_log_file_size) == "undefined" || typeof(innodb_log_files_in_group) == "undefined") return "(n/a)"; return NumCounter(ToInt(innodb_log_files_in_group) * ToInt(innodb_log_file_size)); }8rm innodb_log_files_in_group * innodb_log_file_size.tY The combined size of InnoDB log files.&uI innodb_flush_log_at_trx_commit PP h9K[MONyog.MySQL.GlobalStatus.Table_locks_immediate, MONyog.MySQL.GlobalStatus.Table_locks_waited]+:SMONyog.MySQL.GlobalStatus.Questions;9 default_storage_engine?<y function() { if(typeof(MONyog.MySQL.GlobalVariables.default_storage_engine) == "undefined") return "(n/a)" return MONyog.MySQL.GlobalVariables.default_storage_engine; }3=c Shows the default storage engine for tablese>E The default storage engine for tables. As of MySQL 5.6.3. The storage engine for permanent tables only. To set the storage engine for TEMPORARY tables from MySQL 5.6.3, set the default_tmp_storage_engine system variable.?) innodb_version/@Y function() { if(typeof(MONyog.MySQL.GlobalVariables.innodb_version) == "undefined") return "(n/a)" return MONyog.MySQL.GlobalVariables.innodb_version; }(AM Shows the InnoDB version number B1 performance_schema %3A IUDO9Jo(Total memory - Used memory / Total memory) * 100'function() { var obj = MONyog.UserObject('Cluster_Data_Free'); if (!obj || !obj.isEnabled() || !MONyog.MySQL.Custom.Available) return '(n/a)'; obj = obj.select(); var r M40 N30eOEfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); } PYes Q Yes R YesPSWhen all memory is used, no more rows can be added to MySQL Cluster tables. If more memory is available on the data nodes then increase the value of the DataMemory and IndexMemory parameters and perform a rolling restart of the data nodes. Alternatively remove any rows from Cluster tables and run OPTIMIZE TABLE . TUDOUDisableHV (Total Redo buffer - Used redo buffer/ Total redo buffer) * 100  aUxWkfunction() { var obj = MONyog.UserObject('Cluster_RedoBuffer'); if(!obj.isE Z Yes Y Yes6XiAdvises when the redo buffers start to fill upWW!function() { var obj = MONyog.UserObject('Cluster_RedoBuffer'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results +=parseFloat(obj[i].Free_Redo_Buffer).toFixed(2)+'%'; } if (results.length == 0) results = 'None'; return results; } cc%function() { var obj = MONyog.UserObject('Cluster_RedoLogspace'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results +=parseFloat(obj[i].Free_Redo_Log_Space).toFixed(2)+'%'; } if (results.length == 0) results = 'None'; return results; }Nb(Total Redo Logspace - Used Redo Logspace/ Total Redo Logspace) * 100 aUDO   jUDO'kKShows number of users connectedXl+function() { var obj = MONyog.UserObject('Percona_Unused_Indexes7dkAdvises when the redo logspace start to fill up e Yes f YesTg#Currently using %redo_logspace_used% out of %redo_logspace_total% of configured redo log space. If the checkpointing is slow and there are so many writes to the database that the log files are full and the log tail cannot be cut without jeopardizing recovery, all updating transactions are aborted with internal error code 410 (Out of log file space temporarily). This condition prevails until a checkpoint has completed and the log tail can be moved forward. hUDO 66Wu) function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_buffer_pool_instances = MONyog.MySQL.GlobalVariables.innodb_buffer_pool_instances; if(typeof(innodb_buffer_pool_instances) == "undefined") return "(n/a)"; else return innodb_buffer_pool_instances; } Jv The number of regions that the InnoDB buffer pool is divided intow7 If you have a total innodb_buffer_pool_size of several Gigabytes and you are using MySQL 5.5+ you can define more buffer pool instances. The total pool is divided into multiple instances each handling I/O etc. Define so many instances that each is as close to 1 GB as possible. g!}=function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.open_files_limit); }$CThe number of files that MySQL can have open at a time. Default settings are often too low for production servers. It is safe to raise the value up to 64K.?~{Number of file descriptors available to MySQL instance.|-open_files_limit8{kTo obtain the highest level of data integrity set SQL_mode to any of the following:TRADITIONAL, STRICT_TRANS_TABLES, or STRICT_ALL_TABLES. Note that the recommended values were not introduced until MySQL version 5.0.2. If you are running MySQL version 4.1.x, use ANSI SQL mode. Refer the MySQL manual for the options available in earlier versions of MySQL.After setting sql_mode to the desired value in your my.cnf/my.ini file, restart your MySQL server.
    Note:Global setting does not prevent any client to define it own SESSION sql_mode
    i)7 innodb_file_per_table Setting skip_name_resolved disables the MySQL server's ability to perform DNS lookups. DNS servers can be unavailable and for a production server it is usually better to specify and ip and not a hostname as the 'host' specifier of a username. However users must then be created as 'user'@’ip’ and not as 'user'@'host' (except for ‘localhost’ what is accepted with this setting ON)<uResolve host names when checking client connections.8kfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof MONyog.MySQL.GlobalVariables.skip_name_resolve== "undefined") return "(n/a)"; else if (MONyog.MySQL.GlobalVariables.skip_name_resolve == "ON") return "NO"; else return "YES"; }/skip_name_resolve (X+ function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var value = MONyog.MySQL.GlobalVariables.innodb_file_per_table; if(!value) return "(n/a)"; return value; } InnoDB creates each new table using its own .ibd file for storing data and indexes, rather than in the shared tablespace.T# Innodb_file_per table controls if a single tablespace is used by InnoDB. If set to "1" a tablespace will be created for each table. It has effect from the time it was applied - existing tables are not changed. Using multiple tablespaces is in particular useful if you often drop large objects (tables or databases) as files will be deleted and the disk space reclaimed by the OS. With the setting of "0" dropping an object will not return diskspace to the OS. O  If set to "0" metadata statistics are not updated when accessing table information from Information_Schema. Disabling statistics on metadata may thus improve performance with queries to Information_Schema if you have a very large number of databases or tables in a database. But it is generally not needed and not recommended.3 afunction() { if(this.Value != "(n/a)" && MONyog.MySQL.GlobalVariables.myisam_recover_options == "FORCE") return "Warning"; else return "None"; }2 _You can improve 'ORDER BY' performance by setting this variable to a large value. However, since it is allocated per client, be careful with extremely high values.The buffer may also be set on a SESSION basis. This is most often a more economical way to handle memory than raising global settings. PP,%S If you are not using InnoDB XA transaction support, it is advisable that you disable this feature. This features adds an extra fsync which can degrade performance. mIWmrF  function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_stats_on_metadata = MONyog.MySQL.GlobalVariables.innodb_stats_on_metadata; if(typeof(innodb_stats_on_metadata) == "undefined") return "(n/a)"; else return innodb_stats_on_metadata; }!? InnoDB stats on metadata?% E Updates statistics during metadata statements such as SHOW TABLE STATUS or SHOW INDEX, or when accessing the INFORMATION_SCHEMA tables TABLES or STATISTICS. QQ1+Qfunction() { var obj = MONyog.UserObject('Percona_Active_Tables'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length > 0) results += "
    "; results += obj[i].TABLE_SCHEMA+"."+obj[i].TABLE_NAME+"
    "+"Rows read"+'    '+ obj[i].ROWS_READ+"
    "+"Rows changed"+ '    '+obj[i].ROWS_CHANGED+"
    "; } if (results.length == 0) results = 'None'; return results; } yyHOShows most active tables based on #rows read and changed respectively. UDO' Last_IO_ErrorWp[ function() { if(this.Value == "(n/a)" || this.Value == "MySQL user requires 'replication client' privilege for displaying this data" || ( !MONyog.MySQL.Slave.Last_IO_Error_Changed || (MONyog.MySQL.Slave.Last_IO_Error_Changed && MONyog.MySQL.Slave.Last_IO_Error_Changed == "No"))) return "None"; else return "Critical"; }A The last error message that caused the I/O thread to stop ~r/[Calculated from values at /proc/loadavg  No  No  Yes  1gI function() { if(this.Value == "(n/a)" || this.Value == "MySQL user requires 'replication client' privilege for displaying this data" || ( !MONyog.MySQL.Slave.Last_Error_Changed || (MONyog.MySQL.Slave.Last_Error_Changed && MONyog.MySQL.Slave.Last_Error_Changed == "No"))) return "None"; else return "Critical"; }  1t  Yes :C{P:(#Connections('M MONyog.MySQL.GlobalStatus.Uptime&System5$eIf load avg value is more that the number of CPU in a system, it is considered that processes are waiting for CPU cycles. Following can be cause of high load avg.
    1. CPU bound processes waiting for cpu cycles.
    2. High memory consumption.
    3. I/O bound processes waiting over resources. % Avg # Yes "Yes!function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return GetWarnStatusFloat(this.Value, this.Critical * MONyog.System.Cpu.sys_cpu_count , this.Warning * MONyog.System.Cpu.sys_cpu_count, true); else return 'None'; } 1 0.9#CLoad average for last 5 min9mfunction() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) ret = MONyog.System.LoadAvg.last_5_min; else ret = "(n/a)"; return ret; } I@KValw5*'2=HS^it$/:EP[fq |  ! !  !  !   !  !   !       @  G                      A  B        ?  @  A  B  C        %  &  '   (   )   * ! +,! , ! - ! C ! D !   !      8 /_k{$z/}SO [HQ C M Number of nodes not runningb6edfe951fa9b473891a327d79737c41QP U MPercentage of free Redo buffer spaceb75d108861da50084ed6fd4564cc2423SO [ MPercentage of free memory for Data Node32507df0968624d7415f0c057088fc21TN [ M Percentage of tables having primary key49e72301f7a9702c3b346af801d91629EM = MList of FullText Indexesa664ed0dedbad26053aad7af089ea36fVL a MWorst performing indexes on MySQL instanceea08dec9c4d5813896fffc61acc19337LK K MTotal number of tables and size1b65f62992a43f4e0b08b7e5818b7e66OJ Q MNumber of columns of each datatype3ad445de702b97aac7eadd56d70bff49QI U M Data distribution by storage engines8c45c62bd316399fd6727269208cf028KH I MTop 5 Databases and their size3dd2193f961212bdc3e37db3efc36ee3ZG i MList of tables having more than a million rowsf1eb08143f823ac298bdf9db7eda41cbAF 5 Mu0Table DDL Statements4f67a00a66e13298982cc96dc2bcc025 6N8( WB lV666687["Immediate", "Wait"]7#Table Locks!6?["Successful", "Refused"]S$3C[ToInt(MONyog.MySQL.GlobalStatus.Com_select) + ConvertToInt(MONyog.MySQL.GlobalStatus.Qcache_hits), ToInt(MONyog.MySQL.GlobalStatus.Com_insert) + ToInt(MONyog.MySQL.GlobalStatus.Com_replace), ToInt(MONyog.MySQL.GlobalStatus.Com_update), ToInt(MONyog.MySQL.GlobalStatus.Com_delete)]42e["SELECTs", "INSERTs", "UPDATEs", "DELETEs"]1!Statements(0M MONyog.MySQL.GlobalStatus.Uptime/#StackedAreaY.-[MONyog.MySQL.GlobalStatus.Bytes_sent, MONyog.MySQL.GlobalStatus.Bytes_received]-5["Sent", "Received"] ,Bytes+#StackedArea *[MONyog.MySQL.GlobalStatus.Connections - MONyog.MySQL.GlobalStatus.Aborted_connects, MONyog.MySQL.GlobalStatus.Aborted_connects]# ZZMx7Ci function() { if(typeof(MONyog.MySQL.GlobalVariables.performance_schema) == "undefined") return "(n/a)" return MONyog.MySQL.GlobalVariables.performance_schema; }5Dg Shows whether performance_schema is ON or OFF'EI If your server supports performance_schema you should consider to enable what performance_schema functionalities you find useful for your work. Note that some performance_schema functionalities may have a significant performance impact, so you should only enable what you intend to use" F= innodb_adaptive_flushing(9Gm function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_adaptive_flushing = MONyog.MySQL.GlobalVariables.innodb_adaptive_flushing; if(typeof(innodb_adaptive_flushing) == "undefined") return "(n/a)" return innodb_adaptive_flushing; } 'SS^it$/:EP[fq|              "   ! p q r  s  t u v w  x  y z { |  }  ~                           zZmHU This is ON as default and should remain so in most cases as it will prevent bursts of I/O activity. I/ lock_wait_timeout@J{ function() { if(typeof(MONyog.MySQL.GlobalVariables.lock_wait_timeout) == "undefined") return "(n/a)" return TimeUnits(MONyog.MySQL.GlobalVariables.lock_wait_timeout); }K- This variable specifies the timeout in seconds for attempts to acquire metadata locks. The permissible values range from 1 to 31536000 (1 year).L The setting defines for how long a query will wait for a LOCK to be released. If the value specified is exceeded the query will be aborted. Default setting is rather high. You may choose to lower this setting if you prefer an error to a very long wait. 'SS^it$/:EP[fq|                   ! " #  $  % & ' (  )  *  + , - .  /  0 1 @ A B  C  D  E  2 3 4  5  6 M' binlog_format-NU function() { if(typeof(MONyog.MySQL.GlobalVariables.binlog_format) == "undefined") return "(n/a)" return MONyog.MySQL.GlobalVariables.binlog_format; }pO[ Specify whether to use row-based, statement-based, or mixed replication. Statement-based is the default] &,28>DJPV\bhntz "(.4:@FLR^Xdjpv|3h5s689:),/2489< ?FKL>V?W]`@cAhktBwbzCDEH F IJKL(O8=BPGRLTOVRWWX\ZlYd]w\s`}^_aijk"l%m+r0s4t@uJvTw^xhzr{|}|~'/36:?DJPZdou|17BJPYow Q1!relay_log_recovery/PY The value of this may be STATEMENT (from very early MySQL versions), ROW (from MySQL 5.1) or MIXED (from MySQL 5.5). If you are using MySQL 5.1 or higher you should consider what binlog format to use. It is not possible to provide a general advice as what is optimal will depend on applications and how they write to to the master. But using ROW or MIXED setting may - as compared to STATEMENT - decrease the risk of deadlocks on slaves since BULK INSERTS (including LOAD DATA statements) will not be executed as one large transaction on the slave. !nS!!xWk"If the value of this variable is greater than 0, a replication slave synchronizes its master.info file to disk.U-"sync_master_info&TG!At least replication slaves that are restarted automatically after a crash etc. should have this enabled, as it reduces the risk of corruption of slave data.dSC!If sets to “ON” , Enables automatic relay log recovery immediately following server startup, which means that the replication slave discards all unprocessed relay logs and retrieves them from the replication master. $]$$5\e#A value of 1 is the generally the best choice. The default value of sync_relay_log is 0, which does not force any synchronization to disk by the MySQL server—in this case, the server relies on the operating system to flush the relay-log.info file's contents from time to time as for any other file.m[U#If the value of this variable is greater than 0, the MySQL server synchronizes its relay log to diskY)#sync_relay_logcXA"If value is > 0 then slave synchronizes its master.info file to disk using fdatasync()) after every sync_master_info events. In this case, the server relies on the operating system to flush the master.info file's contents from time to time as for any other file. 0 is safest, but may have a small performance overhead depending on the OS details. o4Q, 4d1wsrep_cluster_size]3$sync_relay_log_info(cKThis value shows Cluster's uuid and we need to check whether the node belongs to the right cluster and this value should be the same across the whole cluster.z_o$If the value of this variable is greater than 0, a replication slave synchronizes its relay-log.info file to disk:`o$A value of 1 is the generally the best choice. The default value of sync_relay_log_info is 0, which does not force any synchronization to disk by the MySQL server—in this case, the server relies on the operating system to flush the relay-log.info file's contents from time to time as for any other file. a=wsrep_cluster_state_uuidrb_function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid) == "undefined" ) return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid); } oR3 oH!e=function() { if(MONyog.MySQL.Custom.Available != 1 || >lyShows total number of bytes replicated to other nodes.j9wsrep_replicated_bytes7ikTotal number of bytes written from other nodes.$hCfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.wsrep_received_bytes) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_received_bytes); }g5wsrep_received_bytesfMake sure that this value is equal to the expected number of nodes, enough to check this variable value on any of the nodes.!e=function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.wsrep_cluster_size) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "" ) return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_cluster_size); } ?y?VJ E7e ! MStatementsffbeaef169584f5fbb2b5a933f46aeedFb = MLoad avg for last 5 min a93a7e98c9794b318f83c4333b3b69b5D3 M$Sync relay log info7766917f388be2b82b5d385b763fd8e1

    o - M"Sync master infofccaeb14492a27c0ba44791e266ec475?n 1 M!}Relay log recovery34e22a3072e6684894539ec3e009bc9a>m / M  Binary log format2d8909328922dca1db8082a26a7abd6b>l / M LLock wait timeoutb39628452506b460c2b11070e9a58ca9Ek = M 'Innodb adaptive flushing7d74ca9317b0e20b4cbe6ea50c6ea21c>j  1 M Performance schemab97d611d2315d8e8d5907e157760fd60:i  ) M \InnoDB version50d3e886d89f51e6722f8ce869a190e2Bh  9 M Default storage engine348a5c922c09c342a48e6fd9d65f4b088g # MTable Locks71a4a85557497b2d4ac6f7309c4f82e32d  MBytese31866ff9b3d2ec88337b1151b04dfeb7c # M Connectionsfee6c56c6c2e3e6f7dfd502f8b984e7e |pN|*qOfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.wsrep_flow_control_sent) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_flow_control_sent); }"sAwsrep_local_send_queue_avg|rsThe slowest cluster node will have the highest value. Highest value for a node indicates slowest node in a cluster.p;wsrep_flow_control_sent9ooShows number of parrallel threads for replication2n_function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.wsrep_slave_threads) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.wsrep_slave_threads); }m3wsrep_slave_threads uu/tYfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_local_send_queue_avg) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_local_send_queue_avg); } w;function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_ready) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_ready; }v#wsrep_readyu/This variable is useful to find out network bottlenecks. High (on the order of the number of client connections) values may indicate a bottleneck in the network. If this is the case, the cause can be at any layer, from physical to OS configuration and must be investigated. K'.W function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalStatus.wsrep_local_state_comment) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_local_state_comment); }!? wsrep_local_state_comment1~] PRIMARY means it can accept writes and reads, also a good indicator if the node is in a good state NON-PRIMARY can't accept reads and writes, not a part of the cluster. +X-V+(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime$C In a primary component it normally can be one of: Joining, Waiting for SST, Joined, Synced and Donor and in a non-primary component node state comment should be Initialized. Any other states are transient and momentary. Synced - In sync with other nodes in the cluster, data is consistent with all other nodes Donor - read-only, currently helping get another nodes synced into the cluster Joining - communicating with the cluster to join Joined - Just joined the cluster Waiting for SST - in process of receiving state transfer Note: Generally you won't see "Joining" or "Joined" because it happens so fast with anything under a 6 node cluster (even over the WAN) 9,SE,#}A function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_cluster_status) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_cluster_status); };xsIf this value is "ON", the node can accept SQL load;ysMake sure that value of this variable is ON always.gzIfunction() { if(this.Value == "OFF" ) return "Critical"; else return "None"; }d |5 wsrep_cluster_status {Yes T)}R'+S innodb_buffer_pool_dump_at_shutdown(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.Uptime( M MONyog.MySQL.GlobalStatus.Uptime( M MONyog.MySQL.GlobalStatus.Uptime( M MONyog.MySQL.GlobalStatus.Uptime( M MONyog.MySQL.GlobalStatus.Uptime( M MONyog.MySQL.GlobalStatus.Uptime xsql_modeJyfunction() { if(MONyog.MySQL.Custom.Available != 1 || typeof MONyog.MySQL.GlobalVariables.sql_mode== "undefined") return "(n/a)"; return MONyog.MySQL.GlobalVariables.sql_mode; }rz_SQL Modes define what SQL syntax MySQL should support and what kind of data validation checks it should perform. If no SQL modes are enabled this means there is no kind of server-enforced data integrity, which means incoming data that is invalid will not be rejected by the server, but instead will be changed to conform to the target column's default datatype. 35Oe function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(typeof(MONyog.MySQL.InnodbStatus.Deadlock_detected) == "undefined" || MONyog.MySQL.InnodbStatus.Deadlock_detected == 0) return "(not configured)" return MONyog.MySQL.InnodbStatus.Deadlock_detected; }L7 NumCounterWithSecondsvMg This value should not increase by more than 1/sec. If it does, it means the InnoDB buffer pool is too small.N/ Deadlock_detected8c function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(typeof MONyog.MySQL.InnodbStatus.Deadlock_detected == "undefined" || MONyog.MySQL.InnodbStatus.Deadlock_detected == 0) return "(not configured)" return MONyog.MySQL.InnodbStatus.Deadlock_detected; } FF6Pg The InnoDB Engine employs row-level locking mechanisms to handle multiple simultaneous transactions. For instance, if a row were to be updated at the same time that a SELECT statement was retrieving it, the output of the SELECT statement would be inconsistent. InnoDB's locking mechanism prevents such inconsistencies from creeping in but is susceptible to deadlocks. Deadlocks occur when two or more transactions wait on the other to complete before executing, thereby entering an infinitely long cycle. InnoDB can instantly identify and break deadlocks, at the cost of rolling back one or more transactions (the victims). If deadlocks occur frequently, it should be cause for worry. spa function() { if(this.Value == "(n/a)" || typeof (MONyog.MySQL.GlobalStatus.Innodb_pages_read) == "undefined") return "None"; // should be more than the default 5MB if((MONyog.MySQL.GlobalStatus.Innodb_pages_read > 0) && MONyog.MySQL.GlobalVariables.innodb_log_file_size == 5242880) return "Warning"; else return "None"; }8qk This variable controls the size of the InnoDB transaction logs. The variable is set to its default value, 5M, which is too small. You should watch the Innodb_os_log_written variable over a period of several minutes, and estimate how many bytes per second are written to your InnoDB transaction logs. You can multiply this value by 3600 (an hour) and divide by innodb_log_files_in_group to choose a good log file size.,oU Size of each log file in a log group   r!GStatementspCounter, pUptime, pQuestionsvar total = ToInt(pQuestions); var percent =(100*(pCounter/total)).toFixed(3); ret = NumCounterWithSeconds(pCounter,ToInt(pUptime),2) + " " + (percent>0 ? String(percent)+"%" :"") return ret; var value = MONyog.MySQL.GlobalVariables.innodb_force_recovery; if(typeof(value) == "undefined") return "(n/a)"; if(value == 0) { return "No"; } else if(value == 1) { return "Yes. Set to 1 - Makes SELECT * FROM tbl_name jump over corrupt index records and pages, which help in dumping tables"; } else if(value == 2) { return "Yes. Set to 2 - Prevents the main thread from running"; } else if(value == 3) { return "Yes. Set to 3 - Does not run transaction rollbacks after recovery"; } else if(value == 4) { return "Yes. Set to 4 - Prevents insert buffer merge operations"; } else if(value == 5) { return "Yes. Set to 5 - Does not look at undo logs when starting the database"; } else { return "Yes. Set to 6 - Does not do the log roll-forward in connection with recovery"; } } K *5@KValw'2=HS^it$/:EP[fq|     $  #   "  .  /   7   9  a  b  c  d  e  f  g  h  i  j   l  m  n  o  p  q  r  s  t  u  v  w  x  z  {  y   |   }   ~                                                       !      ?'I Specifies whether to record the pages cached in the InnoDB buffer pool when the MySQL server is shut down, to shorten the warmup process at the next restart.  Make sure that you have set this value to ON (1), so that whenever MySQL server goes down InnoDB buffer pool gets saved automatically. *Q innodb_buffer_pool_load_at_startup j&I Innodb_buffer_pool_load_status  function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_buffer_pool_load_at_startup = MONyog.MySQL.GlobalVariables.innodb_buffer_pool_load_at_startup; if(typeof(innodb_buffer_pool_load_at_startup) != "undefined") { return innodb_buffer_pool_load_at_startup; } else { return "(n/a)"; } } a= Specifies that, on MySQL server startup, the InnoDB buffer pool is automatically warmed up by loading the same pages it held at an earlier time. Typically used in combination with innodb_buffer_pool_dump_at_shutdown. Make sure that you have set this value to ON (1), so that whenver MySQL server starts up InnoDB buffer pool gets reloaded automatically. Y[~Y""A innodb_max_dirty_pages_pctY!- This can be used to monitor the progress of the load of a innodb buffer pool. If it takes too long, or causes other issues, you can abort the buffer pool load by setting innodb_buffer_pool_load_abort to 'ON'.* Q Indicates buffer pool load status tc function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_buffer_pool_load_status= MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_load_status; if(typeof(Innodb_buffer_pool_load_status) != "undefined") { return Innodb_buffer_pool_load_status; } else { return "(n/a)"; } } ,D,%# This value should always be either 2-4 times than log file size or 10-20% of the buffer pool size, not more than that. Example: Buffer pool size is 40GB, redo logs are 2x1000MB. 2-4 times of 2GB = 4/8GB. 4/8GB = 10/20% of the buffer pool, this is recommended value.L$ How much of the buffer pool InnoDB permits to be dirty at any time i#M function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_max_dirty_pages_pct= MONyog.MySQL.GlobalVariables.innodb_max_dirty_pages_pct; if(typeof(innodb_max_dirty_pages_pct) != "undefined") { return innodb_max_dirty_pages_pct; } else { return "(n/a)"; } } To[ZhT+!Customize5*g!We recommend leaving this variable unchanged.6)g!This variable specifies the time in seconds between the beginning of one checkpoint and the beginning of the next. The default time between TokuDB checkpoints is 60 seconds.}(u!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_checkpointing_period; if (typeof(result) == "undefined") return "(n/a)"; return TimeUnits(result); }'!Customize & function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var innodb_buffer_pool_dump_at_shutdown= MONyog.MySQL.GlobalVariables.innodb_buffer_pool_dump_at_shutdown; if(typeof(innodb_buffer_pool_dump_at_shutdown) != "undefined") { return innodb_buffer_pool_dump_at_shutdown; } else { return "(n/a)"; } } $$;b%Slow_queriescfunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Slow_queries; }GPYb' 901t}]TKBx"%$#"! FRS#T^cedgrstuvwxy z {   ,          !-         ('&QPONMLKJIHG1 k 0w[0`k8y # M@wsrep_ready8d86dc5e58f8f40b3fb9f10c15df8c15I M 6InnoDB buffer pQ| U M .Dump InnoDB buffer pool on shutdown?a00bcbb0a4b194e9d438c2a7ce6070aa;z ) M #(Cluster statusfbcebf47aa7732b8f6d8aefb56003572Aq 3 M$Sync relay log infof8a8119d9365d7b0dbc2ffeddd9005ecF{ ? M 'wsrep_local_state_comment0c82c99dedf2571e44c1286b44bba895 ) #(Cluster statusDx ; MXFind network bottleneck7453cea9de844dc4e316ce8488ed78e7Hw C MpSlowest node in the clusterb87a81d84dc80feae1e01383ae99a10bXv c MNumber of parrallel threads for replicationc58345de7964d571ac38d5747b8c645f\u k MTotal number of bytes replicated to other nodes6d8beb799f4fc912fee97e3556c55bda_t q M Total number of writes from other nodes (in bytes)5c926e57c0cdcb15ad27b4d4c6bf07c6Ks I MNumber of nodes in the cluster28d13356d36277c7b699766f4976c2068r % MCluster UUIDf3865762bc3b0ce68b68cc2e08c4de12  _h3::S W M"PDe-Compressed Internal Node To Memory9bb5abf950bc8b40403fdd3c5eada248PG ? M "Compressed Leaf To Memorydcb2448eb22d7cd7dba4a90b12793b39U [ M"@Basement Nodes - Fetched For Write Timeb61159a4b611ca74f5b928a116b4c796I C M "Deserialized Leaf To Memory71b0b6e4f072e52a7461935352ea589eJ E M "De-Compressed Leaf To Memorydbe148120227a4a1933a6ea69fe03654H? "Compressed Leaf To MemoryS"Buffers FetcQ S M"Buffers Fetched - Target Query Time80c91b6b9ac27c8513102f0b415029438 ! M!@Row Format63b4bbd3c3027b24ddc859bd7f74601c= + M!XRead Block Sizead25839c4008c22bbc63748d7359054a8 ! M!pBlock Sizeff3e3f8385f26cb1e0b20f03386808e3> / M!Checkpoint Period7923c3f47e7f0fdcf8eef12bef6e8461K~ I M 6InnoDB buffer pool load statuse9f774b35bf78dc5d4031417f745b287P} S M 2Load InnoDB buffer pool at startup?6d29d8bb2f672a23b1466f024e25d86f Xy0m!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_read_block_size; if (typeof(result) == "undefined") return "(n/a)"; return NumCounter(result); }/!Customize8.k!Changing the value of tokudb_block_size only affects subsequently created tables. The value of this variable cannot be changed for an existing table without a dump and reload.,-S!Fractal tree internal and leaf nodes default to 4,194,304 bytes (4MB). The session variable tokudb_block_size controls the target uncompressed size of these nodes.t,c!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_block_size; if (typeof(result) == "undefined") return "(n/a)"; return NumCounter(result); } \h4K!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_row_format; if (typeof(result) == "undefined") return "(n/a)"; return result; }3!Customize=2u!Changing the value of tokudb_read_block_size only affects subsequently created tables. The value of this variable cannot be changed for an existing table without a dump and reload. 1;!Fractal tree leaves are subdivided into read blocks, in order to speed up point queries. The session variable tokudb_read_block_size controls the target uncompressed size of the read blocks. The units are bytes and the default is 65,536 (64KB). A smaller value favors read performance for point and small range scans over large range scans and higher compression. The minimum value of this variable is 4096. +`LH[M?+@" Customize ?"UDO >" YesV='"Number of seconds waiting for IO when fetching buffers from disk for queries.<}"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BUFFERS_FETCHED_TARGET_QUERY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); };"Customize :"UDO 9" Yes\83"Number of seconds waiting for IO when fetching basement nodes from disk for writes.7{"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BASEMENTS_FETCHED_FOR_WRITE_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }6"Customize53!This session variable controls the default compression algorithm used to compress data when no row format is specified in the CREATE TABLE command. F8*J" Customize I" UDO H" Yes?G{" Total time, in seconds, spent decompressing leaf nodes.F}" function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_LEAF_DECOMPRESSION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }E" Customize D" UDO C" Yes=Bw" Total time, in seconds, spent compressing leaf nodes.Ay" function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_LEAF_COMPRESSION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } B4&T" Customize S" UDO R" Yes=Qw" Total time, in seconds, spent serializing leaf nodes.P}" function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_LEAF_SERIALIZATION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }O" Customize N" UDO M" Yes?L{" Total time, in seconds, spent deserializing leaf nodes.K" function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_LEAF_DESERIALIZATION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } zr ^"Customize ]"UDO \" YesO["Total time, in seconds, spent decompressing non leaf (Internal) nodes.Z"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_NONLEAF_DECOMPRESSION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }Y"Customize X" UDO W" YesMV" Total time, in seconds, spent compressing non leaf (Internal) nodes.U" function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_NONLEAF_COMPRESSION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } tlh"Customize g"UDO f" YesMe"Total time, in seconds, spent serializing non leaf (Internal) nodes.d"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_NONLEAF_SERIALIZATION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }c"Customize b"UDO a" YesO`"Total time, in seconds, spent deserializing non leaf (Internal) nodes._"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_NONLEAF_DESERIALIZATION_TO_MEMORY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } L*5@KValw'2=HS^ it$/:EP[fq|   5  4  3  2  1  0  /  . , +  *                                                 '   (   )   *   +   "   #   $   %   &              !                                                              srr"Customize q"UDO p" YesPo"Number of seconds waiting for IO when fetching pivot nodes for queries.}nu"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_PIVOTS_FETCHED_FOR_QUERY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }m"Customize l"UDO k" YesVj'"Number seconds waiting for IO when fetching pivot nodes by a prefetch thread.i{"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_PIVOTS_FETCHED_FOR_PREFETCH_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } }| Customize {"UDO z" Yespy["This is a count of how many times the application was unable to access your data in the internal cache.qx]"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_CACHETABLE_MISS_TIME; if (typeof(result) == "undefined") return "(n/a)"; return (result); }w"Customize v"UDO u" YesOt"Number of seconds waiting for IO when fetching pivot nodes for writes.}su"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_PIVOTS_FETCHED_FOR_WRITE_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } [[q}] function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var tokudb_filesystem_fsync_time = MONyog.MySQL.GlobalStatus.Tokudb_FILESYSTEM_LONG_FSYNC_TIME; var tokudb_filesystem_fsync_num = MONyog.MySQL.GlobalStatus.Tokudb_FILESYSTEM_LONG_FSYNC_NUM; if (typeof(tokudb_filesystem_fsync_time) == "undefined" || typeof(tokudb_filesystem_fsync_num) == "undefined") return "(n/a)"; if (tokudb_filesystem_fsync_num == 0){ return 0.0; } var tokudb_filesystem_fsync_avg = tokudb_filesystem_fsync_time / tokudb_filesystem_fsync_num; return TimeUnits(tokudb_filesystem_fsync_avg); } Customize  UDO ~ Yes a~ja+  UDO   YesT# This is the current estimate function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_OVERALL_NODE_COMPRESSION_RATIO; if (typeof(result) == "undefined") return "(n/a)"; return NumCounter(result); } Customize  UDO  Yesb? function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var tokudb_filesystem_fsync_time = MONyog.MySQL.GlobalStatus.Tokudb_FILESYSTEM_FSYNC_TIME; var tokudb_filesystem_fsync_num = MONyog.MySQL.GlobalStatus.Tokudb_FILESYSTEM_FSYNC_NUM; if (typeof(tokudb_filesystem_fsync_time) == "undefined" || typeof(tokudb_filesystem_fsync_num) == "undefined") return "(n/a)"; if (tokudb_filesystem_fsync_num == 0) return 0.0; var tokudb_filesystem_fsync_avg = tokudb_filesystem_fsync_time / tokudb_filesystem_fsync_num; return TimeUnits(tokudb_filesystem_fsync_avg); } VrdVugSM  UDO   YesT# This is the current estimated compression ratio for all Fractal Tree nodes. Customize  UDO   YesQ This is the overall compression ratio of Leaf nodes in the fractal tree. function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_LEAF_NODE_COMPRESSION_RATIO; if (typeof(result) == "undefined") return "(n/a)"; return NumCounter(result); } Customize  UDO   Yes] 5 This is the overall compression ratio of all internal, non-leaf, Fractal Tree nodes.  function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_NONLEAF_NODE_COMPRESSION_RATIO; if (typeof(result) == "undefined") return "(n/a)"; return NumCounter(result); }  Customize $ TF8$ Customize  UDO   Yes6i The amount of memory used to cache Leaf nodes. function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var leaf_size = MONyog.MySQL.GlobalStatus.Tokudb_CACHETABLE_SIZE_LEAF; if (typeof(leaf_size) == "undefined") return "(n/a)"; return NumCounter(leaf_size); } Customize  UDO   YesE This is the total number of times db_open() has been called.oY function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_DB_OPENS; if (typeof(result) == "undefined") return "(n/a)"; return NumCounter(result); } |h ' Customize & UDO %  YesX$+ This is the number of bytes that are currently queued up to be written to disk.# function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var size_writing = MONyog.MySQL.GlobalStatus.Tokudb_CACHETABLE_SIZE_WRITING; if (typeof(size_writing) == "undefined") return "(n/a)"; return NumCounter(size_writing); }" Customize ! UDO   YesF The amount of memory used to cache Internal (Non-Leaf) Nodes. function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var node_size = MONyog.MySQL.GlobalStatus.Tokudb_CACHETABLE_SIZE_NONLEAF; if (typeof(node_size) == "undefined") return "(n/a)"; return NumCounter(node_size); } Galw'2=HS^it$/:EP[fq|VK@5*       " W " V " U " ^ " ] " \ " [ " Z                      ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! B ! C ! D ! E ! F ! G ! H ! I ! J ! K ! L ! M ! N ! O ! 9 !  : !  ; ! 5 !  6 !  7 !  8 ! , !  - !  . ! / !  0 !  1 ! 2 !  3 !  4 ! < ! = ! > ! ? ! @ ! A ykWg/! Customize .! This variable configures the directory name where the TokuDB tables are stored. The default location is the MySQL data directory.l-S! function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_data_dir; if (typeof(result) == "undefined") return "(n/a)"; return " " + result; },! Customize + UDO *  Yesz)o This is a count, in bytes, of how much of your uncompressed data is currently in the database’s internal cache.x(k function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var size = MONyog.MySQL.GlobalStatus.Tokudb_CACHETABLE_SIZE_CURRENT; if (typeof(size) == "undefined") return "(n/a)"; return NumCounter(size); } k3Q! function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_tmp_dir; if (typeof(result) == "undefined") return "(n/a)"; return " " + result; }2! Customizes1a! This variable configures the directory name where the TokuDB log files are stored. The default location is the MySQL data directory. Configuring a separate log dir is somewhat involved. Please contact Tokutek support for more details.k0Q! function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_log_dir; if (typeof(result) == "undefined") return "(n/a)"; return " " + result; }   u6e! function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_lock_timeout; if (typeof(result) == "undefined") return "(n/a)"; return TimeUnits(result); }5! Customizef4G! This variable configures the directory name where the TokuDB bulk loader stores temporary files. The bulk loader can create large temporary files while it is loading a table, so putting these temporary files on a disk separate from the data directory can be useful. For example, it can make sense to use a high-performance disk for the data directory and a very inexpensive disk for the temporary directory. The default location for temporary files is the MySQL data directory. cpaMcf:G! function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_directio; if (typeof(result) == "undefined") return "(n/a)"; return result; }9! Customize 8! If your application gets a ”lock wait timeout” error (-30994), then you may find that increasing the tokudb lock timeout may help. If your application get a ”deadlock found” error (-30995), then you need to abort the current transaction and retry it. 7! his variable controls the amount of time that a transaction will wait for a lock held by another transaction to be released. If the conflicting transaction does not release the lock within the lock timeout, the transaction that was waiting for the lock will get a lock timeout error. The units are milliseconds. A value of 0 disables lock waits. The default value is 4000 (four seconds). c(qc ?! Yes>!This variable configures the size in bytes of the TokuDB cache table. The default cache table size is 1/2 of physical memory.=%!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var tokudb_cache_size = MONyog.MySQL.GlobalVariables.tokudb_cache_size; if (typeof(tokudb_cache_size) == "undefined") return "(n/a)"; return NumCounter(tokudb_cache_size); }<!CustomizeT;#! When set to ON, TokuDB employs Direct IO rather than Buffered IO for writes. When using Direct IO consider increasing tokudb cache size from its default of 1/2 physical memory. The default values is OFF. "rdPc"=Du!Session variable tokudb commit sync controls whether or not the transaction log is flushed when a trans- action commits. The default behavior is that the transaction log is flushed by the commit. Flushing the transaction log requires a disk write and may adversely affect the performance of your application.iCM!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_commit_sync; if (typeof(result) == "undefined") return "(n/a)"; return result; }B!Customize A!UDO @!Tokutek highly recommends using the default setting if using buffered IO, if using directIO then consider setting this parameter to 80% of available memory. Consider decreasing TokuDB cache size if excessive swapping is causing performance problems. Swapping may occur when running multiple mysql server instances or if other running applications use large amounts of physical memory. xUAOmxqJ]!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_create_index_online; if (typeof(result) == "undefined") return "(n/a)"; return result; }I!CustomizeJH!Controls the frequency, in milliseconds, for fsync() operations. If set to 0 then the fsync() behavior is only controlled by the tokudb commit sync, which is on or off. The default values is 0.nGW!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_fsync_log_period; if (typeof(result) == "undefined") return "(n/a)"; return result; }F!Customize'EI!Setting this parameter to off may make the system run faster. However, transactions committed since the last checkpoint are not guaranteed to survive a crash. ?D0<S?P"CustomizeeOE!This variable controls whether slow alter tables are allowed. For example, ALTER TABLE foo ADD COLUMN a int, DROP COLUMN b; is slow because HCADER does not allow a mixture of column addi- tions, deletions, or expansions.pN[!function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalVariables.tokudb_disable_slow_alter; if (typeof(result) == "undefined") return "(n/a)"; return result; }M!CustomizeLL!Note that hot index creation is slower than offline index creation.iKM!This variable controls whether indexes created with the CREATE INDEX command are hot (if set on), or offline (if set off). Hot index creation means that the table is available for inserts and queries while the index is being created. Offline index creation means that the table is not available for inserts and queries while the index is being created. yebZ"Customize Y"UDO X" YesfWG"Number of seconds waiting for IO when fetching basement nodes from disk by a prefetch thread.Vy"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BASEMENTS_FETCHED_PREFETCH_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }U"Customize T"UDO S" Yes^R7"Number of seconds waiting for IO when fetching basement nodes from disk aggressively.Q"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BASEMENTS_FETCHED_PRELOCKED_RANGE_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } }igd"Customize c"UDO b" YesUa%"Number of seconds waiting for IO when fetching buffers from disk for writes.~`w"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BUFFERS_FETCHED_FOR_WRITE_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }_"Customize ^"UDO ]" Yes]\5"Number of seconds waiting for IO when fetching basement nodes from disk for queries.["function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BASEMENTS_FETCHED_TARGET_QUERY_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } me n Customizeo1 innodb_io_capacity m"UDO l" YesWk)"Number of seconds waiting for IO when fetching buffers from disk aggressively.j"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BUFFERS_FETCHED_PRELOCKED_RANGE_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); }i"Customize h"UDO g" Yes_f9"Number of seconds waiting for IO when fetching buffers from disk by a prefetch thread.}eu"function() { if (MONyog.MySQL.Custom.Available != 1) return "(n/a)"; var result = MONyog.MySQL.GlobalStatus.Tokudb_BUFFERS_FETCHED_PREFETCH_SECONDS; if (typeof(result) == "undefined") return "(n/a)"; return (result); } K2'=HS^itw$/:EP[fq|laVK@5* " " " " " " " " " " " " " " " " " m " " " " "  " "  "  " " " " T " S " R " Q " P " Y " " " _ " ` " a " b " c " i " j " k " l " d " e " f " g " h " " " " " " "  "  " "  " "  "  " "  " "  "  " "  " "  "  " "  qOu function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_change_buffer_max_size = MONyog.MySQL.GlobalVariables.Innodb_change_buffer_max_size; if(typeof(Innodb_change_buffer_max_size) == "undefined") return "(n/a)"; return Innodb_change_buffer_max_size; }%tG innodb_change_buffer_max_sizes CustomizeYr- This can be used to monitor the progress of the load of a innodb buffer pool. If it takes too long, or causes other issues, you can abort the buffer pool load by setting innodb_buffer_pool_load_abort to 'ON'.)qO Indicates buffer pool load statusFp function() { if(MONyog.MySQL.Custom.Available != 1 || !IsInnodb()) return "(n/a)"; var Innodb_io_capacity= MONyog.MySQL.GlobalVariables.Innodb_io_capacity; if(typeof(Innodb_io_capacity) != "undefined") { return Innodb_io_capacity; } else { return "(n/a)"; } } hwY9wUz Customize | function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; return MONyog.MySQL.GlobalVariables.back_log; }{ back_log>yw If there is heavy activity of Insert, Delete and Update is observed on a server then increase value higher than default or decrease it for a server with no or little write activity.x7 NumCounterWithSecondsw/ function() { if(this.Value == "(n/a)") return "None"; // should not be more than 20MB if(SafeDiv0(MONyog.MySQL.GlobalStatus.Innodb_buffer_pool_wait_free, MONyog.MySQL.GlobalStatus.Uptime) > 1) return "Warning"; else return "None"; }v This value is in percentage of InnoDB change buffer to the total size of the buffer pool. Default value is 25% in MySQL 5.6 bGseWI;-bb<uFree disk space, received by executing 'df' command. ?  Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes  Yes   Yes   Yes   Yes  Yes  Yes  Yes  Yes(M MONyog.MySQL.GlobalStatus.Uptime(M MONyog.MySQL.GlobalStatus.UptimeQ~ Observe connections/second on a server and adjust this value accordingly. MySQL 5.6 tunes it automatically but might not go high enough. On a highly concurrent server 2048 is often a reasonable value.`}; This value is the size of the listen queue for incoming TCP/IP connections. The back_log value indicates how many requests can be stacked during this short time before MySQL momentarily stops answering new requests. o}oY^-function() { var obj = MONyog.UserObject('Cluster_Nodes'); if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (!obj || !MONyog.MySQL.Custom.Available) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results +=obj[i].Nodes_Not_Running; Z Yes Y Yes6XiAdvises when the redo buffers start to fill up']K(Total nodes) - (Running nodes) \UDO[{Currently using %redo_buffer_used% out of %redo_buffer_total% of configured redo buffer space. If redo buffers fill up, then errors may be observed. If more buffer space is required, increase the RedoBuffer parameter and perform a rolling restart. gYK7i1i]function() { var obj = MONyog.UserObject('Users_Connected'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results += '
    '; results += obj[i].No_Of_Connections + '   ' + obj[i].Users + '@' + obj[i].Host_Name; } if (results.length == 0) results = 'None'; return results; } jUDO'kKShows number of users connected ,,Ov%ll9function() { var obj = MONyog.UserObject('Percona_Unused_Indexes'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length > 0) results += "
    "; results += obj[i].Table_Name + "." + obj[i].Index_Name; } if (results.length == 0) results = 'None'; return results; }$mEShows list of unused indexes nUDOoSystempSystemqSystemrSystems System$tE innodb_buffer_pool_instances .T.(K"K?function() { var obj = MONyog.UserObject('Cluster_Data_Free'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results +=parseFloat(obj[i].Percentage_Of_Free_Data_Memory).toFixed(2)+'%'; } if (results.length ==0) results = 'None'; return results; }9Jo(Total memory - Used memory / Total memory) * 100 IUDOQHMake sure that you have Primary key on every table for faster accessing. G Yes KK1L]Advises when the amount of Memory(Data and Index) configured for the data nodes starts to run low. Database inserts will start to fail is all of the memory is consumed.  z^t^cfunction() { var obj = MONyog.UserObject('Cluster_Nodes'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results +=obj[i].Nodes_Not_Running; } if (results.length == 0) results = 'None'; return results; },`SOnly %Ndb_number_of_ready_data_nodes% out of %Ndb_number_of_data_nodes% data nodes are running. View which data nodes are unavailable by running "ndb_mgm -e show".5_gIndicates how many data nodes are not running eTC2!cUGe/Efunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); } !Yes Yes This value indicates the percentage of free space left on the volume, if this value is less consider increasing size of the volume. This value indicates the percentage of free space left on the volume, if this value is less consider increasing size of the volume. 130 030e.Efunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); } + Yes * YesSystemSystemSystemSystemKAmount of free space left on the volume where InnoDB data resides.JAmount of free space left on the volume where MySQL data resides. $$$$<6u Free disk space, received by executing 'df' command. 5function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { if( MONyog.System.Disk.sys_disk_freepercent_innodb != "(n/a)") return ( MONyog.System.Disk.sys_disk_freepercent_innodb + "%"); } return "(n/a)"; } 4 function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { if( MONyog.System.Disk.sys_disk_freepercent_mysql != "(n/a)") return ( MONyog.System.Disk.sys_disk_freepercent_mysql + "%"); } return "(n/a)"; } 320 220 UE+sdJ;eV(xUUUUUUUUUUU c= ['', 'K', 'M', 'G', 'T'] b!1000 a= ['', 'K', 'M', 'G', 'T'] `!1000 _= ['', 'K', 'M', 'G', 'T'] ^!1000 ]= ['', 'K', 'M', 'G', 'T']K 22* [!1000 Z= ['', 'K', 'M', 'G', 'T'] 11) X!1000 W= ['', 'K', 'M', 'G', 'T'] 00( U!1000 T= ['', 'K', 'M', 'G', 'T'] //' ..& Q !1000 P= ['', 'K', 'M', 'G', 'T']Y --% N= ['', 'K', 'M', 'G', 'T'] M !1000 L!1000 ,,$ J !1000 G= ['', 'K', 'M', 'G', 'T'] F= ['', 'K', 'M', 'G', 'T'] E!1000$**"I++# D= ['', 'K', 'M', 'G', 'T'] B= ['', 'K', 'M', 'G', 'T']: C!1000 ))!7@i$function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return StorageUnits(MONyog.System.Disk.sys_disk_free_binlog); return "(n/a)"; } K*VKwla/$|q f[PE@'2=HS^it5:@:     ( : ( 9 ( 8 ' 7 ' 6 ' 5 & 4 ! C ! -   ( " ` ! D # c " r " b % n % o % p & 2 & 3             6  7  8  9  :  E  F  K  L  N  M      # g # f # t # d $ i $ j $ s % k # q  (! ( '! ' &! & $! $ $ h  % m !   " a   % l  ;zm`hZL;;B!System A! Yes @!Yese?E!function() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); } >!This value indicates the percentage of free space left on the volume, if this value is less consider increasing size of the volume. =!20 <!30 ;!function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { if( MONyog.System.Disk.sys_disk_freepercent_tmpdir != "(n/a)") return ( MONyog.System.Disk.sys_disk_freepercent_tmpdir + "%"); } return "(n/a)"; }O9 System 8 Amount of free space left on the volume where the directory specified in MySQL global variable 'tmpdir' . (NOTE: If you have specified more than one directories in 'tmpdir' variable then, disk usage of only that volume where first directory resides is shown) K gB.  J= innodb_autoinc_lock_modeI This value should be equal to 'ROW' as it prevents clients from setting a per session binary log format that is not 'ROW'. H It is a binary log format that overrides any session binlog_format settings.Possible values can be 'STATEMENT','ROW','MIXED' or 'NONE'. "FA wsrep_forced_binlog_format0E]!(free disk space/Total disk space)*100 .0D](free disk space/Total disk space)*100 .0C](free disk space/Total disk space)*100 . q ,>dw,!qqB> 7 MN List of delayed nodes66c9c9240736b6c05708454bca2ccd90YaNumber of transaction aborted by slave(B?] Length of the send queue+AEY Length of the receive queue:@cUPercentage of tiS? Y MRList of removed nodes from the cluster143301e85378d271a22ca090a9e28fceF= ? MJ8Cluster connection statusbe559d42eda41dedb0ef055c42c9e30fM9 M M:Myisam tables replication status1a031e4d0948e7d3f9e6bc9c2d91d7a0Q8 U M6Address for cluster nodes to connect7342a8b7549bfaaacb2ed9c6e6a8d7a0D7 ; M 2Enforced storage engineeebb3e41d6ae62b20d91e68cc874bd09L6 K M .InnoDB auto-increment lock modea1d74fbfc2f64ca22d5fa9426854afaeA5 5 M *Forced binlog format3125090e94331c1e9f29fa5a47c0b5e8S4 Y M!RPercentage of free disk space (tmpdir)41f0c643ff0fbbb888d0a71391e83658E3 = M N Free disk space (tmpdir)bed5fa22ec9966a9e1179f8bdf4a7e91!21Y aP= Storage engines are components that handle the SQL operation for different table types.  N9 enforce_storage_enginexMk This value must be 2 as other modes may cause INSERT statements on tables with AUTO_INCREMENT columns to fail. yLm It is used for generating auto-increment values.Traditional lock mode is 0,consecutive is 1 and interleaved is 2 _|UsIt should not be set to the string "gcomm://" as this may result in a new cluster being created after node restart.VQ' This value should be “InnoDB”, if it is available for the particular MySQL version.Adding ‘enforce_storage_engine=InnoDB’ in my.cnf file will start the server with InnoDB as enforced storage engineR7wsrep_cluster_addressKTThis gives cluster nodes addresses to connect to when starting up.lV9wsrep_replicate_myisam(XKPossible values for this are 'ON' or 'OFF'.'ON' indicates that MyISAM tables will be replicated and 'OFF' indicates that MyISAM tables will not be replicated. eYEThis value must be OFF, as it is still in the experimental phase and cannot be relied upon. TTnzf+wsrep_connectedph[It indicates whether the cluster is connected to the wsrep provider.Possible values are 'ON' or 'OFF'. i'Must be 'ON'.j/wsrep_evs_delayedal=This gives the list of all the nodes a particular node has registered on its delayed list,indicating the node in the list may be removed permanently from the cluster. The listing format is “uuid:address:count”.This represents the UUID and IP address of the delayed node,with a count of the number of the entries it has on the delayed list. dmCfunction() { if(this.Value !=" " ) return "Critical"; else return "None"; }n5wsrep_evs_evict_list QQONE_K * ONE_K; var ONE_G = ONE_M * ONE_K; var ONE_T = ONE_G * ONE_K;qfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_local_cert_failures)== "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_local_cert_failures; }3afunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_local_bf_aborts)== "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_local_bf_aborts; }5efunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_local_send_queue)== "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_local_send_queue; } WW'Ifunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_connected)== "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_connected; }<sfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalVariables.wsrep_replicate_myisam) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalVariables.wsrep_replicate_myisam; }:ofunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalVariables.wsrep_cluster_address) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalVariables.wsrep_cluster_address; } Lf[PE:/$H=|2'qt^wlS5 a*VK@i# #$ ## #" #! # % $ $  $ ~ $ } $ | $ { $ z $ y $ x $ w $ v $ u #  \ #  [ #  Z #  Y #  X # W # V # U # T # S # R # Q # P # O # N # M # L # K # J # I # H # ' # & % " #% % % % ! %  % %  % % % % % % ) %  " " " " " " " " " # # %  % %  " " " " " " " " -}-S!function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_flow_control_paused) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GloLfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_evs_evict_list)== "undefined") return "(n/a)"; else if (MONyog.MySQL.GlobalStatus.wsrep_evs_evict_list) return(MONyog.MySQL.GlobalStatus.wsrep_evs_evict_list); else return "(empty)";}yfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_evs_delayed)== "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; else if (MONyog.MySQL.GlobalStatus.wsrep_evs_delayed) return(MONyog.MySQL.GlobalStatus.wsrep_evs_delayed); else return "(empty)";} %%h0Kfunction(){ if(this.Value >0) return "Critical"; else return "None"; }3/cThis shows the number of non-InnoDB tables.v.gfunction() { var obj = MONyog.UserObject('Non-InnoDB_Tables_Count'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (!obj || !MONyog.MySQL.Custom.Available) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].count; } if (results.length == 0) results = '(n/a)'; return results; }=-w![MONyog.MySQL.GlobalStatus.wsrep_flow_control_paused] c?kw9wsrep_local_recv_queue%7%7 vYescuAfunction() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, true); }6tgIt indicates the percentage of time the cluster is in throttled state waiting for slower nodes to catch up,in other words,how much the slave lag is slowing down the cluster.!r?wsrep_flow_control_paused!q?This list must be empty. p-This lists the UUID's of all nodes removed from the cluster.The removed nodes can rejoin the cluster only when their mysqld process is restarted %E%%%7wsrep_local_bf_abortsm~UValues should be closer to 0, as considerably larger values than 0 indicate replication throttling. ;}s It is the instantaneous length of the send queue.  {9wsrep_local_send_queuezValue should be closer to 0,as values considerably larger than 0 means that node can not apply write sets as fast as they are received.oyYIt is the current length of the receive queue,which is the number of write-sets waiting to be applied. Y-It gives the total number of transactions that have failed certification tests. !?wsrep_local_cert_failures$CIncrease in this value is a good indication of some unexpected deadlock problem arising because of some local transaction getting aborted and rolled back. kQIt gives the total number of local transactions aborted by slave transactions while in execution. DY8 #This value periodically resets.The reset value can be controlled using the evs.stats_report_period parameter.The default value is 1 minute.% EThis setting provides information on the latency of the replication protocol.The variable format is Minimum/Average/Maximum/Standard Deviation/Sample Size. 9wsrep_evs_repl_latency#AIncrease in this value is a good indication of some unexpected deadlock problem arising because of some local transaction getting aborted and rolled back. t44< s function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalVariables.enforce_storage_engine) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalVariables.enforce_storage_engine; }<{ function() { if(MONyog.MySQL.Custom.Av  function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalVariables.innodb_autoinc_lock_mode) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalVariables.innodb_autoinc_lock_mode; }D  function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalVariables.wsrep_forced_binlog_format) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalVariables.wsrep_forced_binlog_format; }   ymfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_local_recv_queue)== "undefined") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_local_recv_queue; }mfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_local_send_queue)== "undefined") S!function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_flow_control_paused) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_flow_control_paused*100).toFixed(2) + "%"; }  )\<)  function() { if(this.Value != 2 && this.Value !="(n/a)") return "Critical"; else return "None"; }  function() { if(this.Value !="ROW" && this.Value !="(n/a)") return "Critical"; else return "None"; }  function() { if(this.Value !="Primary" && this.Value !="(n/a)") return "Critical"; else return "None"; }  Yes  Yes 20 5\mfunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MON5efunction() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_evs_repl_latency)== "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return MONyog.MySQL.GlobalStatus.wsrep_evs_repl_latency; }h!Kfunction(){if(this.Value=="OFF" && this.Value!="(n/a)") return "Critical"; else return "None";} mcmy2r2_function() { var obj = MONyog.UserObject('Tables_Without_Constraints'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for (i in obj) { if (results.length >0) results+='
    '; results += obj[i].count; } if (results.length == 0) results = '(n/a)'; return results; }1-This should return zero. Galera requires InnoDB storage engine. Non-transactional storage engines are not supported in multi-master replication. *PRF.bRB2 o 7 ['%'] B ['s'] G ['%'] D! ['%']r F ['%'] ? ['%'] = ['%'] ; ['%'] ["%"] 9 ['%'] E1   C!1  s A1 @1  % >1  % < 1"  % : 1:  % 81  % 615This should return zero. If you have a table without a primary/unique key, it is possible to use an AUTO_INCREMENT column to the table.g4Ifunction(){ if(this.Value >0) return "Critical"; else return "None"; },3SThis shows the number of tables without a primary/unique key. If there is no primary/unique key present then rows can appear in different order on different nodes. )YV~&)ZL i M#Host hitting the server the most by tablescans831db61cf4eedb4fc6bc7df9fbc62c7dPK S MqHTables without a primary/unique keyd7c19bd88206fe465d335ea79dd7334cJJ G Mm`Presence of Non-InnoDB tablesa0235b220e3c9162bd77b67d8eb26217UI [ M!Percentage of Time Cluster is Throttled8dcf842ff441332edf1a79ff20a9a605?H 1 M }Galera Transaction67eccd03c6882efc92e569005011b9f9@G 3 MyGalera Queue Lengthb542edc3f113607738fec84576298c11PE S MixLatency of the replication protocol789aabf76f7048677deb88c0d60b5cf7aD u MeNumber of transaction that failed certification test2d9ee883c753d7190f5c8bb3ba2e7302SC Y MaNumber of transaction aborted by slaveb98682addb41d714210b95a5ba20e76eFB ? M] Length of the send queue3d2dfe20575f19f080a4c99074f2b5b8IA E MY Length of the receive queue44112c9571468af3086dcab56ecfa32fX@ c MUPercentage of time the cluster is throttledd126b7fc990c241c534723e368b8274c 47}7yIm#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Displays the information about the hosts that access the server the most based on the table scans by fetching the data from the host_summary view in sys schemaI #function() { var obj=MONyog.UserO-#functioHHy#function() { var obj=MONyog.UserObject('Host_Hitting_by_Tablescans'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj=obj.select(); var results= ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].host; } if(results.length == 0) results='(n/a)'; return results; } <@@vKg#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Displays the information about the hosts that access the server the most based on the File IOs by fetching the data from the host_summary view in sys schemaC{#function() { var obj=MONyog.UserObject('Host_HiJ}Ju#function() { var obj=MONyog.UserObject('Host_Hitting_by_File_io'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].host; } if(results.length == 0) results='(n/a)'; return results; } 8:{:xMk#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Displays the information about the users that access the server the most based on the tablescans by fetching the data from the user_summary view in sys schemaC#function() { var obj=MONyog.UserObject('Users_HLL}#function() { var obj=MONyog.UserObject('Users_Hitting_by_Tablescans'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].user; } if(results.length == 0) results='(n/a)'; return results; } ;?~?vOg#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Displays the information about the users that access the server the most based on the File-ios by fetching the data from the user_summary view in sys schemaC}#function() { var obj=MONyog.UserObject('Users_HN~Nw#function() { var obj=MONyog.UserObject('Users_Hitting_by_File_io'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].user; } if(results.length == 0) results='(n/a)'; return results; } .x_x0Q[#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Lists the schema and tables based on the tables that are accessed the most in a server1#function() { var obj=MONyog.Us#PP5#function() { var obj=MONyog.UserObject('Object_accessed_the_most'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for(i in obj){ if(results.length >0) results+='
    '; results += obj[i].table_schema+'.' +obj[i].table_name; } if(results.length == 0) results='(n/a)'; return results; } :~&SG#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Lists the top 5 users based on the total latency of the statements executed.Dw#function() { var obj=MONyog.UserObject('UserR~Rw#function() { var obj=MONyog.UserObject('Users_statements_executed'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj=obj.select(); var results= ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].user; } if(results.length == 0) results='(n/a)'; return results; } yFyU'#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Lists the schema and the object based on the unused indexes.1I#function() { var obj=MONyog.Ushere to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for(i in obj){ if(results.length >0) results+='
    '; results += obj[i].object_schema+'.' +obj[i].object_name+'.' +obj[i].index_name; } if(results.length == 0) results='(n/a)'; return results; } dCd&WG#Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Lists the table_schema, table_name and name of the index that are redundant.5O#function() { var obj=MONyog.U?V9Vm#function() { var obj=MONyog.UserObject('Schema_Redundant_Index'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj=obj.select(); var results= ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].table_schema+'.'+obj[i].table_name+'.'+obj[i].redundant_index_name; } if(results.length == 0) results='(n/a)'; return results; } ;i# function() { var obj=MONyog.U XX # function() { var obj=MONyog.UserObject('Table_InnoDB_Buffer_Pool'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj = obj.select(); var results = ''; for(i in obj){ if(results.length >0) results+='
    '; results+=obj[i].object_schema+'.'+obj[i].object_name; // results += obj[i].SPACE_USED+'
    '; } if(results.length == 0) results='(n/a)'; return results //return results,(SafeDiv0(data/allocated*100).toFixed(2)+"%"); } *# function() { var obj=MONyog.U'Z!Z=# function() { var obj=MONyog.UserObject('Tables_with_full_table_scans'); if(!obj) { return "Custom SQL Object doesn't exist. Click here to add."; } if(!obj.isEnabled()) { return 'Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    '; } if (MONyog.MySQL.Custom.Available!=1) return '(n/a)'; obj=obj.select(); var results= ''; for(i in obj) { if(results.length >0) results+='
    '; results += obj[i].object_schema+'.'+obj[i].object_name; } if(results.length == 0) results='(n/a)'; return results; }RY# Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    List the tables that stores more pages in the InnoDB Buffer pool as and when a page’s content is requested by a query. F[F&\G# function () { if( this.Value.length > 0 && this.Value != '(n/a)' && (this.Value.indexOf("Custom SQL Object") < 0)) return "Critical"; else return "None"; }j]Ofunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(typeof(MONyog.MySQL.GlobalVariables.offline_mode) == "undefined") return "(n/a)"; return MONyog.MySQL.GlobalVariables.offline_mode; }}o# function () { if( this.Value.length > 0 && this.Value != '(n/a)') return "Critical"; else return "None"; }![=# Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    Lists the tables that performs a full table scan upon a query execution ^^7Requirement: MySQL 5.7+ or MySQL 5.6+ with sys schema being installed

    If the server is in the offline mode, then the connected client users who do not have the SUPER privilege are disconnected on the next request, with an appropriate error. Disconnection includes terminating running statements and releasing locks. All the thread ids of clients connected are retrieved and check if they are the super user. If no, then the thread is killed gracefully. Also ER_SERVER_OFFLINE_MODE is sent. Such clients also cannot initiate new connections, and receive an appropriate error.

    Connected client users who have the SUPER privilege are not disconnected, and can initiate new connections to manage the server. XSX! hX( ?b{"[MONyog.MySQL.GlobalVariables.innodb_autoinc_lock_mode] g#OnOfff%#RealTimeLined%#["On","Off"]/c[#Galera MyISAM tables replication status+aS"["InnoDB auto-increment lock mode"]-`W"Galera InnoDB Autoincrement Lock modeK_Only users who have the SUPER privilege can control offline mode. To put a server in offline mode, change the value of the offline_mode system variable from OFF to ON. To resume normal operations, change offline_mode from ON to OFF. In offline mode, clients that are refused access receive an ER_SERVER_OFFLINE_MODE error. <<Y&3Root_accounts_count$'Cfunction() { if(MONyog.MySQL.Security.Is_mysql_db_accessible != "Yes") return "(n/a)"; return MONyog.MySQL.Security.Root_accounts_count; }  A[=m]K9'At #[MONyog.MySQL.GlobalVariables.wsrep_replicate_myisam=='ON'?1:'',MONyog.MySQL.GlobalVariables.wsrep_replicate_myisam=='ON'?'':1]l%%["On","Off"]k7%Galera Cluster Status6ji$[MONyog.MySQL.GlobalStatus.wsrep_cluster_size]i3$["Number of nodes"]-hW$Number of nodes in the Galera clusters$Currentr"Currentq#Currentp%Current o%OnOffn%%RealTimeLineymm%[MONyog.MySQL.GlobalStatus.wsrep_connected == 'ON'?1:'', MONyog.MySQL.GlobalStatus.wsrep_connected == 'ON'?'':1] #O{[>%pS<% nR6kO"%"TokuDB - I/O!/!TokuDB - Settings#!#sys schema - TokuDB - Metrics}Galeram`)RealTimeChartsPerconaix&?Currently Connected Userse'MySQL Clustera'Worst Indexes]Disk InfoY-Dashboard System+Dashboard MySQLLinuxU$?Commands & Schema ChangesRMisc.N #ReplicationJ8!StatementsFP!Binary LogBh-Temporary Tables>#Index Usage:#Query Cache6 3 Table Cache & Locks2  Threads. + InnoDB - Others* # InnoDB Logs' - InnoDB Deadlocks#(%InnoDB Cache@-MyISAM Key CacheX3Current Connectionsp1Connection History!MySQL Logs5Excessive Privileges Security%General Info 5Z5&)#)= )Google Cloud SQL Metrics()(C(RDS/Aurora Instance Metrics@''AriaX&&Plugins%%=%Multi-Source ReplicationJB'$?$Performance Schema Events  u$UDO > v$UDO jj w$UDO jj x$UDO !!y##/3FixDecimalspValue, pDecimalsif(parseInt(pValue) == pValue) return pValue; return pValue.toFixed(pDecimals);a")=opopulateOutputtype, maxValue, avgValuevar output = ''; maxValue = parseInt(maxValue)*Math.pow(10,-9); avgValue = parseInt(avgValue)*Math.pow(10,-9); maxValue = maxValue.toFixed(3); avgValue = avgValue.toFixed(3); output += type + '_MAX:  ' + maxValue + '
    '; output += type + '_AVG:  ' + avgValue + '
    '; return output; 'x!s-x'c^ w M$wait/io/file/innodb/innodb_log_file (in milliseconds)8b2ecbd1a182d398170fd43bbcd0f53eE` ; M"Load avg for last 1 min8e38d6ed191cb6b615c96131afcd1ef79_ % MLoad Average07cf32fddb8b6dfd4f6be060ecb7bb59d] y M$wait/io/file/innodb/innodb_data_file (in milliseconds)e53b9ddc4e89514765808c9a5753d77fY\ c M$wait/io/file/sql/slow_log (in milliseconds)fe137b94e5fbf95952bc3d9eeec626c8V[ _ M$wait/io/file/sql/binlog (in milliseconds)9e5899fc3d33bfd291051a8b4c28a521CZ 7 M%Galera Cluster Status2a68b5558112fe6d14a1d3e7372a9d0cSY W M$Number of nodes in the galera clusterece970fec1cd4c47cb6f6272b619b00bUX [ M#Galera MyISAM tables replication statusd83c022585f8fba974ac15ffed262d0dTW Y M"Galera InnoDB Auto-Increment Lock modeaa56fa68cc83fa3d94e2f97906ad6fa99V % MJ8Offline_modea31e265ae8d1ede0624e8b05eb090072IU E M #'Tables with full table scansb59878086c0f67451ebb435555631eaf jjlyfyG$function() { var obj = MONyog.UserObject("Performance_Schema_Events"); if(!obj) { return "Cu ::_9$Requirement : MySQL v5.5+ This performs IO tracking to Innodb datafile at the SQL layer. READ_MAX is the maximum read time of the summarized events that are timed. READ_AVG is the average read time of the summarized events that are timed. WRITE_MAX is the maximum write time of the summarized events that are timed. WRITE_AVG is the average read time of the summarized events that are timed. MISC_MAX is the maximum time taken by the miscellaneous events that are timed._~9$Requirement : MySQL v5.5+ This performs IO tracking to slow query logs at the SQL layer. READ_MAX is the maximum read time of the summarized events that are timed. READ_AVG is the average read time of the summarized events that are timed. WRITE_MAX is the maximum write time of the summarized events that are timed. WRITE_AVG is the average read time of the summarized events that are timed. MISC_MAX is the maximum time taken by the miscellaneous events that are timed. AA>>Az;zq$function() { var obj = MONyog.UserObject("Performance_Schema_Events"); if(!obj) { return "Custom SQL Object doesnt exist. Click here to add."; } if(!obj.isEnabled()) { return "Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    "; } if (MONyog.MySQL.Custom.Available!=1) return "(n/a)"; /* You will have to call select here to fetch the resultset. */ var resultSet = obj.select(); var event = "wait/io/file/sql/slow_log"; /*Get the specific row from the result set */ var output = ""; for (i in resultSet) { if(resultSet[i].EVENT_NAME === event){ output += populateOutput("WRITE",resultSet[i].MAX_TIMER_WRITE,resultSet[i].AVG_TIMER_WRITE); return output; } } if(output.length === 0) output = "None"; return output; } __{{%$function() { var obj = MONyog.UserObject("Performance_Schema_Events"); if(!obj) { return "Custom SQL Object doesnt exist. Click 0) { temp = SafeDiv0(pBytes, (ONE_T)); ret = FixDecimals(tb + temp, pDecimals) + "T"; return ret; } gb = ToInt(pBytes /(ONE_G)); pBytes -=(gb * ONE_G); if(gb>0) { temp = SafeDiv0(pBytes, (ONE_G)); ret = FixDecimals(gb + temp,pDecimals) + "G"; return ret; } mb = ToInt(pBytes /(ONE_M)); pBytes -=(mb * ONE_M); if(mb>0) { temp = SafeDiv0(pBytes, (ONE_M)); ret = FixDecimals(mb + temp,pDecimals) + "M"; return ret; } kb = ToInt(pBytes / ONE_K); pBytes -= (kb * ONE_K); if(kb>0) { temp = SafeDiv0(pBytes, (ONE_K)); ret = FixDecimals(kb + temp, pDecimals) + "K"; return ret; } return FixDecimals(pBytes, pDecimals);; return output; } 3Performance Metrics ==Q++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)u --tabledashboard_masterdashboard_masterCREATE TABLE "dashboard_master" ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, dashboard_name TEXT NOT NULL UNIQUE, mysql_charts TEXT, system_charts TEXT, multiserver_height_width TEXT )@ S-indexsqlite_autoindex_dashboard_master_1dashboard_masterrN55=tabledashboard_singleviewdashboard_singleviewCREATE TABLE "dashboard_singleview" ( [id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [dashboard_id] INTEGER NOT NULL, [chart_group_id] INTEGER NOT NULL, [chart_id] INTEGER NOT NULL, [width] INTEGER NOT NULL DEFAULT 400, [height] INTEGER NOT NULL DEFAULT 250)a target=\"_blank\" class=\"link\" href=\"mcso.html#?csoid=28\">here to add."; } if(!obj.isEnabled()) { return "Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    "; } if (MONyog.MySQL.Custom.Available!=1) return "(n/a)"; /* You will have to call select here to fetch the resultset. */ var resultSet = obj.select(); var event = "wait/io/file/innodb/innodb_log_file"; /*Get the specific row from the result set */ var output = ""; for (i in resultSet) { if(resultSet[i].EVENT_NAME === event){ output += populateOutput("READ",resultSet[i].MAX_TIMER_READ,resultSet[i].AVG_TIMER_READ); output += populateOutput("WRITE",resultSet[i].MAX_TIMER_WRITE,resultSet[i].AVG_TIMER_WRITE); output += populateOutput("MISC",resultSet[i].MAX_TIMER_MISC,resultSet[i].AVG_TIMER_MISC); return output; } } if(output.length === 0) output = "None"; return output; } 5dashboard_singleview %/22222{R)-W['1 Minute','5 Minutes','15 Minutes']Current%RealTimeLine1][CheckForSystem() ? MONyog.System.LoadAvg.last_1_min:0, CheckForSystem() ? MONyog.System.LoadAvg.last_5_min:0, CheckForSystem() ? MONyog.System.LoadAvg.last_15_min:0 ])%Average LoadW)$Requirement : MySQL v5.5+ This performs IO tracking of Innodb logs at SQL layer. READ_MAX is the maximum read time of the summarized events that are timed. READ_AVG is the average read time of the summarized events that are timed. WRITE_MAX is the maximum write time of the summarized events that are timed. WRITE_AVG is the average read time of the summarized events that are timed. MISC_MAX is the maximum time taken by the miscellaneous events that are timed."_blank\" class=\"link\" href=\"mcso.html#?csoid=28\">here to add."; } if(!obj.isEnabled()) { return "Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    "; } if (MONyog.MySQL.Custom.Available!=1) return "(n/a)"; /* You will have to call select here to fetch the resultset. */ var resultSet = obj.select(); var event = "wait/io/file/innodb/innodb_data_file"; /*Get the specific row from the result set */ var output = ""; for (i in resultSet) { if(resultSet[i].EVENT_NAME === event){ output += populateOutput("READ",resultSet[i].MAX_TIMER_READ,resultSet[i].AVG_TIMER_READ); output += populateOutput("WRITE",resultSet[i].MAX_TIMER_WRITE,resultSet[i].AVG_TIMER_WRITE); output += populateOutput("MISC",resultSet[i].MAX_TIMER_MISC,resultSet[i].AVG_TIMER_MISC); return output; } } if(output.length === 0) output = "None"; return output; } @@@@@@ BBtfXJ:o#function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) ret = MONyog.System.LoadAvg.last_15_min; else ret = "(n/a)"; return ret; }#System5e#If load avg value is more that the number of CPU in a system, it is considered that processes are waiting for CPU cycles. Following can be cause of high load avg.
    1. CPU bound processes waiting for cpu cycles.
    2. High memory consumption.
    3. I/O bound processes waiting over resources. # Avg # Yes #Yes#function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return GetWarnStatusFloat(this.Value, this.Critical * MONyog.System.Cpu.sys_cpu_count , this.Warning * MONyog.System.Cpu.sys_cpu_count, true); else return 'None'; } #1 #0.9)O#Load avaerage for last 15 minutes/[#Calculated from values at /proc/loadavg  ZI'K"Load avaerage for last 1 minute'"System5&e"If load avg value is more that the number of CPU in a system, it is considered that processes are waiting for CPU cycles. Following can be cause of high load avg.
    1. CPU bound processes waiting for cpu cycles.
    2. High memory consumption.
    3. I/O bound processes waiting over resources. %" Avg $" Yes #"Yes""function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return GetWarnStatusFloat(this.Value, this.Critical * MONyog.System.Cpu.sys_cpu_count , this.Warning * MONyog.System.Cpu.sys_cpu_count, true); else return 'None'; } !"1 "0.9&9m"function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) ret = MONyog.System.LoadAvg.last_1_min; else ret = "(n/a)"; return ret; }/["Calculated from values at /proc/loadavg  Vypg^ULC:1( }tkbYPG5,>#xof]TKB90'-,+))))+* *) )( (((((('' ' ' ' ' ''''''''&&&&&% %%%%%%%%$$$$# # ########"""""""" " " " " """"""""!! ! ! ! ! !!!!!! 5tbTF55554%System 3% Yes 2%Yese1E%function() { return GetWarnStatusInt(this.Value, this.Critical, this.Warning, false); } 0%20 /%30 -%function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) { if( MONyog.System.Disk.sys_disk_freepercent_binlog != "(n/a)") return ( MONyog.System.Disk.sys_disk_freepercent_binlog + "%"); } return "(n/a)"; }0,]%(free disk space/Total disk space)*100 .R*$System<(u$Free disk space, received by executing 'df' command. J|qf[PE:/$ti^SH=2'wlaVK@5* _!    `            ^ ] \ [  Y Z X W V U  T S R Q P O  N  M  L  K  J  I  7  6  5  4  3  2  !              !              !             !        !       3-:7%All_Slave_Not_RunningM7%%All_channels6$Amount of free space left on the volume where Binary log file resides. NOTE: This monitor will show value only for MySQL 5.6.2 and above.O5%This value indicates the percentage of free space left on the volume, if this value is less consider increasing size of the volume. NOTE: This monitor will show value only for MySQL 5.6.2 and above. , }`2p7~}1In E M&'Server Audit' plugin status2d04e83c6650cce72a814d8c1b9c1a0bMm O M&'Validate Password' plugin statusff3a4d67131506bda3efee6e063da1fb!l1 %>k / M%@Last error number38e8e695c83da0a9b7a006dd757422a3;g ) M%pLast I/O error89e861a820ba29b0363c23f108dd4fe3Dh ; M%SQL threads not runningc63a1276d1628e0733f6f2dc2a815f838e # M%Not runningf40a783b60253354616cc4c5962b83d97d # M%Connectionscf553eaa877dc763f82680d2f72ed97f 7Bi 7 M%Seconds behind mastera85fefe28417aff04d4260eaddf3eb717j ! M%XLast errore85782af987ecc3fd24afb72d7340f5aDf ; M% I/O threads not running05f7ce8a78b6de1e99f0b89c22d1baa9^c o M%UPercentage of free disk space (Binary log volume)669c69828f8dfe03224cf31190c89c91Pb S M$UFree disk space (Binary log volume)4e42b6ac421bbf77c6e41e65275d5ebeJa E M#Load avg for last 15 minutes5f340b0fa2361aace4c04a29d076ceff o > pW>PPPPomH)%All_Last_ErrnoG)%All_Last_ErrorF/%All_Last_IO_Error!E?%All_Seconds_Behind_Master!D?%All_Slave_SQL_Not_Running C%Yes B %function() { if(this.Value != "None" && this.Value != "(n/a)") return "Critical"; else return "None"; }m ?=%All_Slave_IO_Not_Running >%Yes = %function() { if(this.Value != "None" && this.Value != "(n/a)") return "Critical"; else return "None"; }f QY%function() { var str = this.Value.toString(); var temp = str.match(/[^\s]+/g); var c = false; var w = false; var ret; for(var i = 0; i < temp.length ; i++) { if(temp[i] == "NULL") return "Critical"; ret = GetWarnStatusInt(temp[i], this.Critical, this.Warning, true); if(ret == 'Critical') { c = true; break; } else if(ret == 'Warning') { w = true; } } if(c) return 'Critical'; if(w) return 'Warning'; else return 'None'; } X %function() { if(this.Value != "None" && this.Value != "(n/a)") return "Critical"; else return "None"; } V%Yes U%Yes T%Yes S%YesCP%The last error message that caused the I/O thread to stop. sa%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Last_Errno; } else { return "(n/a)"; } }sa%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Last_Error; } else { return "(n/a)"; } }wi%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Last_IO_Error; } else { return "(n/a)"; } } aaa[H %This value shows the name of all the connections for the slave.%function() { if(this.Value == "(n/a)" || ( !MONyog.MySQL.Slave.All_Last_Error_Changed || (MONyog.MySQL.Slave.All_Last_Error_Changed && MONyog.MySQL.Slave.All_Last_Error_Changed == "No"))) return "None"; else return "Critical"; }1%function() { if(this.Value == "(n/a)" || ( !MONyog.MySQL.Slave.All_Last_IO_Error_Changed || (MONyog.MySQL.Slave.All_Last_IO_Error_Changed && MONyog.MySQL.Slave.All_Last_IO_Error_Changed == "No"))) return "None"; else return "Critical"; } Oafunction() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false) return "(n/a)"; if(MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; else return MONyog.MySQL.GlobalVariables.read_only; } ]%600 \%450 ""ofunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "Use Multi-Source Replication group to monitor this slave"; if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave)) { if(MONyog.MySQL.GlobalVariables.show_compatibility_56 && MONyog.MySQL.GlobalVariables.show_compatibility_56 == "OFF") { return "(n/a)"; } if(IsSlaveRunning(MONyog.MySQL.GlobalStatus.Slave_running)) return "Yes"; else return "No"; } else { return "(not configured)"; } }n!' NumCounterm!' NumCounterl!' NumCounterk!' NumCounter g function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Last_Errno || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Last_Errno; }Mf function() { if(typeof(MONyog.MySQL.GlobalVariables.slave_skip_errors) == "undefined") return "(n/a)"; if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.GlobalVariables.slave_skip_errors; }e+ function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Seconds_Behind_Master || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Seconds_Behind_Master; } 8ikfunction() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || MONyog.MySQL.Slave.IsMultiSource == 'Yes' || typeof(MONyog.MySQL.GlobalVariables.slave_net_timeout) == "undefined") return "(n/a)"; return TimeUnits(MONyog.MySQL.GlobalVariables.slave_net_timeout); }0j[function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.GlobalStatus.Slave_retried_transactions || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.GlobalStatus.Slave_retried_transactions; }h function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Last_Error || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return (MONyog.MySQL.Slave.Last_Error); } u1function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Relay_Log_Space || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return NumCounter(MONyog.MySQL.Slave.Relay_Log_Space, 1); } t function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Relay_Log_Pos || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; return MONyog.MySQL.Slave.Relay_Log_Pos; } lxS"function() { if(typeof(MONyog.MySQL.GlobalVariables.sync_master_info) == "undefined" || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)" return MONyog.MySQL.GlobalVariables.sync_master_info; }owY!function() { if(typeof(MONyog.MySQL.GlobalVariables.relay_log_recovery) == "undefined" || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)" return MONyog.MySQL.GlobalVariables.relay_log_recovery; }v function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) == false || !MONyog.MySQL.Slave.Last_IO_Error || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)"; if(MONyog.MySQL.Slave.Last_IO_Error =="MySQL user requires 'replication client' privilege for displaying this data") return MONyog.MySQL.Slave.Last_IO_Error; else return MONyog.MySQL.Slave.Last_IO_Errno + " " + MONyog.MySQL.Slave.Last_IO_Error; } wwwww%&server_auditsq{/&validate_passwordsza$function() { if(typeof(MONyog.MySQL.GlobalVariables.sync_relay_log_info) == "undefined" || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)" return MONyog.MySQL.GlobalVariables.sync_relay_log_info; }hyK#function() { if(typeof(MONyog.MySQL.GlobalVariables.sync_relay_log) == "undefined" || MONyog.MySQL.Slave.IsMultiSource == 'Yes') return "(n/a)" return MONyog.MySQL.GlobalVariables.sync_relay_log; } FVK@5* ti^HS=2'/$wla[[E: ' S % : % ' V ' C ' N ' M ' L %  % % % % %  %  % % * ' B ' A ' @ ' ? ' > ' = ' < ' ; %  % ' U ' T & & 1 &  & & 0 &  &  & / &  & . & $ & & # & - & % , %  % % %  % + %  % ' D ' l % %  % ' k ' j ' iM ' R ' J ' I ' Q ' H ' m ' G ' P ' F ' E ' O G*b:::'l+ z o%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Slave_Not_Running; } else { return "(n/a)"; } } /&This value shows the names of all the plugins for which PLUGIN_MATURITY is not equal to 'Stable' or '(n/a)' if MySQL version is less than 5.1.15+ Q&This value shows the names of all the plugins whose LOAD_OPTION is 'ON' but PLUGIN_STATUS is not equal to 'ACTIVE' or '(n/a)' if MySQL version is less than 5.1.15)&failed_plugins1&non_stable_plugins-&This value will be 'Yes' if value of LOAD_OPTION column for server_audit is FORCE_PLUS_PERMANENT or '(n/a)' if MySQL version is less then 5.1.15/&audit_load_option ~w%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Seconds_Behind_Master; } else { return "(n/a)"; } }}u%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Slave_IO_Not_Running; } else { return "(n/a)"; } }~w%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Slave_SQL_Not_Running; } else { return "(n/a)"; } } rrled for this server.
    Click here to enable it.
    '; } var metric = "{metricName:MONyog.System.Gcs."+pMetricName+", metricStatus:MONyog.System.Gcs."+pMetricName+"_status}"; eval('var obj='+metric); if(obj.metricStatus && obj.metricStatus != "SUCCESS"){ return obj.metricStatus; } if(!obj.metricName) { return 'Custom GCS Object for this monitor is not enabled.
    Click here to enable it.
    '; } var metricVal; metricVal = obj.metricName; return metricVal;  <q,<i"Z%3Galera Queue Length",A!["Cluster Throttled Time"]/+[!Percentage of Time Cluster is Throttledn*W [MONyog.MySQL.GlobalStatus.wsrep_local_bf_aborts,MONyog.MySQL.GlobalStatus.wsrep_local_cert_failures]D) ["Transaction Aborted","Transaction Certification Failure"](1 Galera Transactionl'S[MONyog.MySQL.GlobalStatus.wsrep_local_recv_queue,MONyog.MySQL.GlobalStatus.wsrep_local_send_queue]4&e["Receive Queue Length","Send Queue Length"]g$Ifunction(){if(this.Value=="ON" && this.Value!="(n/a)") return "Critical"; else return "None";}m#Ufunction(){if(this.Value=="gcomm://" && this.Value!="(n/a)") return "Critical"; else return "None";}k function() { if(this.Value !="InnoDB" && this.Value != "(n/a)") return "Critical" " function() { if(this.Value !="InnoDB" && this.Value != "(n/a)") return "Critical"; else return "None"; } $$X+%If the I/O thread is no longer running for a connection, check the slave's error log for messages that may indicate why this thread may have stopped. Check the last 100 lines of the error log to see if that gives a clue. Usually the problem is a wrong position given in the CHANGE MASTER TO command. Often the easiest fix is to set up the slave connection again just as if it was a new slave. The last error can be determined by Last Error Number and Last Error. )r6U %%This value shows the name of all connections that are currently not running.S!%This value is useful only if the network between Slave and Master is fast. If the network is fast, investigate why a connection is so far behind the master. Sometimes, other processes on the slave can impact the MySQL server. Try to improve the connectivity between the Master and Slave.This value can also get very high if the Slave was unable to to connect to MASTER at some point in time. In that case, the slave would eventually catch up with the master. ####u)e%function() { if(IsReplicationSlave(MONyog.Server.Config.IsReplicationSlave) && MONyog.MySQL.Slave.IsMultiSource == 'Yes') { return MONyog.MySQL.Slave.All_Channel_Name; } else { return "(n/a)"; } }l$%&This value shows the status of validate_password plugin. It will be '(n/a)' if plugin is not present or if MySQL version is less than 5.1.15\"3%This value shows the name of all connections for which SQL threads are not running.%#%&This value shows the status of validate_password plugin. It will be '(n/a)' if plugin is not present or if MySQL version is less than 5.1.15\!3%This value shows the name of all connections for which I/O threads are not running. \ O8/k&function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.Plugin.audit_load_option) return "(n/a)"; else return MONyog.MySQL.Plugin.audit_load_option; }..W&function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.Plugin.server_audit) return "(n/a)"; else return MONyog.MySQL.Plugin.server_audit; }8-k&function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.Plugin.validate_password) return "(n/a)"; else return MONyog.MySQL.Plugin.validate_password; }L,%The last error number returned by the most recently executed query.M+%The last error message returned by the most recently executed query. *;%Try to find out why the slave SQL thread is no longer running on this server.The last error can be determined by 'Last error number' and 'Last error’ Oyl6S'["Aria_pagecache_blocks_used", "Aria_pagecache_blocks_unused", "Aria_pagecache_blocks_not_flushed"]57'Aria Pagecache Blocks[41&[MONyog.MySQL.GlobalStatus.Aria_pagecache_reads, MONyog.MySQL.GlobalStatus.Aria_pagecache_writes, MONyog.MySQL.GlobalStatus.Aria_pagecache_read_requests, MONyog.MySQL.GlobalStatus.Aria_pagecache_write_requests]{3q&["Aria_pagecache_reads", "Aria_pagecache_writes", "Aria_pagecache_read_requests", "Aria_pagecache_write_requests"]#2C&Aria Pagecache Reads/Writes,1S&function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.Plugin.failed_plugins) return "(n/a)"; return MONyog.MySQL.Plugin.failed_plugins; }-0U&function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.Plugin.non_stable_plugins) return "(n/a)"; return MONyog.MySQL.Plugin.non_stable_plugins; } ?H#? A{TT$FE'Aria_pagecache_blocks_unused+ES'Blocks used in the Aria page cache."DA'Aria_pagecache_blocks_usedHC 'The number of requests to write a block to the Aria page cache.%BG'Aria_pagecache_write_reques=<u'function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_reads) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_reads; }>7'Aria_pagecache_writesb=?'The number of Aria page cache read requests that caused a block to be read from the disk.!'function();5'Aria_pagecache_reads>:y([MONyog.MySQL.GlobalStatus.Aria_transaction_log_syncs]&9I(["Aria_transaction_log_syncs"]"8A(Aria Transaction Log Syncs47c'[MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_used, MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused, MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_not_flushed]N,8 "(.4:@FLRX^djp|ztnhbv\VPJD>2,P=c?8!j_XPL>  !,02GIKMOQSUWXZ]^gtu˜vØwĘxǘyɘzʘ{˘}Șҙՙ֙'ؙ4ڙ:ܙOoݙYacdgjjmnposux+ ޚߚ )/6 ]5pjEAL}'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_writes) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_writes; }$FE'Aria_pagecache_blocks_unused+ES'Blocks used in the Aria page cache."DA'Aria_pagecache_blocks_usedHC 'The number of requests to write a block to the Aria page cache.%BG'Aria_pagecache_write_requestsKA'The number of requests to read something from the Aria page cache.$@E'Aria_pagecache_read_requestsG? 'The number of blocks written to disk from the Aria page cache.&KI'The number of Aria log fsyncs."JA'Aria_transaction_log_syncs9Io'The number of dirty blocks in the Aria page cache)HO'Aria_pagecache_blocks_not_flushed+GS'Free blocks in the Aria page cache. -XOP'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused; }KO'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_used) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_used; }QN'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_write_requests) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_write_requests; }OM'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_read_requests) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_read_requests; } #T)[X1' function() { if(MONyog.MySQL.Custom.Available != 1 || !MONyog.MySQL.GlobalVariables.aria_pagecache_buffer_size) return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.aria_pagecache_buffer_size); }"WA' Aria_pagecache_buffer_size(VM' MONyog.MySQL.GlobalStatus.Uptime(UM' MONyog.MySQL.GlobalStatus.Uptime(TM' MONyog.MySQL.GlobalStatus.Uptime(SM' MONyog.MySQL.GlobalStatus.UptimeKR'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_transaction_log_syncs) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_transaction_log_syncs; }YQ-'function() { if (MONyog.MySQL.Custom.Available !=1 || !MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_not_flushed) return "(n/a)"; return MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_not_flushed; } c%WFk%C| 7 M'Transaction Log Syncs3736292679387e0e1753e440f56f1315J{ E M'Pagecache blocks not flushed9df9dd31c8ffb78f00498b3547abIn E M&'Server Audit' plugin statusf3318e66586315f3979ba359c1c67f16Cy 7 M'Pagecache blocks usedbc93150d1c51534140799246704cb8b7Fx = M'Pagecache Write Requests2740fa5bb324a38b0e31ed8e0de1de13Ew ; M'(Pagecache Read Requests238e8f0c49c046b2293cc9ed721bdb17>v - M'@Pagecache Writese8a4eb7a4341fb13918f4d886ffe66b2s - M'XPagecache Blockscc1d0224e860558a17fb88d346b78abdDr 9 M&pPagecache Reads/Writesc2c67ca421ff477aa1406f6bbd3a5fbd;q ) M&Plugins failed7d14d5b176704cadf97610357cb07466?p 1 M&Non mature plugins24c884c59c8058dfad789cc04a3ea198Xo c M& 'Force + Permanent' set for 'Server Audit'?7a942d01bb58b6ec84951033bd1032a7 9I/Di9-_W' The number of blocks in the key cachel^S' function() { if(MONyog.MySQL.Custom.Available != 1) return "(n/a)"; if(MONyog.MySQL.GlobalVariables.aria_block_size && MONyog.MySQL.GlobalVariables.aria_pagecache_buffer_size) return NumCounter(SafeDiv0(MONyog.MySQL.GlobalVariables.aria_pagecache_buffer_size, MONyog.MySQL.GlobalVariables.aria_block_size)); return "(n/a)"; }2]a' aria_pagecache_buffer_size/aria_block_size3\c' Block size to be used for Aria index pages.g[I' function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables.aria_block_size) == "undefined") return "(n/a)"; return NumCounter(MONyog.MySQL.GlobalVariables.aria_block_size); }Z+' aria_block_size3Ya' The size of the buffer used for index blocks for Aria tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford. !?gY!D/ h' Yesj!' NumCounteri!' NumCounter g' Yes(eM' The fraction of key cache in use)dM' function() { var value = AriaPercentUsed(); if(MONyog.MySQL.Custom.Available != 1 || value == "(n/a)") return "(n/a)"; return value + "%" }Wc)' 1- ( Aria_pagecache_blocks_unused/(aria_pagecache_buffer_size/aria_block_size)3bc' The number of used blocks in the page cacheUa%' function() { if(MONyog.MySQL.Custom.Available != 1 || typeof(MONyog.MySQL.GlobalVariables. aria_block_size) == "undefined" || typeof(MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused) == "undefined") { return "(n/a)"; } return NumCounter(SafeDiv0(MONyog.MySQL.GlobalVariables.aria_pagecache_buffer_size, MONyog.MySQL.GlobalVariables.aria_block_size) - MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused); } U`%' (aria_pagecache_buffer_size/aria_block_size) - Aria_pagecache_blocks_unused $+AriaPercentUsedif(!MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused) MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused = 0; if(MONyog.MySQL.GlobalVariables.aria_block_size && MONyog.MySQL.GlobalVariables.aria_pagecache_buffer_size) { var blocks=SafeDiv0(MONyog.MySQL.GlobalVariables. aria_pagecache_buffer_size, MONyog.MySQL.GlobalVariables.aria_block_size).toFixed(0); return((1 - SafeDiv0(MONyog.MySQL.GlobalStatus.Aria_pagecache_blocks_unused, blocks))*100).toFixed(3); } else return "(n/a)"; |p_4|...(System#iJ*Q(MONyog.System.Aws.FreeStorageSpaceO(xM(MONyog.System.Aws.FreeableMemory"wA(MONyog.System.Aws.ReadIOPS#vC(MONyog.System.Aws.WriteIOPS(uM(MONyog.System.Aws.CPUUtilizationt(Systems(Systemr(Systemq(SystemYp-This value determines whether this server is running as a Replication Slave connected to a master. For MySQL 5.7.6 and above this value will make sense only if ‘show_compatibility_56’ is ON.
    (Note: To enable it add the line "show_compatibility_56=ON" under [mysqld] in MySQL configuration file and restart the MySQL server.) kk&+#YGetGCSMetricValpMetricNameif(MONyog.Server.Config.IsGCS ==0){ return '(n/a)'; } if(!CheckForSystem()){ return 'System Metrics are  %+#YGetAWSMetricValpMetricNameif(MONyog.Server.Config.IsRDS ==0){ return '(n/a)'; } if(!CheckForSystem()){ return 'System Metrics are no P=aE:/$tH'i=^2SycXnxmaU==5 << >>6P==5P<<4P;;3 P::2 P991 P880 P77/ P66. P55- P44, Py33+ Pn22* Pc11) PX00( PM//' +* j` *) iH ) G )F )E  )D ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( x ( w ( v ( t ( s ( r ( q ( u ' h ' g '  e '  d '  c ' n '  b '  a '  ` '  _ '  ^ '  ] '  \ '  [ '  Z '  Y '  X '  W' ) ? )> )=  )< ) ; ): )9  )8  ) 0  )/  ). )) ) C )B )A  )@ k`TB";;;;Z:"A["Read IOPS","Write IOPS"]7RDS - Read/Write IOPSCurrent%RealTimeLine-1["CPUUtilization"]7RDS - CPU Utilization ( YesRX0!%RealTimeLine-3["Freeable Memory"]7RDS - Freeable Memory Current CurrentCurrentCurrent%RealTimeLineD(M(MONyog.System.Aws.DiskQueueDepth#C(MONyog.System.Aws.SwapUsage(System(System- 8sZ9n0f"x8=8w[CheckForSystem()?MONyog.System.Aws.FreeableMemory:0]g7I[CheckForSystem()?MONyog.System.Aws.ReadIOPS:0,CheckForSystem()?MONyog.System.Aws.WriteIOPS:0]=6w[CheckForSystem()?MONyog.System.Aws.CPUUtilization:0]A5(function(){ return GetAWSMetricVal("DiskQueueDepth"); } <4u(function(){ return GetAWSMetricVal("SwapUsage"); } D3(function(){ return GetAWSMetricVal("FreeStorageSpace"); } A2(function(){ return GetAWSMetricVal("FreeableMemory"); } ;1s(function(){ return GetAWSMetricVal("ReadIOPS"); } <0u(function(){ return GetAWSMetricVal("WriteIOPS"); } A/(function(){ return GetAWSMetricVal("CPUUtilization"); } . Current-% RealTimeLine+5 ["Disk Queue Depth"]*9 RDS - Disk Queue Depth() ["Swap Usage"]'- RDS - Swap Usage%9 ["Free Storage Space"] $= RDS - Free Storage Space#% RealTimeLine"% RealTimeLine CO2?_ function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return StorageUnits(MONyog.System.Disk.sys_disk_free_tmpdir); return "(n/a)"; }2>_function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return StorageUnits(MONyog.System.Disk.sys_disk_free_innodb); return "(n/a)"; }<=uFree disk space, received by executing 'df' command.1<]function() { if(CheckForSystem() && MONyog.System.Custom.Available == 1) return StorageUnits(MONyog.System.Disk.sys_disk_free_mysql); return "(n/a)"; }=;w [CheckForSystem()?MONyog.System.Aws.DiskQueueDepth:0]8:m [CheckForSystem()?MONyog.System.Aws.SwapUsage:0]?9{ [CheckForSystem()?MONyog.System.Aws.FreeStorageSpace:0]t enabled for this server.
    Click here to enable it.
    '; } var metric = "{metricName:MONyog.System.Aws."+pMetricName+", metricStatus:MONyog.System.Aws."+pMetricName+"_status, metricUnit:MONyog.System.Aws."+pMetricName+"_unit}"; eval('var obj='+metric); if(obj.metricStatus && obj.metricStatus != "SUCCESS"){ return obj.metricStatus; } if(!obj.metricName) { return 'Custom AWS Object for this monitor is not enabled.
    Click here to enable it.
    '; } var metricVal; if(obj.metricUnit == 'Bytes'){ metricVal = obj.metricName; return StorageUnits(metricVal,2); }else if(obj.metricUnit == 'Count'){ return parseFloat(obj.metricName).toFixed(4); }else{ metricVal = parseInt(obj.metricName).toFixed(2); if(obj.metricUnit =='Percent'){ obj.metricUnit = '%'; } return metricVal+" "+obj.metricUnit; }es = 0; if(seconds == 0) { ret = String(seconds) + " sec"; return ret; } years = ToInt(seconds / 31536000); seconds -=(years * 31536000); days = ToInt(seconds / 86400) seconds -=(days * 86400); hours = ToInt(seconds / 3600); seconds -=(hours * 3600); minutes = ToInt(seconds / 60); seconds -=(minutes * 60); if(years) { ret += String(years); if(years > 1) ret += " yrs "; else ret += " yr "; } if(days) { ret += String(days); if(days > 1) ret += " days "; else ret += " day "; } if(hours) { ret += String(hours); if(hours > 1) ret += " hrs "; else ret += " hr "; } if(minutes) { ret += String(minutes); if(minutes > 1) ret += " mins "; else ret += " min "; } if(seconds) { ret += String(seconds); if(seconds > 1) ret += " secs"; else ret += " sec"; } return ret; 3P31 Key_write_requests7i Tuning cache size is not an easy task. Cache hit ratio is not a metric you should use to tune cache size. Instead check Cache misses and follow the advise there. Remember you need to wait till the server is running for a reasonable warm-up time before you get a meaningful cache hit rate.(M MONyog.MySQL.GlobalStatus.Uptime ~ Yes } Yes | Yes{ function() { var value = CachePercentUsed(); if(MONyog.MySQL.GlobalStatus.Key_read_requests>1000 && parseInt(value)>80) { return GetWarnStatusInt(value, this.Critical, this.Warning, false); } else return "None"; } z 85 y 95 j[8)pa:+bS,xxxxxxxx$E ['', 'KB', 'MB', 'GB', 'TB'] $E ['', 'KB', 'MB', 'GB', 'TB'] !1024$E ['', 'KB', 'MB', 'GB', 'TB'] !1024$E ['', 'KB', 'MB', 'GB', 'TB'] !1024$ E ['', 'KB', 'MB', 'GB', 'TB'] !1024$ E ['', 'KB', 'MB', 'GB', 'TB'] !1024$E ['', 'KB', 'MB', 'GB', 'TB'] !1024$E ['', 'KB', 'MB', 'GB', 'TB'] !1024$E ['', 'KB', 'MB', 'GB', 'TB'] ~!1024$}E ['', 'KB', 'MB', 'GB', 'TB'] {(!1000 z=( ['', 'K', 'M', 'G', 'T'] x'!1000 w=' ['', 'K', 'M', 'G', 'T'] u&!1000 t=& ['', 'K', 'M', 'G', 'T'] r$!1000 q=$ ['', 'K', 'M', 'G', 'T'] o !1000 n= ['', 'K', 'M', 'G', 'T'] l!1000 k= ['', 'K', 'M', 'G', 'T'] i!1000 h= ['', 'K', 'M', 'G', 'T'] f!1000 e= ['', 'K', 'M', 'G', 'T'] d!1000 G @5*wlaVKH=2'|qf[PE:/$ti^S                                  ,    3  2  1  0  +  *  6  (  '                                L^7(tfVn- ,=I, Identifying the most advanced node in the cluster requires that you find the node with the most advanced sequence number. You can determine this using th$E ['', 'KB', 'MB', 'GB', 'TB']+9function() { if(MONyog.MySQL.Custom.Available != 1|| typeof(MONyog.MySQL.GlobalStatus.wsrep_last_committed) == "undefined" || MONyog.MySQL.GlobalStatus.wsrep_cluster_state_uuid == "") return "(n/a)"; return (MONyog.MySQL.GlobalStatus.wsrep_last_committed); }* 5wsrep_last_committed  )$ ( ['%'] '# UDO &# UDO %#UDO $#UDO ##UDO "#UDO !#UDO #UDO #UDO #UDO  !1024$E ['', 'KB', 'MB', 'GB', 'TB']  !1024$E ['', 'KB', 'MB', 'GB', 'TB']  !1024') O)MONyog.System.Gcs.CPU_Utilization" O+MONyog/)+$ .  !1024$E ['', 'KB', 'MB', 'GB', 'TB'] !1024stom SQL Object doesnt exist. Click here to add."; } if(!obj.isEnabled()) { return "Custom SQL Object for this monitor is not enabled.
    Click here to enable it.
    "; } if (MONyog.MySQL.Custom.Available!=1) return "(n/a)"; /* You will have to call select here to fetch the resultset. */ var resultSet = obj.select(); var event = "wait/io/file/sql/binlog"; /*Get the specific row from the result set */ var output = ""; for (i in resultSet) { if(resultSet[i].EVENT_NAME === event){ output += populateOutput("READ",resultSet[i].MAX_TIMER_READ,resultSet[i].AVG_TIMER_READ); output += populateOutput("WRITE",resultSet[i].MAX_TIMER_WRITE,resultSet[i].AVG_TIMER_WRITE); output += populateOutput("MISC",resultSet[i].MAX_TIMER_MISC,resultSet[i].AVG_TIMER_MISC); return output; } } if(output.length === 0) output = "None"; return output; }  s2yUb'j,;Y ) Mm`Relay log file2e39f438c602a582d0533b719fb2d134I MeRelay master log file positionc61c56fb136c809393fe338d75033590 )m`Relay log file!X1ix'7 #(Seconds behind master!E1@8Q # MN Master portb26fb372af90c44aef60115608a283c18P # MJ8Master host54aa41d14fe6916ad0b4df7d6664743c!O1FPBN 7 MBhOpen temporary tables99024a41c8d54dbc10a051301c21cadaLM K M>Slave retried transaction countca4a590c1ad0d077c24459650c5b25df!L1:BK 7 M6Slave network timeout9235325572e9a1b4e812530a5aab030f?J 1 M 2Last error messagee68a6e69a2f49601d05c2e5d1e1749b5 bc%4J^ G MWorst case memory requiremente6f8a625e33db52719a047bb30965db8I] G MMyISAM auto recovery enabled?cdc4f5a6cc868373faf7c542a7cf436f<\ + MyRelay log spaceef938846d772f9ea2b981520ed83e9cd![1u0?Z 1 MqHRelay log positioned31cf7ae6cbb4bc97ff94daefb9c67a;Y ) Mm`Relay log file3f104c2147d4de11f6141d52be87455e!X1ixKW I MeRelay master log file position71d0adfbc3c1434ca08bd04479a021d3BV 7 MaRelay master log file4576741ff65ce135848707efbccefbdeEU = M]Master log read positiond84c2f6df5ffaee8295ba1cc06a64183!T1Y8S # MUMaster user36ba6646dd65bb51aba78295a3368144 + MRSort ActC2 9 M #(Query Cache Efficiency9cba7a099234793082581f930f21f4dd=/ - MXConnections Used461ade3b3a5e28583ef97d4d7ed7e386B- 7 MDatabase Transactions158b24b91f1003fab6a78def13326e92D. ; MqHDatabase DDL Statementsf75384754232ad82476df9c8a3f5586cs 76,  M RAM Usagebf3b73a4b83ab35bdb51a74b0a2467faJ+ G M>Interval between disk flushes01923551fdb5c45769288fd18f4725e1!*1:C7 9 M6InnoDB Data Activities951b90e427782371a6ebb3529cc75172O6 Q M 2InnoDB Buffer Pool Page Activitiese6e36487f14382fda58349d7d0881be9?5 1 M .InnoDB Row Details7982a1c5765f2ae493cf2e4e5c2b7d45=4 - M *Queries in Cachef05edae0c23a1a002d583e5c8b0ee67e?3 1 M 'Query Cache Memorya35d34b737f69bcad6e8d080be7ed1b49 #41  MDisk IOc2b1eefc1624f90ef00d6dbb72110019E0 = M@Percentage of Cache Hitsdff1b5e2995b93fca6ea1287ce38eeb9 Qgb#ZQAE 5 Mm`Database Throughputs1c1d7319eb6f57295a0dd58087168968>D / MixReplication Slave5e88dc1fabd82054c85eea6beb63fc6cDC ; MeBinlog Cache Efficiencyc18d86a7d3857cb00e8cc46d5eb64414:B ' MaTables Opened9121beb8d1de2637231ae5a0551ed489EA = M]Temporary Tables Createda70759a0b2ddfc4b12231aad724c70a98@ # MUTable Lockse2a4bd2a77c6800b35649b06c4b1b9cbC? 9 MYTable Lock Contentions90b8dc341f034d9da532714a0d064495<> + MRSort Activities2eac66de19a53da940484c6ef2a8f829>= / MN Row Modifications841443a062bde8f46b85eb9a58812aee6<  MJ8Row Reads3322924469601d11d1b05ee00ad13903=; - MFPQueries Executed72ad36a9d8e033495f796ebfd7a934c0H: C MBhMyISAM Key Block Activitiesecc6b5b2d0b4f20ccb7e29f529a6f1faI9 E M>MyISAM Key Buffer Activitiese0653e70a8c29faa7b1a2cd860706d63J8 G M:InnoDB Row Lock Acquring Time9438a3d5a402b74e6520a96d1abdefc7 c ##zR s#'c= + M"Cache Miss Timebf81f3671d8a4cfe996cb36fb295f795) M @Leaf Node Size61573efd47145b784d87cf2ca6c9e97b6  M (DB Opens5301b7abd76b2ff7c9542568bbe4a88fI C M Leaf Node Compression Ratio1d1d35d16fcc75dd20359ce5108a1557M K M Internal Node Compression Ratiocfbee6abb203f410142c13deeca262f1LS W M"PDe-Compressed Internal Node To Memory9bb5abf950bc8b40403fdd3c5eada248P Q M "hCompressed Internal Node To Memory2c2a615c5839c6560c4abbfd83e93de4M K M "Serialization of Leaf To Memory7534e8dc8cfd1421b7c4faa3c5458bc3J E M"Pivot Fetched-For-Write Time9d3c52c70226b34867340ca61871937eJ E M"Pivot Fetched-For-Query Time0d507e8656947952aa032889fa9ba8e8B 5 M"Pivot Pre-Fetch Timed43a3cbd67d23982fc2f5f67ac4d7a91V ] M" Serialization of Internal Node To Memoryf2af066724ecf779beced22236d261a5R U M"8Deserialized Internal Node To Memoryb1c7fd582078b881a5efa99c1b14f279 FC9,`| s M pMin. launch time for a thread to be considered slow353bccb4fe75d0cf73fb63a0e6ed492d!{1 Bz 7 M Thread cache hit ratea484173c4fd9aea2498f695645be7af0Ry Kl I M pCombined size of all log filesc688ea14505b6fccf94562aba17f810ffo  M #(InnoDB redo logs size as a percentage of buffer pool size0f6ab27d26f85895669cf9bdf058ce26Hn C M @No. of waits for free pagesa224869b9eed0e0b3f4e4804bd032453?m 1 M XLog flush interval023a5f5f2dd6a30472a869a4d8b21899ju  M pInnoDB next-key locking disabled but binary logging enabled?07ef2a95d0953e9d8984b712b8d8159fUt ] M InnoDB tablespace automatically expands?980404799bfaa5819f81dad327a29b73Es = M Max %age of dirty pages?71c2c464c4da5698128d4a24fab56dc2=r - M Use doublewrite?3f42be6ba1d98251b84f83fb31a6d7de;q ) M Use checksums?6e3a4f52ca22fc70df98916cd0686fd9?p 3 M Max open .idb filesc8031b4bd0d4d034f04d96eef27ab311 Vr-VP,ESU Y M Number of InnoDB buffer pool instances9be0ca6bbcad8c460b3b7d94d32ed075;a ) M 3,Last I/O error2d2aa6127c2e4f824fae40987e1e7cfeX^ c MMost Active tables (rows read,rows changed)a4cfb1800d0a0cbbbfd313e6167d29d4E] = M #(InnoDB stats on metadata208c98f68552c23458a5489d78ad792dR\ W M Single InnoDB table space for tables?5eb970e31aeab8a5035c55507f9781b9G[ A M4Need to resolve host name?bda32aba6c79b853c03b31f031f9b97d!Z15;Y ) MFPmax open files68856e6b92a7c2944acabfff2dc0d64d!X1Bh!W1AnTV [ M@tData integrity check enabled by server?dede2a554f242425a348e68e68612f7eBT 9 MList of Unused Indexesbb304cf84f16f8d411c752a12e503261;S + MConnected usersd563d9bbceeab5200f9ad78865ba0815MR M MPercentage of free Redo logspace4d1b2e49f600095c9752822b4875f2ff cu.r5Cc/O& O M"pBasement Nodes - Pre-Fetched Time00T% Y M"XBasement Nodes - Pre-Locked Range Time22e38ff791e802180726ba58b687bd5f@$ 1 M!Disable Slow ALTER5b62d37dca318d3fbeac8c91917be76eC# 7 M!Online Index Creationbee06542e2e74deaa57b36c35816c3f6=" + M!Log Sync Periodf911dc30e2d0ac0b51d6d808594576419! # M!(Commit Sync168e2b7a11258b009b5d7f5794b214dc8 ! M!PCache Size2a0b928ba98267151612dca39a631ac98 ! M !Direct I/Od1d2c06242ac4e7fccf254b40fa1ec81: % M !Lock Timeout19b591ed133413de9d8e8d5dabfa76ee< ) M !hTemp Directoryc1ce20cf3481c341bb119bf015f17c4b; ' M !Log Directoryc3d6c2c178bd48d3c3c76d422121b4a5< ) M !Data Directoryfdfc88e74606828975c03214a76c6363D ; M Current Cachetable Size1c7c016f656961646c8eceaf71aff0d6E ; M pCachetable Size Writing3d2e8af66e014464dbc514563280552d@ 1 M XInternal Node Size3c2cd69f99ddc37a4e5f57e381cd9ee1 A f&Kp_4ff}- 'Allocated memoryC 9 < + M(Freeable Memory0bf4bb0f8245746033423ca6e4386ced6  M( Read IOPSe0765b364352acb7309182892ac6b8d2; + M(CPU Utilization2fb51cbc46019087c8c5ee0717d2a970=} - M 'Allocated memoryb8bbf9c894eedaf96b5e1785db577600C| 7 M'Transaction Log Syncs5d23847bdf89a448c08b996dc16ad2cfJ{ E M'Pagecache blocks not flushed356e9375d9d82fc2a629908ef6847c22Ez ; M'Pagecache blocks unusedfbdd950bee0ce25cd2a58ccec33e7dd1`1(Free Storage Sp? 1 M(Free Storage Spaceccba2dc5fe80f5ad84219277165c46ac7 ! M(Write IOPS2f5a5f1c5a638cc3827f2f1576281c91!1'pF ? M 'Percentage of Used blocksb88238d4a83766a8b0e0f4d6a3f53db98 # M 'Used blocks5c45380c44008ccf0472b2af2c04f17d= - M ' Number of blocks21f4dc4efcb2f49f7caa6212479eaeab7~ ! M 'Block sizeea4963b3786b63a8d915b2806863b52e 32zF2CF. ? MNew entries in error log?5792b61d08bd4ef7a09301b72a715468Z( g MXNumber Of Users Having Global ALTER Privilegeebde43dbf5aa1f8e8ff362aceb0c19da[+ i M 'Number Of Users Having Global DELETE Privilegef83a04eb4a96dc5c06200b44a946532eI ReK/ I M Recent entries of type [ERROR]d4fbece8898d42c359391ee58fa68b32P- U MMONyog able to read MySQL error log?a2a3e52136010777cee4ad31f0c16c0b`, s M *Number Of Users Having Global LOCK_TABLES Privilegea0f288bb198929a7714da95fbfbf019c[* i M #(Number Of Users Having Global UPDATE Privilegec49281cc85e1ca582f33a5a658331feb[) i M@Number Of Users Having Global INSERT Privilegef8c3021a81ffae89415e10f48880f0c9 2<E<7GR A M#XUnused Indexes in a schema7f305c705acb0adf8d2c25803375908aNP O M#Object that are accessed the mostfd64336db3e044b15cb3b9921046b64eXM c M#Host hitting the server the most by file-io9c0f9ea945cf4610ad27e53e8b4e6773]T m M ##(Table using the most space in InnoDB Buffer Pool6706367844e882dc7a5b0e6af88057faHS C M#@Redundant index in a schemae385c1a88512e3cac3573653fc33c017_Q q M#pTop 5 Users based on the total statements executedbcd04016663a00a4dfc49585e5fdbb6cYO e M#Users hitting the server the most by file-ioa9674c0b5694335522aa8ae0763f2962\N k M# Users hitting the server the most by tablescans46a739c7d83c51a457f36d7eeeaab0bd  0Th"0dM, G M 10000Innodb change buffer max sizea0ea61824a7a2a1db3d8a12c6ee0998c9-  M 101000Back loge18ca1b8191c08477e92f7ff431a81d0X1 c MJ8Percentage of free disk space (InnoDB data)9fdf302cf887e2b90cc447eb9c6a56beJ0 G MFPFree disk space (InnoDB data)c9673a41d934263568e42765f5ab7583J/ G MBhPercentage of free disk space97c9fd987acfc9805ed0e2b2dd79dc4a<. + M>Free disk space29db46d60792408e040571b8c9a6eda42G 10000Innodb change buffer max sizeC+ 3 M 15000Innodb I/O capacity63e23270e37e19d3c033f412f3990d36M* K M"Buffers - Pre-Locked Range Time6dc295c5f890338a6d380d966c54335cH) A M"Buffers - Pre-Fetched Time2356dda7efac7caa3230cd23e222e900N( M M"(Buffers - Fetched For Write Timed31714111b422c021c7309a16116dcb7W' a M"Basement Nodes - Fetched Target Query Time284c2f3c3801b7911cc383f36ac5e74cO& O M"pBasement Nodes - Pre-Fetched Time00e90bf0ad65bb83cc5daa68f6a8e067 u&Q< ) M @Leaf Node Size61573efd47145b784d87cf2ca6c9e97b6  M (DB Opens5301b7abd76b2ff7c9542568bbe4a88fI C M Leaf Node Compression Ratio1d1d35d16fcc75dd20359ce5108a1557M K M Internal Node Compression Ratiocfbee6abb203f410142c13deeca262f1L I M Overall Node Compression Ratioe7b0d6576a9667b15152c45bd7c0d37a@ 1 M FSYNC average timef5aec2306bb3a83c61a3876e1ade7409E ; M Long FSYNC average timeda62377d79787b27192490364307c3e6 $f$Ao/l^3( =  13000GCS - Memory Utilization    +,% 9  )5000Write Operations Count$ 7  )4000Read Operations Count -  )3000Disk Utilization! 1  )2000Memory Utilization    *+E 7 M 12000GC? 1 M(Free Storage Spaceccba2dc5fe80f5ad84219277165c46ac< + M(Freeable Memory0bf4bb0f8245746033423ca6e4386cedA 1 M1500Most Advanced Node13d93b946010b4b9a2d9a77f11127120C 9 M *RDS - Disk Queue Depth9780fe967944038698e1bee5d3b98084= - M 'RDS - Swap Usagea464ca3d5c2410a3c4f75095a9a9b2a9E = M #(RDS - Free Storage Space071b95b214cb352e1f54b179ee6d004eB 7 M@RDS - Freeable Memory74c0727303aaa566369282334b0243bcB 7 MXRDS - Read/Write IOPS9098106acc3b372cacba9ac4b570442bB 7 MpRDS - CPU Utilization1de17f6c5828d075d9c3622ac4f4d078= - M(XDisk Queue Depth1aa5b57af9ee79c325d4592035b0e0ee7 ! M(pSwap Usage42492df4481ec75bc918f1c86faaf94d YxU`| s M pMin. launch time for a thread to be considered slow7b0b64fb8c58a07db3aba774b06a7bf4!{1 Bz 7 M Thread cache hit rate38dc4d6eda8ac3f4eaab4a22c2e52db1Ry W M Threads created to handle connectionse96f34700674b547f5df23c889213bd9Gx A M Number of threads in cache8ea0316a3e745e2e0978c0673ee0e29ePw U M Number of threads that can be cached4eb40a5b4e67c3ca979371b13a720d46Sv Y M XInnoDB XA transaction support enabled?2c62beedde4acc5c36031f1cb9e2504d 3#|\?tf:):/)function(){ var val = GetGCSMetricVal("Memory_Utilization"); if(!isNaN(val)) val = (val*100).toFixed(2)+ "%"; return val; }=)System)< Q)MONyog.System.Gcs.Disk_Utilization ;) Yes9)System+8 U)MONyog.System.Gcs.Memory_Utilization 7 ['%']6 Current5% RealTimeLineP4 [CheckForSystem()?(MONyog.System.Gcs.CPU_Utilization*100).toFixed(2):0]31 ["CPUUtilization"]27 GCS - CPU Utilization 0 ) Yes/ ))function(){ var val = GetGCSMetricVal("CPU_Utilization"); if(!isNaN(val)) val = (val*100).toFixed(2)+ "%"; return val; } . )SystemI, Identifying the most advanced node in the cluster requires that you find the node with the most advanced sequence number. You can determine this using the wsrep_last_committed status variable. {{"B4(xfV5>+)function(){ var val = GetGCSMetricVal("Disk_Utilization"); if(!isNaN(val)) val = (val*100).toFixed(2)+ "%"; return val; }P3["DiskUtilization"]O9GCS - Disk Utilization N ['%']M CurrentL% RealTimeLineSK! [CheckForSystem()?(MONyog.System.Gcs.Memory_Utilization*100).toFixed(2):0]J7 ["MemoryUtilization"] I= GCS - Memory Utilization H*) i G) YesF)function(){ var val = GetGCSMetricVal("Write_OPS_Count"); if(!isNaN(val)) val = (val*100).toFixed(2); return val; }E)System(D O)MONyog.System.Gcs.Write_OPS_Count C) YesB)function(){ var val = GetGCSMetricVal("Read_OPS_Count"); if(!isNaN(val)) val = (val*100).toFixed(2); return val; }A)System'@ M)MONyog.System.Gcs.Read_OPS_Count ?) Yes ~l\._7 `= ['', 'K', 'M', 'G', 'T'] [%]_Current^%RealTimeLineT  @]}[CheckForSystem()?(MONyog.System.Gcs.Write_OPS_Count):0]\/["WriteOPSCount"] $[EGCS - Write Operations Count  Y= ['', 'K', 'M', 'G', 'T']U ZCurrent?W{[CheckForSystem()?(MONyog.System.Gcs.Read_OPS_Count):0]V-["ReadOPSCount"]#UCGCS - Read Operations Count T ['%']SCurrentR%RealTimeLineX%RealTimeLineQQ[CheckForSystem()?(MONyog.System.Gcs.Disk_Utilization*100).toFixed(2):0] 3 : LPPPPD 7 M)4000Read Operations Countb6ac04e7925570c9eacb4a4f11401be4A 1 M)2000Memory Utilizationf308274b369187c35e403668c27fa1f5L E M16000GCS - Write Operations Count83ca0f29b90871c83504230da226d8ecF 9 M14000GCS - Disk Utilization0d08b7f9bb2737cb61e7efcc691d1f63H = M 13000GCS - Memory Utilization0eaef4c9afe1406c424b9962722e563f  +, 9 E 9 M)5000Write Operations Count99088430ba127812e08bd95e6dfe0a8e? - M)3000Disk Utilizationc50f394093a8988b85ee6e25af430ad9,  *+E 7 M 12000GCS - CPU Utilizationdd2f331df6094f2ae37b1f34754cff40z  )*= + M)1000CPU Utilization1a77de095197cabdb26df08025823d1c8E  16000GCS - Write Operations Count C K C M15000GCS - Read Operations Countf1bfa404197db61697d2acff44c07759 4&e Days after which the binary logs are purged.\%3 function() { if(MONyog.MySQL.Custom.Available != 1 || ( typeof MONyog.MySQL.GlobalVariables.expire_logs_days == "undefined")) return "(n/a)"; return MONyog.MySQL.GlobalVariables.expire_logs_days; }$- expire_logs_days" function() { if(MONyog.MySQL.GlobalVariables.log_output == "TABLE") return "Warning"; return "None"; }i!M Logging queries to Slow/General log tables instead of files would affect performance adversely.