MySQL日志类型
- 错误日志(Error log): mysqld启动,运行,停止相关的警告或错误信息
- 普通查询日志(General query log): 记录从连接客户端发出的SQL语句和MySQL命令
- 二进制日志(Binary log): 对数据库执行更新的语句,二进制日志也被用来在主从复制时使用
- 中继日志(Relay log): 主库推送的主库二进制日志中的事件到从库的中继日志,从库根据中继日志重做数据变更操作
- 慢查询日志(Slow query log): 执行时间超过long_query_time设定值的SQL语句,也可包含没有使用索引的SQL语句
- DDL log (metadata log): Metadata operations performed by DDL statements
错误日志
MySQL的错误日志是默认开启,且必须开启。查看错误日志的位置:
show variables like 'log_error'\G
*************************** 1. row ***************************
Variable_name: log_error
Value: stderr
1 row in set (0.01 sec)在my.cnf [mysqld]通过log-error指定错误日志文件的位置:
[mysqld]
log-error=/var/log/mysql.err普通查询日志
查看普通查询日志是否开启:
show variables like 'general_log' \G
*************************** 1. row ***************************
Variable_name: general_log
Value: OFF
1 row in set (0.00 sec)临时开启MySQL的普通查询日志(只在MySQL实例运行期间有效,MySQL重启后,会重新恢复到之前的状态):
SET GLOBAL general_log = 'ON';日志开启后,查看日志位置:
show variables like 'general_log_file';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log_file | /var/lib/mysql/144dbea47cac.log |
+------------------+---------------------------------+
1 row in set (0.00 sec)关闭general log:
SET GLOBAL general_log = 'OFF';开启普通日志会影响MySQL的性能,一般只有在特别情况下,需要追踪具体日志的时候才会临时打开一下。
二进制日志
二进制日志顾名思义,在格式上是二进制的,需要借助专门的工具查看。 二进制日志记录了数据库的变化情况,可用作主库从库复制同步。
查看二进制日志是否开启:
show variables like 'log_bin'\G
*************************** 1. row ***************************
Variable_name: log_bin
Value: OFF
1 row in set (0.01 sec)log_bin默认是不开启的,并且是一个只读变量,只能在my.cnf中配置,重启MySQL实例生效。
[mysqld]
server_id = 1
log-bin = /var/lib/mysql/binlog
log_bin_trust_function_creators=1
binlog_format = MIXED
expire_logs_days = 99使用mysqlbinlog命令查看二进制日志:
mysqlbinlog -d demodb binlog.00003mysqlbinlog命令常用选项:
-s 以精简的形式显示日志内容
-v 以详细的形式显示日志内容
-d 只显示指定数据库的日志内容
-o 跳过指定行数的日志
-r 日志内容写入指定文件
--start-datetime
显示指定时间范围内的日志内容(2004-12-25 11:25:56)
--stop-datetime
--start-position
显示指定位置间隔内的日志内容
--stop-position 获取当前正在使用的日志文件和位置信息
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000003 | 319 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)使用bin log恢复数据,结合--start-datetime, --stop-datetime可精确控制恢复范围。
mysqlbinlog -s binlog.000003 | mysql -h 192.168.61.100 -u root -p查看Bin log相关的参数:
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_format | MIXED |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| log_statements_unsafe_for_binlog | ON |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 1 |
+-----------------------------------------+----------------------+
20 rows in set (0.00 sec)慢日志
慢日志可以记录执行时间过长的SQL语句或者没有使用索引的查询语句。
查看是否开启了慢日志:
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.00 sec)my.cnf中配置开启慢日志:
[mysqld]
slow-query-log=1
slow-query-log-file=/var/log/mysql/slow-queries.log
long_query_time = 3
log-queries-not-using-indexes使用mysqldumpslow命令可以分析慢日志文件:
mysqldumpslow --help
--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慢日志中返回数据行行数最多的top 10 SQL语句:
mysqldumpslow -s r -t 10 /var/log/mysql/slow-queries.log慢日志中执行次数最多的top 10语句:
mysqldumpslow -s c -t 10 /var/log/mysql/slow-queries.log慢日志中包含LIKE的SQL:
mysqldumpslow -g 'like' 10 /var/log/mysql/slow-queries.log