文章最后更新时间:2022年10月26日已超过765天没有更新。
常见的日志文件
日志类型 | 写入日志的信息 | 备注 |
---|---|---|
错误日志(error-log) | 记录MySQL在启动、运行和停止时遇到的问题 | 用于排查mysql运行故障 |
一般查询日志(general_log) | 建立所有客户端发向服务端的请求 | 无论请求是否成功都会记录在这个日志,数据非常庞大,不建议开启,当怀疑客户端请求有问题时候,可以临时开启 |
慢查询日志(slow_query_log) | long_query_time执行时间超过几秒的查询 | 可以排查哪些SQL语句执行比较慢,方便优化sql语句,提高查询效率 |
二进制日志(binary_log) | 更改数据的语句(也用于复制) | 可以用来恢复数据、主从复制也使用到这个日志,建议开启 |
中继日志(relay_log) | 从复制主服务器收到的数据更改 | 用于主从复制,临时存储从主库同步的二进制日志 |
DDL日志(元数据日志) | 由DDL语句执行的元数据操作 |
错误日志(默认是开启的)
修改my.cnf文件
log_error=/path路径 #默认存在$datadir/hostname.err
指定错误日志的路径
一般查询日志(默认是禁用的)
#开启常规查询日志(0表示禁用,1表示开启) general_log= 0 #指定常规日志的路径及文件名 general_log_file=file_name
该参数用于定义general log 和 slow log的输出目标
log-output=value #value=[ TABLE | FILE | NONE ]默认值为FILE #TABLE表示将日志记录到表中,general_log表或者slow_log表中 #FILE表示将日志记录到文本文件中 #NONE表示不记录到表或者文件
慢查询日志
#开启慢查询日志(0表示关闭,1表示开启) slow_query_log=1 #指定慢查询日志的路径及文件名,默认$datadir /host_name-slow.log slow_query_log_file=file_name #定义日志输出目标 log-output=value #定义查询语句超过N秒就被记录到slow log里,最小值为0,默认值为10秒 long_query_time=1 #默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询;可以使用log_slow_admin_statements和更改此行为log_queries_not_using_indexes #记录执行较慢的管理语句 log_slow_admin_statements=1 #记录执行较慢的未使用索引的语句 log_queries_not_using_indexes=1
案例:
vim /etc/my.cnf slow_query_log=1 #开启慢查询日志功能 slow_query_log_file=/data/log/slow.log #指定慢查询日志存放路径 long_query_time=1 #超过一秒就视为慢查询语句并写入日志
二进制日志
作用:二进制日志记录数据库的所有更改操作(DDL/DML/DCL),不包含select或者show这类语句
用于主从复制中,master主服务器将二进制日志中的更改操作发送给slave从服务器,从服务器执行这些更改操作,达到与主服务器同步的效果。
用于数据的恢复操作。
默认二进制日志是关闭的,可以使用log-bin=xxx参数开启
mysqlbinlog工具查看
二进制日志三种格式:
日志格式 | 含义 |
---|---|
STATEMENT | 基于SQL语句的日志记录,记录是SQL语句,对数据进行修改的SQL都会记录在日志文件中。 |
ROW | 基于行的日志记录,记录的是每一行的数据变更(默认)。 |
MIXED | 混合了STATEMENT和ROW两种格式,默认采用STATEMENT,在某些特殊情况下会自动切换为ROW进行记录。 |
案例:
#创建bin目录存放二进制日志 [root@localhost mysql5.7]# mkdir /data/mysql57/log/bin [root@localhost mysql5.7]# chown -R mysql:mysql /data/ [root@localhost mysql5.7]# vim my.cnf #开启二进制日志 log-bin=/data/mysql57/log/bin/mybin.log #设置二进制日志使用内存大小 binlog_cache_size=1M #设置使用二进制的日志格式 binlog_format=row #二进制日志过期清理时间 expire_logs_days=7 #跳过主从复制遇中遇到的1062问题,1062错误是指一些主键重复,1032是主从数据库数据不一致导致的 slave_skip_errors=1062 #mysql服务器ID,需保证唯一 server-id=1 #是否只读,1代表只读,0代表读写 read-only=0 #不需要备份的数据库 binlog-ignore-db=mysql #指定同步的数据库 #binlog-do-db=数据库名
#查看二进制日志 [root@localhost mysql5.7]# ls /data/mysql57/log/bin/mybin.000001 mybin.index
查看二进制日志是否开启
mysql> show variables like "%log_bin%"; +---------------------------------+-----------------------------------+ | Variable_name | Value | +---------------------------------+-----------------------------------+ | log_bin | ON | | log_bin_basename | /data/mysql57/log/bin/mybin | | log_bin_index | /data/mysql57/log/bin/mybin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+-----------------------------------+ 6 rows in set (0.00 sec) #临时开启或者关闭 #mysql> set global log_bin=on;
查看二进制日志
mysqlbinlog 参数选项 日志名
由于日志是由二进制方式储存的,不能直接读取,需要通过二进制日志查询工具mysqlbinlog来查看
参数选项:
-d 指定数据库名称,只列出指定的数据库相关操作
-o 忽略掉日志中的前N行命令
-v 将行事件(数据变更)重构为sql语句
-vv 将行事件(数据变更)重构为sql语句,并输出注释信息
新建一个数据库:
[root@localhost mysql5.7]# mysql -S /tmp/mysql57.sock -uroot -p Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.39-log MySQL Community Server (GPL) Copyright (c) 2000, 2022, Oracle and/or its affiliates. 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> create database ldx; Query OK, 1 row affected (0.00 sec)
查看二进制日志,啥也没看出,这是正常的,row模式下,是看不懂,需要加-v重构成SQL语句
[root@localhost bin]# /usr/local/mysql5.7/bin/mysqlbinlog mybin.000002 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #221025 2:46:14 server id 1 end_log_pos 123 CRC32 0x72141927 Start: binlog v 4, server v 5.7.39-log created 221025 2:46:14 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' NoZXYw8BAAAAdwAAAHsAAAABAAQANS43LjM5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA2hldjEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA AScZFHI= '/*!*/; # at 123 #221025 2:46:14 server id 1 end_log_pos 154 CRC32 0xeedca3e4 Previous-GTIDs # [empty] # at 154 #221025 2:46:32 server id 1 end_log_pos 219 CRC32 0x8185caf0 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=yes /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 219 #221025 2:46:32 server id 1 end_log_pos 290 CRC32 0x8b4f133e Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1666680392/*!*/; SET @@session.pseudo_thread_id=2/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1436549152/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 290 #221025 2:46:32 server id 1 end_log_pos 343 CRC32 0x3ea46a33 Table_map: `ldx`.`student` mapped to number 109 # at 343 #221025 2:46:32 server id 1 end_log_pos 394 CRC32 0x7650b720 Write_rows: table id 109 flags: STMT_END_F BINLOG ' SIZXYxMBAAAANQAAAFcBAAAAAG0AAAAAAAEAA2xkeAAHc3R1ZGVudAADAw8DAgwABzNqpD4= SIZXYx4BAAAAMwAAAIoBAAAAAG0AAAAAAAEAAgAD//gDAAAABuW8oOmjnhoAAAAgt1B2 '/*!*/; # at 394 #221025 2:46:32 server id 1 end_log_pos 425 CRC32 0x018f7225 Xid = 5 COMMIT/*!*/; # at 425 #221025 2:46:45 server id 1 end_log_pos 490 CRC32 0xfbbe28f1 Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=yes /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 490 #221025 2:46:45 server id 1 end_log_pos 561 CRC32 0xcd4d8237 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1666680405/*!*/; BEGIN /*!*/; # at 561 #221025 2:46:45 server id 1 end_log_pos 614 CRC32 0x3e4608e5 Table_map: `ldx`.`student` mapped to number 109 # at 614 #221025 2:46:45 server id 1 end_log_pos 665 CRC32 0x94992531 Write_rows: table id 109 flags: STMT_END_F BINLOG ' VYZXYxMBAAAANQAAAGYCAAAAAG0AAAAAAAEAA2xkeAAHc3R1ZGVudAADAw8DAgwAB+UIRj4= VYZXYx4BAAAAMwAAAJkCAAAAAG0AAAAAAAEAAgAD//gEAAAABuWFs+e+vRsAAAAxJZmU '/*!*/; # at 665 #221025 2:46:45 server id 1 end_log_pos 696 CRC32 0x5a4cc9c9 Xid = 6 COMMIT/*!*/; 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*/;
[root@localhost bin]# /usr/local/mysql5.7/bin/mysqlbinlog -v mybin.000002 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #221025 2:46:14 server id 1 end_log_pos 123 CRC32 0x72141927 Start: binlog v 4, server v 5.7.39-log created 221025 2:46:14 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' NoZXYw8BAAAAdwAAAHsAAAABAAQANS43LjM5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA2hldjEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA AScZFHI= '/*!*/; # at 123 #221025 2:46:14 server id 1 end_log_pos 154 CRC32 0xeedca3e4 Previous-GTIDs # [empty] # at 154 #221025 2:46:32 server id 1 end_log_pos 219 CRC32 0x8185caf0 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=yes /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 219 #221025 2:46:32 server id 1 end_log_pos 290 CRC32 0x8b4f133e Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1666680392/*!*/; SET @@session.pseudo_thread_id=2/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1436549152/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 290 #221025 2:46:32 server id 1 end_log_pos 343 CRC32 0x3ea46a33 Table_map: `ldx`.`student` mapped to number 109 # at 343 #221025 2:46:32 server id 1 end_log_pos 394 CRC32 0x7650b720 Write_rows: table id 109 flags: STMT_END_F BINLOG ' SIZXYxMBAAAANQAAAFcBAAAAAG0AAAAAAAEAA2xkeAAHc3R1ZGVudAADAw8DAgwABzNqpD4= SIZXYx4BAAAAMwAAAIoBAAAAAG0AAAAAAAEAAgAD//gDAAAABuW8oOmjnhoAAAAgt1B2 '/*!*/; ### INSERT INTO `ldx`.`student` ### SET ### @1=3 ### @2='张飞' ### @3=26 # at 394 #221025 2:46:32 server id 1 end_log_pos 425 CRC32 0x018f7225 Xid = 5 COMMIT/*!*/; # at 425 #221025 2:46:45 server id 1 end_log_pos 490 CRC32 0xfbbe28f1 Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=yes /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 490 #221025 2:46:45 server id 1 end_log_pos 561 CRC32 0xcd4d8237 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1666680405/*!*/; BEGIN /*!*/; # at 561 #221025 2:46:45 server id 1 end_log_pos 614 CRC32 0x3e4608e5 Table_map: `ldx`.`student` mapped to number 109 # at 614 #221025 2:46:45 server id 1 end_log_pos 665 CRC32 0x94992531 Write_rows: table id 109 flags: STMT_END_F BINLOG ' VYZXYxMBAAAANQAAAGYCAAAAAG0AAAAAAAEAA2xkeAAHc3R1ZGVudAADAw8DAgwAB+UIRj4= VYZXYx4BAAAAMwAAAJkCAAAAAG0AAAAAAAEAAgAD//gEAAAABuWFs+e+vRsAAAAxJZmU '/*!*/; ### INSERT INTO `ldx`.`student` ### SET ### @1=4 ### @2='关羽' ### @3=27 # at 665 #221025 2:46:45 server id 1 end_log_pos 696 CRC32 0x5a4cc9c9 Xid = 6 COMMIT/*!*/; 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*/;
mysql> select * from student; +------+--------+------+ | id | name | age | +------+--------+------+ | 1 | 张三 | 23 | | 2 | lisi | 26 | | 3 | 张飞 | 26 | | 4 | 关羽 | 27 | +------+--------+------+ 4 rows in set (0.00 sec)
总结:重启mysql后,我添加了两行数据,在二进制日志文件加了-v就可以看出关羽、张飞等sql语句!
中继日志
作用:
用于主从复制,master主服务器将自己的二进制日志发送给slave从服务器,slave先保存在自己的中继日志中,然后再执行自己本地的relay log里的sql达到数据库更改和master保持一致。
默认中继日志没有开启,可以使用relay-log参数开启。
#开启中继日志 relay-log=/data/mysql57/log/relay/myrelay.log #保证了relay-log的完整性 relay-log-recovery=1 #binlog日志写入系统缓存,保证安全性 sync-relay-log=1
mysql> show variables like '%relay%'; +---------------------------+---------------------------------------+ | Variable_name | Value | +---------------------------+---------------------------------------+ | max_relay_log_size | 0 | | relay_log | /data/mysql57/log/relay/myrelay.log | | relay_log_basename | /data/mysql57/log/relay/myrelay | | relay_log_index | /data/mysql57/log/relay/myrelay.index | | relay_log_info_file | relay-log.info | | relay_log_info_repository | FILE | | relay_log_purge | ON | | relay_log_recovery | ON | | relay_log_space_limit | 0 | | sync_relay_log | 1 | | sync_relay_log_info | 10000 | +---------------------------+---------------------------------------+ 11 rows in set (0.00 sec)
max_relay_log_size | 0 | relay log 允许的最大值,如果该值为0,则默认值为 max_binlog_size (1G); |
relay_log | 定义relay_log的位置路径,开启中继日志功能;如果值为空,则默认位置在数据文件的目录 | |
relay_log_info_file | relay-log.info | 记录 master 主库的 binary_log 的恢复位置和 slave库 relay_log 的位置 |
relay_log_purge | ON | 是否自动清空中继日志,默认值为1(启用) |
relay_log_recovery | OFF | 当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启 |
sync_relay_log | 10000 | 当设置为1时,slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区,然后刷入relay log中继日志里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量I/O; 当设置为0时,并不是马上就刷入中继日志里,而是由操作系统决定何时来写入,虽然安全性降低了,但减少了大量的磁盘I/O操作。这个值默认是0,可动态修改; |
sync_relay_log_info | 10000 | 这个参数和 sync_relay_log 参数一样 |