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`