MySQL有几个日志文件,帮助管理员了解mysqld(MySQL Server的主程序)内部发生的事情。
日志文件 | 记入文件中的信息类型 |
错误日志 | 记录启动,运行或停止mysqld时出现的问题 |
通用日志 | 记录建立的客户端连接和执行的语句 |
二进制日志 | 记录更改数据的所有语句,用于复制,备份恢复 |
慢查询日志 | 记录执行时间超过long_query_time秒的所有查询 |
1.错误日志
错误日志问包含了mysqld启动或停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。可以用--log-error[=file_name]选项来指定mysqld保存错误日志文件的位置。
查看错误日志的位置:
mysql> show variables like 'log_error%'; +---------------------+--------------------------+ | Variable_name | Value | +---------------------+--------------------------+ | log_error | /var/log/mysql/error.log | | log_error_verbosity | 3 | +---------------------+--------------------------+ 2 rows in set (0.01 sec)
2.通用日志
如果你想知道mysqld内部发生了什么,你应该用--log[=file_name]或-1[file_name]选项启动它。如果没有给定file_name的值,那么默认名就是host_name.log。所有连接和语句都将被记录到日志文件中。
以下命令可查询通用日志的路径。
mysql> show variables like '%gene%'; +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/loggeneral.log | +------------------+---------------------------------+ 2 rows in set (0.03 sec)
3.二进制日志
二进制日志包含了所有更新了数据或者潜在更新了数据的语句。它还包含了每个更新数据库的语句的执行时间信息,但不包含没有修改任何数据的语句,如果想要记录所有的语句,比如查询之类的,那么应该使用通用日志。二进制日志的主要作用是恢复数据,因为二进制日志包含备份后进行的所有更新。
二进制日志的主要作用:
1,用于复制,在数据库主从复制的时候,主服务器会将其产生的二进制日志发送到slave端,slave端会利用这个二进制日志的信息在本地重做,实现主从同步
2,用户恢复,MySQL可以在全备和差异备份的基础上,利用二进制日志进行基于时间点或者事物Id的恢复操作。原理雷同于主从复制的日志重做
查看二进制日志的位置:
mysql> show variables like 'log_bin%'; +----------------------------------------+--------------------------+ | Variable_name | Value | +----------------------------------------+--------------------------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF |
可见二进制日志并没有打开,那么需要打开二进制日志的话进行如下操作:
进入my.cnf文件,cd /etc/mysql/my.cnf,并在[mysqld]后添加以下内容:
[mysqld] server-id = 1 # 确保在整个Mysql集群中唯一 log-bin = /var/log/mysql/mysql-bin.log # 日志存放位置 log-bin-index = binlog.index
记得重启mysql,再查看二进制日志是否打开及其位置:
mysql> show variables like 'log_bin%'; +----------------------------------------+-----------------------------+ | Variable_name | Value | +----------------------------------------+-----------------------------+ | log_bin | ON | | log_bin_basename | /var/log/mysql/mysql-bin | | log_bin_index | /var/lib/mysql/binlog.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF |
然后就可以查看二进制日志了:
mysql> show master status; #查看当前日志 +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> show binary logs; #查看日志【所生成的全部日志文件】 +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 154 | +------------------+-----------+ 1 row in set (0.00 sec) mysql> show binlog events in 'mysql-bin.000001'; #可以查看对某个日志中具体的操作 +------------------+-----+----------------+-----------+-------------+-------------------------------------------- ------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+-------------------------------------------- ------------+ | mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.22-0ubuntu0.16.04.1-log, Bi nlog ver: 4 | | mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | | +------------------+-----+----------------+-----------+-------------+-------------------------------------------- ------------+ 2 rows in set (0.00 sec)
也可以使用mysqlbinlog命令来查看二进制日志文件中的的内容:
[root@localhost mysql]:~/ $ mysqlbinlog /var/lib/mysql/mysql-bin.xxxxx [15:14:30] /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; xxxxxxxxxxxxxxxx SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
4.慢查询日志
当参数slow_query_log = 1时,mysqld将记录一个执行时间超过long_query_time秒的所有SQL语句的日志文件。
查看慢查询日志的位置:
mysql> show variables like '%slow_query%'; +---------------------+--------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/54b78b286d5c-slow.log | +---------------------+--------------------------------------+ 2 rows in set (0.01 sec)
可以通过mysqldumpslow命令来查看和分析慢查询日志:
[root@localhost mysql]# mysqldumpslow /var/lib/mysql/54b78b286d5c-slow.log -t 2 -s al Reading mysql slow query log from /var/lib/mysql/iZbp1akzlq26t30fbsdwh7Z-slow.log -- count 执行次数 -- time 执行时间 -- lock 锁定时间 -- rows 返回条数 -- root[root]@localhost 通过那个用户执行的 Count: 5 Time=0.00s (0s) Lock=0.01s (0s) Rows=5.0 (25), root[root]@localhost SHOW COLUMNS FROM `yp_area`