如何设计网站的主菜单,网站充值页面模板,域名购买成功后如何使用,wordpress文章自适应图片大小MySQL查询日志介绍MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。生产环境#xff0c;如果开启MySQL查询日志#xff0c;对性能还是有蛮大的影响的。另外很多时候#x…MySQL查询日志介绍MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。生产环境如果开启MySQL查询日志对性能还是有蛮大的影响的。另外很多时候MySQL慢查询日志基本可以定位那些出现性能问题的SQL所以MySQL查询日志应用的场景其实不多有点鸡肋的感觉它跟SQL Server中的profiler有点类似但是这个不能跟踪某个会话、用户、客户端。它只能对整个数据库进行跟踪。MySQL查询日志本身比较简单网上介绍的不多官方资料也就那么短短一篇。MySQL查询日志配置MySQL中的参数general_log用来控制开启、关闭MySQL查询日志,参数general_log_file用来控制查询日志的位置。所以如果你要判断MySQL数据库是否开启了查询日志可以使用下面命令。general_log为ON表示开启查询日志OFF表示关闭查询日志。mysql show variables like %general_log%;------------------------------------------------| Variable_name | Value |------------------------------------------------| general_log | OFF || general_log_file | /var/lib/mysql/DB-Server.log |------------------------------------------------2 rows in set (0.00 sec)mysql另外MySQL的查询日志支持写入文件或写入数据表两种形式这个由参数log_output控制如下所示mysql show variables like log_output;----------------------| Variable_name | Value |----------------------| log_output | FILE |----------------------1 row in set (0.00 sec)mysql这三个参数general_log、 general_log_file、 log_output都是动态参数可以随时动态修改。1、开启MySQL查询日志mysql set global general_log on;Query OK, 0 rows affected (0.11 sec)mysql show variables like general_log;----------------------| Variable_name | Value |----------------------| general_log | ON |----------------------1 row in set (0.02 sec)mysql2关闭MySQL查询日志mysql show variables like general_log;----------------------| Variable_name | Value |----------------------| general_log | ON |----------------------1 row in set (0.01 sec)mysql set global general_logoff;Query OK, 0 rows affected (0.01 sec)mysql show variables like general_log;----------------------| Variable_name | Value |----------------------| general_log | OFF |----------------------1 row in set (0.00 sec)mysql3设置日志输出方式为表(如果设置log_outputtable的话则日志结果会记录到名为gengera_log的表中这表的默认引擎是CSV)mysql show variables like log_output;----------------------| Variable_name | Value |----------------------| log_output | FILE |----------------------1 row in set (0.00 sec)mysql set global log_outputtable;Query OK, 0 rows affected (0.00 sec)mysql show variables like log_output;----------------------| Variable_name | Value |----------------------| log_output | TABLE |----------------------1 row in set (0.01 sec)mysql查看查询日志信息。mysql select * from mysql.general_log;----------------------------------------------------------------------------------------------------------------------| event_time | user_host | thread_id | server_id | command_type | argument |----------------------------------------------------------------------------------------------------------------------| 2017-07-06 12:32:05 | root[root] localhost [] | 1 | 1 | Query | show variables like general% || 2017-07-06 12:32:28 | root[root] localhost [] | 1 | 1 | Query | show variables like log_output || 2017-07-06 12:32:41 | root[root] localhost [] | 1 | 1 | Query | select * from MyDB.test || 2017-07-06 12:34:36 | [root] localhost [] | 3 | 1 | Connect | rootlocalhost on || 2017-07-06 12:34:36 | root[root] localhost [] | 3 | 1 | Query | KILL QUERY 1 || 2017-07-06 12:34:36 | root[root] localhost [] | 3 | 1 | Quit | || 2017-07-06 12:34:51 | root[root] localhost [] | 1 | 1 | Query | select * from mysql.general_log |----------------------------------------------------------------------------------------------------------------------7 rows in set (0.02 sec)mysql4 查询日志归档mysql system mv /var/lib/mysql/DB-Server.log /var/lib/mysql/DB-Server.log.20170706mysql system mysqladmin flush-logs -pEnter password:或者你在shell中执行下面命令[rootDB-Server mysql]# mv /var/lib/mysql/DB-Server.log /var/lib/mysql/DB-Server.log.20170706[rootDB-Server mysql]# mysqladmin flush-logs -pEnter password:5 修改查询日志名称或位置mysql show variables like general_log%;------------------------------------------------| Variable_name | Value |------------------------------------------------| general_log | ON || general_log_file | /var/lib/mysql/DB-Server.log |------------------------------------------------2 rows in set (0.00 sec)mysql set global general_logOFF;Query OK, 0 rows affected (0.00 sec)mysql set global general_log_file/u02/mysql_log.log;Query OK, 0 rows affected (0.00 sec)mysql set global general_logON;Query OK, 0 rows affected (0.02 sec)如果你遇到下面类似问题这个是因为权限问题导致。mysql set global general_log_file/u02/mysql_log.log;ERROR 1231 (42000): Variable general_log_file cant be set to the value of /u02/mysql_log.log将对应目录的owner修改为mysql即可解决问题。如下所示[rootDB-Server u02]# chown -R mysql:mysql /u02另外MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。这个就是即使我查询一个不存在的表的SQL查询日志依然会记录。如下测试所示mysql select * from MyDB.test1;ERROR 1146 (42S02): Table MyDB.test1 doesnt existmysql select * from MyDB.test2;-------------| id | sex |-------------| 10001 | || 10002 | || 10003 | |-------------3 rows in set (0.07 sec)mysql select * from MyDB.kkk;ERROR 1146 (42S02): Table MyDB.kkk doesnt existmysqlMySQL查询日志的应用场景存在即是合理既然MySQL提供了查询日志那么肯定有其应用的地方。比如我就遇到这样一个例子前阵子碰到别人问mysqlslap压力测试工具中参数的问题问题如下-c, --concurrencynameNumber of clients to simulate for query to run.--number-of-queries#Limiteachclienttothisnumberofqueries(thisisnotexact).比如我指定--concurrency50--number-of-queries100 那么这次测试总的sql执行次数是100还是50*1005000 我们不知道--number-of-queries这个参数代表所有客户端的执行次数还是每一个客户端的执行次数这些英文如果看得不是太明白那么我们就动手测试一下这个时候MySQL查询日志就能发挥其用武之地了。[rootDB-Server u02]# mysqlslap -u root -p --concurrency50 --create-schemaMyDB --queryselect * from MyDB.test2 --number-of-queries100;Enter password:BenchmarkAverage number of seconds to run all queries: 0.023 secondsMinimum number of seconds to run all queries: 0.023 secondsMaximum number of seconds to run all queries: 0.023 secondsNumber of clients running queries: 50Average number of queries per client: 2如下所示我们可以查到这个SQL总共执行了100次也就是说number-of-queries代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。--concurrency表示并发量也就是模拟多少个客户端同时执行select。如果你指定--number-of-queries100--concurrency50测试总的SQL执行应该是100