MySQL Server的日志

2016-12-11 阅读: MySQL

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.00003

mysqlbinlog命令常用选项:

-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

DDL日志

参考

标题:MySQL Server的日志
本文链接:https://blog.frognew.com/2016/12/mysql-server-logs.html
转载请注明出处。

目录