MySQL中查询日志与慢查询日志的基本学习教程
一、查询日志 查询日志记录MySQL中所有的query,通过"--log[=file_name]"来打开该功能。由于记录了所有的query,包括所有的select,体积比较大,开启后对性能也有比较大的影响,所以请大家慎用该功能。一般只用于跟踪某些特殊的sql性能问题才会短暂打开该功能。默认的查询日志文件名为:hostname.log. [root@node4 mysql5.5]# service mysql start Starting MySQL.... [ OK ] [root@node4 mysql5.5]# mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.22-log Source distribution Copyright (c) 2000,2011,Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show variables like '%log'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | back_log | 50 | | general_log | OFF | | innodb_locks_unsafe_for_binlog | OFF | | log | OFF | | relay_log | | | slow_query_log | OFF | | sync_binlog | 0 | | sync_relay_log | 0 | +--------------------------------+-------+ 8 rows in set (0.00 sec) ----备注:log和general_log这两个参数是兼容的。而默认的情况下查询日志是不开启的 Query OK,0 rows affected,1 warning (0.03 sec) mysql> show variables like '%log'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | back_log | 50 | | general_log | ON | | innodb_locks_unsafe_for_binlog | OFF | | log | ON | | relay_log | | | slow_query_log | OFF | | sync_binlog | 0 | | sync_relay_log | 0 | +--------------------------------+-------+ 8 rows in set (0.00 sec) ----其中log参数是过时的,在启动选项中使用log参数的话,会在err日志中显示出来。 ----修改my.cnf文件,添加log的参数设置 [root@node4 mysql5.5]# vi my.cnf [root@node4 mysql5.5]# cat ./my.cnf |grep '^log=' log=/tmp/mysqlgen.log ----清空err日志 [root@node4 mysql5.5]# cat /dev/null > /tmp/mysql3306.err [root@node4 mysql5.5]# ll /tmp/mysql3306.err -rw-rw---- 1 mysql root 0 Jul 31 07:50 /tmp/mysql3306.err [root@node4 mysql5.5]# service mysql start Starting MySQL... [ OK ] ----启动数据库后查看err日志的内容 [root@node4 mysql5.5]# cat /tmp/mysql3306.err 130731 07:51:32 mysqld_safe Starting mysqld daemon with databases from /opt/mysql5.5/data 130731 7:51:32 [Warning] The syntax '--log' is deprecated and will be removed in a future release. Please use '--general-log'/'--general-log-file' instead. 130731 7:51:33 InnoDB: The InnoDB memory heap is disabled 130731 7:51:33 InnoDB: Mutexes and rw_locks use InnoDB's own implementation 130731 7:51:33 InnoDB: Compressed tables use zlib 1.2.3 130731 7:51:33 InnoDB: Initializing buffer pool,size = 128.0M 130731 7:51:33 InnoDB: Completed initialization of buffer pool 130731 7:51:33 InnoDB: highest supported file format is Barracuda. 130731 7:51:33 InnoDB: Waiting for the background threads to start 130731 7:51:34 InnoDB: 1.1.8 started; log sequence number 1625855 130731 7:51:34 [Note] Event Scheduler: Loaded 0 events 130731 7:51:34 [Note] /opt/mysql5.5/bin/mysqld: ready for connections. Version: '5.5.22-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution ----使用最新的参数 ----general_log和general_log_file。 [root@node4 mysql5.5]# service mysql stop Shutting down MySQL. [ OK ] [root@node4 mysql5.5]# vi my.cnf [root@node4 mysql5.5]# cat ./my.cnf |grep '^general' general_log = 1 general_log_file = /tmp/mysqlgen.log [root@node4 mysql5.5]# service mysql start Starting MySQL... [ OK ] [root@node4 mysql5.5]# mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.22-log Source distribution Copyright (c) 2000,Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show variables like '%log'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | back_log | 50 | | general_log | ON | | innodb_locks_unsafe_for_binlog | OFF | | log | ON | | relay_log | | | slow_query_log | OFF | | sync_binlog | 0 | | sync_relay_log | 0 | +--------------------------------+-------+ 8 rows in set (0.04 sec) mysql> show variables like '%file'; +---------------------+-----------------------------------+ | Variable_name | Value | +---------------------+-----------------------------------+ | ft_stopword_file | (built-in) | | general_log_file | /tmp/mysqlgen.log | | init_file | | | local_infile | ON | | pid_file | /tmp/mysql3306.pid | | relay_log_info_file | relay-log.info | | slow_query_log_file | /opt/mysql5.5/data/node4-slow.log | +---------------------+-----------------------------------+ 7 rows in set (0.00 sec) ----在上面的操作中可以看到已经启用查询日志,并且文件目录是/tmp/mysqlgen.log。 ----查询日志记录了哪些东西? 进行下面的查询 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test2 | +--------------------+ 5 rows in set (0.08 sec) mysql> use test; Database changed mysql> show tables; Empty set (0.00 sec) mysql> use test2; Database changed mysql> show tables; +-----------------+ | Tables_in_test2 | +-----------------+ | course | | jack | | sc | | student | | t | | teacher | +-----------------+ 6 rows in set (0.07 sec) mysql> drop table t; Query OK,0 rows affected (0.13 sec) mysql> select * from sc; Empty set (0.04 sec) ----可以看到上面的操作都记录在了mysqlgen.log里面。 [root@node4 ~]# tail -f /tmp/mysqlgen.log /opt/mysql5.5/bin/mysqld,Version: 5.5.22-log (Source distribution). started with: Tcp port: 3306 Unix socket: /tmp/mysql.sock Time Id Command Argument 130731 7:55:41 1 Query show databases 130731 7:55:56 1 Query SELECT DATABASE() 1 Init DB test 130731 7:55:59 1 Query show tables 130731 7:56:19 1 Query SELECT DATABASE() 1 Init DB test2 130731 7:56:23 1 Query show tables 130731 7:56:27 1 Query drop table t 130731 7:56:39 1 Query select * from sc 二、慢查询日志 ----使用log_slow_queries参数打开慢查询,由于该参数已经过时,因此在err日志中将出现提示信息 ----修改my.cnf文件,添加log_slow_queries参数 [root@node4 ~]# vi /opt/mysql5.5/my.cnf [root@node4 ~]# cat /opt/mysql5.5/my.cnf |grep '^log_slow' log_slow_queries = /tmp/mysqlslow.log ----清空err日志内容: [root@node4 ~]# cat /dev/null > /tmp/mysql3306.err [root@node4 ~]# service mysql start Starting MySQL.... [ OK ] ----查看err日志的信息 [root@node4 data]# tail -f /tmp/mysql3306.err 02:26:28 mysqld_safe Starting mysqld daemon with databases from /opt/mysql5.5/data 2:26:28 [Warning] The syntax '--log-slow-queries' is deprecated and will be removed in a future release. Please use '--slow-query-log'/'--slow-query-log-file' instead. 2:26:28 [Warning] You need to use --log-bin to make --binlog-format work. 2:26:28 InnoDB: The InnoDB memory heap is disabled 2:26:28 InnoDB: Mutexes and rw_locks use InnoDB's own implementation 2:26:28 InnoDB: Compressed tables use zlib 1.2.3 2:26:28 InnoDB: Initializing buffer pool,size = 128.0M 2:26:28 InnoDB: Completed initialization of buffer pool 2:26:28 InnoDB: highest supported file format is Barracuda. 2:26:28 InnoDB: Waiting for the background threads to start 2:26:30 InnoDB: 1.1.8 started; log sequence number 3069452 2:26:30 [Note] Event Scheduler: Loaded 0 events 2:26:30 [Note] /opt/mysql5.5/bin/mysqld: ready for connections. Version: '5.5.22-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution ----使用slow_query_log和slow_query_log_file [root@node4 ~]# vi /opt/mysql5.5/my.cnf [root@node4 ~]# cat /opt/mysql5.5/my.cnf |grep '^slow_query' slow_query_log = 1 slow_query_log_file = /tmp/mysqlslow.log1 [root@node4 ~]# service mysql start Starting MySQL... [ OK ] [root@node4 ~]# mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.22-log Source distribution Copyright (c) 2000,Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show variables like '%slow%'; +---------------------+---------------------+ | Variable_name | Value | +---------------------+---------------------+ | log_slow_queries | ON | | slow_launch_time | 10 | | slow_query_log | ON | | slow_query_log_file | /tmp/mysqlslow.log1 | +---------------------+---------------------+ rows in set (0.00 sec) ----关于slow_launch_time参数,首先修改一下参数值 mysql> set global long_query_time=1; Query OK,0 rows affected (0.00 sec) mysql> show variables like '%long_query%'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 1.000000 | +-----------------+----------+ row in set (0.00 sec) ----进行一下相关操作,查看/tmp/mysqlslow.log1的内容 mysql> select database(); +------------+ | database() | +------------+ | NULL | +------------+ row in set (0.00 sec) mysql> use test; Database changed mysql> show tables; Empty set (0.00 sec) mysql> create table t as select * from information_schema.tables; Query OK,85 rows affected (0.38 sec) Records: 85 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK,85 rows affected (0.05 sec) Records: 85 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK,170 rows affected (0.03 sec) Records: 170 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK,340 rows affected (0.05 sec) Records: 340 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK,680 rows affected (0.08 sec) Records: 680 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK,1360 rows affected (0.29 sec) Records: 1360 Duplicates: 0 Warnings: 0 mysql> insert into t select * from t; Query OK,2720 rows affected (1.49 sec) Records: 2720 Duplicates: 0 Warnings: 0 ----在这里已经超过1s了,查看/tmp/mysqlslow.log1 [root@node4 data]# tail -f /tmp/mysqlslow.log1 # Time: 130801 2:36:25 # User@Host: root[root] @ localhost [] # Query_time: 2.274219 Lock_time: 0.000322 Rows_sent: 0 Rows_examined: 5440 use test; SET timestamp=1375295785; insert into t select * from t; ----log_queries_not_using_indexes参数实验 mysql> show variables like '%indexes%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ row in set (0.00 sec) mysql> set log_queries_not_using_indexes = 1; ERROR 1229 (HY000): Variable 'log_queries_not_using_indexes' is a GLOBAL variable and should be set with SET GLOBAL mysql> set global log_queries_not_using_indexes = 1; Query OK,0 rows affected (0.01 sec) mysql> show variables like '%indexes%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | ON | +-------------------------------+-------+ row in set (0.00 sec) mysql> desc t; +-----------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------------+------+-----+---------+-------+ | TABLE_CATALOG | varchar(512) | NO | | | | | TABLE_SCHEMA | varchar(64) | NO | | | | | TABLE_NAME | varchar(64) | NO | | | | | TABLE_TYPE | varchar(64) | NO | | | | | ENGINE | varchar(64) | YES | | NULL | | | VERSION | bigint(21) unsigned | YES | | NULL | | | ROW_FORMAT | varchar(10) | YES | | NULL | | | TABLE_ROWS | bigint(21) unsigned | YES | | NULL | | | AVG_ROW_LENGTH | bigint(21) unsigned | YES | | NULL | | | DATA_LENGTH | bigint(21) unsigned | YES | | NULL | | | MAX_DATA_LENGTH | bigint(21) unsigned | YES | | NULL | | | INDEX_LENGTH | bigint(21) unsigned | YES | | NULL | | | DATA_FREE | bigint(21) unsigned | YES | | NULL | | | AUTO_INCREMENT | bigint(21) unsigned | YES | | NULL | | | CREATE_TIME | datetime | YES | | NULL | | | UPDATE_TIME | datetime | YES | | NULL | | | CHECK_TIME | datetime | YES | | NULL | | | TABLE_COLLATION | varchar(32) | YES | | NULL | | | CHECKSUM | bigint(21) unsigned | YES | | NULL | | | CREATE_OPTIONS | varchar(255) | YES | | NULL | | | TABLE_COMMENT | varchar(2048) | NO | | | | +-----------------+---------------------+------+-----+---------+-------+ rows in set (0.05 sec) ----下面的命令是查看索引的 mysql> show index from t; Empty set (0.01 sec) mysql> select * from t where engine='xxx'; Empty set (0.18 sec) # Time: 130801 2:43:43 # User@Host: root[root] @ localhost [] # Query_time: 0.185773 Lock_time: 0.148868 Rows_sent: 0 Rows_examined: 5440 SET timestamp=1375296223; select * from t where engine='xxx'; PS:slow query log相关变量 命令行参数: --log-slow-queries 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log 系统变量 log_slow_queries 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log slow_query_log slow quere log的开关,当值为1的时候说明开启慢查询。 slow_query_log_file 指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log long_query_time 记录超过的时间,默认为10s log_queries_not_using_indexes log下来没有使用索引的query,可以根据情况决定是否开启 三、Mysqldumpslow 如果日志内容很多,用眼睛一条一条看会累死,mysql自带了分析的工具,使用方法如下: [root@node4 data]# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al,at,ar,c,l,r,t),'at' is default al: average lock time ar: average rows sent at: average query time c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),default is '*',i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql – 在Apache Spark Join中包含空值
- sql-server – DEFAULT CONSTRAINT,值得吗?
- sql – 自动生成层次结构值
- mssql 30万条数据 搜索文本字段的各种方式对比
- sql-server – 每晚备份SQL Server数据库的最佳方法?
- SQLserver2005以身份认证方式登录的一些配置
- sql-server – 使用SQL SERVER 2008 R2的ASP.NET MVC 4的EL
- 浅析drop user与delete from mysql.user的区别
- .Mdf文件如何导入到SqlServer数据库【转】
- SQL Server 多表查询功能实例
- 模拟SQLSERVER的两个函数:dateadd(),datediff()
- sqlserver2005报错15023的处理方法
- sql-server – SQL Server 2005:没有足够的系统
- Sqoop将SQLServer数据导入HBase
- VS2005自带SQLServer 2005 Express版本对应的Man
- 带你熟悉SQLServer2016中的System-Versioned Tem
- 记一次公司仓库数据库服务器死锁过程及解决办法
- SqlServer系统数据库还原(一)master 数据库还原
- "SQLServer复制需要有实际的服务器名称才能连
- SqlServer 递归查询树形数据