官方文档
1、MySQL支持的日志
MySQL有不同类型日志文件,用来存储不同类型的日志,分别为 二进制日志、错误日志、通用查询日志、慢查询日志、中继日志、数据定义语句日志
慢查询日志
:记录所有执行时间超过 long_query_time的所有查询,方便优化通用查询日志
:记录所有连接的起始时间和中止时间,以及连接发送给数据库服务器的所有指令,对复原操作的实际场景、发现问题、甚至对数据库操作的审计有很大帮助错误日志
:记录MySQL服务的启动,运行、中止MySQL服务时出现的问题,方便了解服务器的状态,进而对服务器进行维护二进制日志
:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复中继日志
:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作数据定义语句日志
:记录数据定义语句执行的元数据操作
缺点:
- 日志功能会降低MySQL数据库的性能。MySQL服务器会花费很多时间记录日志
- 日志功能会占用大量的磁盘空间。对于用户量非常大,操作非常平凡的数据库,日志文件需要存储空间设置比数据库文件需要的存储空间还要大。
2、慢查询日志(slow query log)
见MySQL-性能分析
3、通用查询日志(general query log)
通用查询日志用来
记录用户的所有操作
,包括启动和关闭MySQL服务、所有用户的连接开始时间和结束时间,发送给MySQL服务器的所有SQL指令等。当数据库发生异常时,查看通用查询日志,还原操作时的具体场景
,可以帮助准确定位问题
3.1、查看当前状态
- 通过SQL语法
show variables like 'general%';
如下所示
mysql> show variables like 'general%';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log | OFF | # 通用查询日志是处于关闭状态
| general_log_file | /var/lib/mysql/localhost.log | # 通用查询日志文件名称为:localhost.log
+------------------+------------------------------+
2 rows in set (1.14 sec)
- general_log 参数说明:默认关闭状态,一旦开启记录通用查询日志,MySQL会记录所有连接起止操作和相关SQL操作,消耗系统资源并占用磁盘空间。
- 通用查询日志文件为 localhost.log,存储路径为 /var/lib/mysql/ ,默认也是数据路径。
3.2、启动日志的方式
- 方式一:永久性,通过修改 my.cnf 配置文件来设置。在[mysqld] 组下加入log 选项,并重启MySQL服务,如下所示:
[root@localhost ~]# vim /etc/my.cnf
general_log=on
general_log_file=/var/lib/mysql/general-test.log
[root@localhost ~]# systemctl restart mysqld.service
- 方式二:临时性方式,如下所示:
- set global general_log=on;
- set global general_log_file=‘filePath/fileName’;
3.3、查看日志信息
[root@localhost mysql]# vim general-test.log/usr/sbin/mysqld, Version: 8.0.25 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
2024-06-05T13:45:48.097757Z 8 Connect root@localhost on using Socket
2024-06-05T13:45:48.098777Z 8 Query show variables like 'general%'
2024-06-05T13:45:57.610846Z 8 Quit
2024-06-05T13:46:06.682806Z 9 Connect root@localhost on using Socket
2024-06-05T13:46:06.682857Z 9 Connect Access denied for user 'root'@'localhost' (using password: YES)
2024-06-05T13:46:17.784997Z 10 Connect root@localhost on using Socket
2024-06-05T13:46:17.785202Z 10 Query select @@version_comment limit 1
2024-06-05T13:46:20.808524Z 10 Query show variables like 'general%'
~
3.4、删除\刷新日志
手动删除日志
: 执行 show variables like ‘general_log%’; 手动删除返回日志信息刷新日志
:mysqladmin -uroot -p flush-logs;
[root@localhost mysql]# mysqladmin -uroot -p flush-logs
4、错误日志
错误日志记录了MySQL服务器启动、停止运行的时间,以及系统启动、运行、停止过程中的诊断信息,包括
错误、警告、提示等
通过错误日志可以查看系统的运行状态,便于及时发现故障,修复故障。如果MySQL服务 出现异常,错误日志是发现问题、解决故障的首选
4.1、启动日志
- MySQL中错误日志功能是默认开启的,无法被禁止。默认情况下错误日志存储在MySQL数据库的数据文件下,默认名称为:mysqld.log。如需指定文件名,则需要在my.cnf中配置以下信息,并重启MySQL服务器
log-error=[path(日志文件所在目录路径)/fileName(日志文件名称)]
4.2、查看日志
mysql> show variables like 'log_error%';
+----------------------------+----------------------------------------+
| Variable_name | Value |
+----------------------------+----------------------------------------+
| log_error | /var/log/mysqld.log |
| log_error_services | log_filter_internal; log_sink_internal |
| log_error_suppression_list | |
| log_error_verbosity | 2 |
+----------------------------+----------------------------------------+
4 rows in set (0.00 sec)
4.3、删除\刷新日志
- 删除操作
[root@localhost mysql]# rm -f /var/log/mysqld.log
- 重名文件
[root@localhost mysql]# mv /var/log/mysqld.log /var/log/mysqld.log.bak
- 重建日志
[root@localhost mysql]# install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
[root@localhost mysql]# mysqladmin -uroot -p flush-logs
5、二进制日志 ( bin log )
binlog 即 binary log ,二进制日志文件,也称为变更日志(update log)。记录数据库中所有执行的DDL 和 DML 等数据库更新事件的语句,但不包含没有修改任何数据的语句。
他以事件形式记录并保存在二进制文件中。通过这些信息可以再现数据更新操作的全过程
5.1、应用场景
- 数据恢复:如果MySQL意外停止,可以通过二进制日志文件来查看用户执行了哪些操作,对数据库服务器文件做了那些修改,然后根据二进制日志文件中的记录来恢复数据库服务器
- 数据复制:由于日志的延续性和时效性,master把它的二进制日志传递给slaves来达到master-slave数据的一致目的
MySQL数据备份、主备、主从、主主都离不开 bin log,需要依靠binlog来同步数据,保证数据的一致性
5.2、查看默认情况
- 通过执行
show variables like '%log_bin%';
获取信息,如下所示:
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/binlog |
| log_bin_index | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------+
6 rows in set (0.94 sec)
- log_bin_basename:是binlog日志的基本文件名,后面会追加标识来表示每一个文件。
- log_bin_index:是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录。
- log_bin_trust_function_creators:限制存储过程,用于主从复制,而存储函数有可能导致主从的数据不一致。当开启二进制日志后,需要限制存储函数的创建、修改、调用
- log_bin_use_v1_row_events:只读系统变量
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# ll
总用量 188940
-rw-r-----. 1 mysql mysql 156 5月 7 06:56 binlog.000010
-rw-r-----. 1 mysql mysql 156 5月 8 07:09 binlog.000011
-rw-r-----. 1 mysql mysql 156 5月 9 06:56 binlog.000012
-rw-r-----. 1 mysql mysql 156 5月 13 07:19 binlog.000013
-rw-r-----. 1 mysql mysql 609 5月 15 05:36 binlog.000014
-rw-r-----. 1 mysql mysql 2461 5月 22 06:15 binlog.000015
-rw-r-----. 1 mysql mysql 156 5月 23 06:34 binlog.000016
-rw-r-----. 1 mysql mysql 453 5月 27 06:03 binlog.000017
-rw-r-----. 1 mysql mysql 1190 5月 28 06:09 binlog.000018
-rw-r-----. 1 mysql mysql 156 5月 29 05:48 binlog.000019
-rw-r-----. 1 mysql mysql 156 5月 30 08:23 binlog.000020
-rw-r-----. 1 mysql mysql 381 6月 1 05:37 binlog.000021
-rw-r-----. 1 mysql mysql 156 6月 4 08:01 binlog.000022
-rw-r-----. 1 mysql mysql 156 6月 5 06:00 binlog.000023
-rw-r-----. 1 mysql mysql 179 6月 5 06:39 binlog.000024
-rw-r-----. 1 mysql mysql 179 6月 5 06:45 binlog.000025
-rw-r-----. 1 mysql mysql 200 6月 5 06:54 binlog.000026
-rw-r-----. 1 mysql mysql 156 6月 6 06:45 binlog.000027
-rw-r-----. 1 mysql mysql 156 6月 6 06:45 binlog.000028
-rw-r-----. 1 mysql mysql 304 6月 6 06:45 binlog.index
5.3、日志参数设置
- 方式一:修改my.cnf配置文件
[root@localhost mysql]# vim /etc/my.cnf[mysqld]
#
log-bin=rqtanc-bin
binlog_expire_logs_seconds=3600
max_binlog_size=10M
如果想改变日志文件的目录和名称,新建的文件夹需要使用mysql用户,使用以下命令
chown -R -v mysql:mysql binlog
- 方式二:修改会话级变量
mysql> set sql_log_bin=0;
5.4、查看日志
MySQL重启一次,rqtanc-bin.000001 日志文件后缀文件默认加1,即日志文件的数量与服务重启的次数相同;如果日志长度超过了max_binlog_size的设定值就会创建一个新的日志文件。
- 查看当前的二进制文件大小,通过执行
show binary logs;
命令,如下所示:
mysql> show binary logs;
+-------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+-------------------+-----------+-----------+
| rqtanc-bin.000001 | 156 | No |
+-------------------+-----------+-----------+
1 row in set (0.11 sec)
- 通过
mysqlbinlog
命令工具,查看binlog日志:
[root@localhost mysql]# mysqlbinlog -v /rqtanc-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
mysqlbinlog: File '/rqtanc-bin.000001' not found (OS errno 2 - No such file or directory)
ERROR: Could not open log file
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> show binlg events [ in 'log_name' ] [ from pos ] [ limit [ offset , ] row_rount ]
- in ‘log_name’:指定查询的binlog文件名
- from pos:指定从哪个pos起始点开始查起
- limit [ offset , ]:偏移量
- row_count:查询条数
mysql> show binlog events;
+-------------------+-----+----------------+-----------+-------------+-----------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+-------------------+-----+----------------+-----------+-------------+-----------------------------------+
| rqtanc-bin.000001 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.25, Binlog ver: 4 |
| rqtanc-bin.000001 | 125 | Previous_gtids | 1 | 156 | |
+-------------------+-----+----------------+-----------+-------------+-----------------------------------+
2 rows in set (0.19 sec)
5.5、使用binlog恢复数据
如果MySQL启用了二进制日志,在数据库出现意外丢失数据时,可以使用MySQL binnlog工具从指定的时间点开始直到现在或另外一个事件点的日志中恢复数据
- 语法:
mysqlbinlog [ option ] filename | mysql -uuserName -pPassword;
- filename:日志文件名
- option:可选项,比较重要的两对参数是
--start-datetime、--stop-datetime
和--start-position、--stop-position
- –start-date 和 --end-date:可以指定恢复恢复数据库的起始时间点和结束时间点
- –start-position 和 --stop-position :可以指定恢复数据库的起始位置和结束位置
- 数据模拟及实现数据恢复如下所示:
#查询日志文件
mysql> show binary logs;
+-------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+-------------------+-----------+-----------+
| rqtanc-bin.000001 | 156 | No |
| rqtanc-bin.000002 | 204 | No |
| rqtanc-bin.000003 | 204 | No |
| rqtanc-bin.000004 | 156 | No |
+-------------------+-----------+-----------+
4 rows in set (0.00 sec)
#查询相关表
mysql> select * from rqtanc;
Empty set (0.00 sec)
#插入数据
mysql> insert into rqtanc values('1','rqtanc'),('2','rqtanc1'),('3','rqtanc3');
Query OK, 3 rows affected (0.37 sec)
Records: 3 Duplicates: 0 Warnings: 0
#查询数据
mysql> select * from rqtanc;
+----+---------+
| id | name |
+----+---------+
| 1 | rqtanc |
| 2 | rqtanc1 |
| 3 | rqtanc3 |
+----+---------+
3 rows in set (0.00 sec)
#模拟误删除操作
mysql> delete from rqtanc where id = '3';
Query OK, 1 row affected (0.11 sec)
#查询数据
mysql> select * from rqtanc;
+----+---------+
| id | name |
+----+---------+
| 1 | rqtanc |
| 2 | rqtanc1 |
+----+---------+
2 rows in set (0.00 sec)
#查询binlog日志
mysql> show binary logs;
+-------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+-------------------+-----------+-----------+
| rqtanc-bin.000001 | 156 | No |
| rqtanc-bin.000002 | 204 | No |
| rqtanc-bin.000003 | 204 | No |
| rqtanc-bin.000004 | 767 | No |
+-------------------+-----------+-----------+
4 rows in set (0.00 sec)
#刷新日志
mysql> flush logs;
Query OK, 0 rows affected (0.04 sec)
#再次查询binlog日志,有新日志文件生成
mysql> show binary logs;
+-------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+-------------------+-----------+-----------+
| rqtanc-bin.000001 | 156 | No |
| rqtanc-bin.000002 | 204 | No |
| rqtanc-bin.000003 | 204 | No |
| rqtanc-bin.000004 | 815 | No |
| rqtanc-bin.000005 | 156 | No |
+-------------------+-----------+-----------+
5 rows in set (0.00 sec)
- 方式一:根据起始位置恢复数据
#查看binlog日志详情
mysql> show binlog events in 'rqtanc-bin.000004';
+-------------------+-----+----------------+-----------+-------------+--------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+-------------------+-----+----------------+-----------+-------------+--------------------------------------+
| rqtanc-bin.000004 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.25, Binlog ver: 4 |
| rqtanc-bin.000004 | 125 | Previous_gtids | 1 | 156 | |
| rqtanc-bin.000004 | 156 | Anonymous_Gtid | 1 | 235 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| rqtanc-bin.000004 | 235 | Query | 1 | 310 | BEGIN |
| rqtanc-bin.000004 | 310 | Table_map | 1 | 370 | table_id: 90 (test.rqtanc) |
| rqtanc-bin.000004 | 370 | Write_rows | 1 | 443 | table_id: 90 flags: STMT_END_F |
| rqtanc-bin.000004 | 443 | Xid | 1 | 474 | COMMIT /* xid=18 */ |
| rqtanc-bin.000004 | 474 | Anonymous_Gtid | 1 | 553 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| rqtanc-bin.000004 | 553 | Query | 1 | 628 | BEGIN |
| rqtanc-bin.000004 | 628 | Table_map | 1 | 688 | table_id: 90 (test.rqtanc) |
| rqtanc-bin.000004 | 688 | Delete_rows | 1 | 736 | table_id: 90 flags: STMT_END_F |
| rqtanc-bin.000004 | 736 | Xid | 1 | 767 | COMMIT /* xid=20 */ |
| rqtanc-bin.000004 | 767 | Rotate | 1 | 815 | rqtanc-bin.000005;pos=4 |
+-------------------+-----+----------------+-----------+-------------+--------------------------------------+
13 rows in set (0.05 sec)# 根据起始位置恢复数据
[root@localhost ~]# /usr/bin/mysqlbinlog --start-position=235 --stop-position=553 --database=test /var/lib/mysql/rqtanc-bin.000004 | /usr/bin/mysql -uroot -p123456 -v test
mysql: [Warning] Using a password on the command line interface can be insecure.
--------------
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/
----------------------------
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/
----------------------------
BINLOG '
6hhkZg8BAAAAeQAAAH0AAAAAAAQAOC4wLjI1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigBU7Qrqg==
'
----------------------------
SET TIMESTAMP=1717836114
----------------------------
SET @@session.pseudo_thread_id=8
----------------------------
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1
----------------------------
SET @@session.sql_mode=1168113696
----------------------------
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1
----------------------------
/*!*/
----------------------------
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255
----------------------------
SET @@session.lc_time_names=0
----------------------------
SET @@session.collation_database=DEFAULT
----------------------------
/*!80011 SET @@session.default_collation_for_utf8mb4=255*/
----------------------------
BEGIN
----------------------------
BINLOG '
UhlkZhMBAAAAPAAAAHIBAAAAAFoAAAAAAAEABHRlc3QABnJxdGFuYwACAw8CyAACAQEAAgP8/wA7
OiP7
UhlkZh4BAAAASQAAALsBAAAAAFoAAAAAAAEAAgAC/wABAAAABnJxdGFuYwACAAAAB3JxdGFuYzEA
AwAAAAdycXRhbmMzWeEi3Q==
'
----------------------------
COMMIT
----------------------------
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*/
----------------------------
/*!80001 SET @@session.original_commit_timestamp=1717836158602573*/
----------------------------
/*!80014 SET @@session.original_server_version=80025*/
----------------------------
/*!80014 SET @@session.immediate_server_version=80025*/
----------------------------
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
----------------------------
BEGIN
----------------------------
ROLLBACK
----------------------------
SET @@SESSION.GTID_NEXT= 'AUTOMATIC'
----------------------------
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/
----------------------------
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/
--------------mysql> select * from rqtanc;
+----+---------+
| id | name |
+----+---------+
| 1 | rqtanc |
| 2 | rqtanc1 |
| 3 | rqtanc3 |
+----+---------+
3 rows in set (0.01 sec)
- 方式二:根据起始时间恢复数据
#查询日志详情信息
[root@localhost ~]# mysqlbinlog -v '/var/lib/rqtanc-bin.000004'
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
mysqlbinlog: File '/var/lib/rqtanc-bin.000004' not found (OS errno 2 - No such file or directory)
ERROR: Could not open log file
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 ~]# mysqlbinlog -v '/var/lib/mysql/rqtanc-bin.000004'
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240608 1:40:10 server id 1 end_log_pos 125 CRC32 0xaa2bb453 Start: binlog v 4, server v 8.0.25 created 240608 1:40:10
BINLOG '
6hhkZg8BAAAAeQAAAH0AAAAAAAQAOC4wLjI1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigBU7Qrqg==
'/*!*/;
# at 125
#240608 1:40:10 server id 1 end_log_pos 156 CRC32 0x70ab425d Previous-GTIDs
# [empty]
# at 156
#240608 1:41:54 server id 1 end_log_pos 235 CRC32 0x977456ff Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=yes original_committed_timestamp=1717836114823630 immediate_commit_timestamp=1717836114823630 transaction_length=318
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1717836114823630 (2024-06-08 01:41:54.823630 PDT)
# immediate_commit_timestamp=1717836114823630 (2024-06-08 01:41:54.823630 PDT)
/*!80001 SET @@session.original_commit_timestamp=1717836114823630*//*!*/;
/*!80014 SET @@session.original_server_version=80025*//*!*/;
/*!80014 SET @@session.immediate_server_version=80025*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 235
#240608 1:41:54 server id 1 end_log_pos 310 CRC32 0x4aa4c758 Query thread_id=8 exec_time=0 error_code=0
SET TIMESTAMP=1717836114/*!*/;
SET @@session.pseudo_thread_id=8/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
BEGIN
/*!*/;
# at 310
#240608 1:41:54 server id 1 end_log_pos 370 CRC32 0xfb233a3b Table_map: `test`.`rqtanc` mapped to number 90
# at 370
#240608 1:41:54 server id 1 end_log_pos 443 CRC32 0xdd22e159 Write_rows: table id 90 flags: STMT_END_FBINLOG '
UhlkZhMBAAAAPAAAAHIBAAAAAFoAAAAAAAEABHRlc3QABnJxdGFuYwACAw8CyAACAQEAAgP8/wA7
OiP7
UhlkZh4BAAAASQAAALsBAAAAAFoAAAAAAAEAAgAC/wABAAAABnJxdGFuYwACAAAAB3JxdGFuYzEA
AwAAAAdycXRhbmMzWeEi3Q==
'/*!*/;
### INSERT INTO `test`.`rqtanc`
### SET
### @1=1
### @2='rqtanc'
### INSERT INTO `test`.`rqtanc`
### SET
### @1=2
### @2='rqtanc1'
### INSERT INTO `test`.`rqtanc`
### SET
### @1=3
### @2='rqtanc3'
# at 443
#240608 1:41:54 server id 1 end_log_pos 474 CRC32 0xe09b76a8 Xid = 18
COMMIT/*!*/;
# at 474
#240608 1:42:38 server id 1 end_log_pos 553 CRC32 0x1abc857d Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=yes original_committed_timestamp=1717836158602573 immediate_commit_timestamp=1717836158602573 transaction_length=293
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1717836158602573 (2024-06-08 01:42:38.602573 PDT)
# immediate_commit_timestamp=1717836158602573 (2024-06-08 01:42:38.602573 PDT)
/*!80001 SET @@session.original_commit_timestamp=1717836158602573*//*!*/;
/*!80014 SET @@session.original_server_version=80025*//*!*/;
/*!80014 SET @@session.immediate_server_version=80025*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 553
#240608 1:42:38 server id 1 end_log_pos 628 CRC32 0x0f1f2339 Query thread_id=8 exec_time=0 error_code=0
SET TIMESTAMP=1717836158/*!*/;
BEGIN
/*!*/;
# at 628
#240608 1:42:38 server id 1 end_log_pos 688 CRC32 0x46e9db54 Table_map: `test`.`rqtanc` mapped to number 90
# at 688
#240608 1:42:38 server id 1 end_log_pos 736 CRC32 0x25fe86d4 Delete_rows: table id 90 flags: STMT_END_FBINLOG '
fhlkZhMBAAAAPAAAALACAAAAAFoAAAAAAAEABHRlc3QABnJxdGFuYwACAw8CyAACAQEAAgP8/wBU
2+lG
fhlkZiABAAAAMAAAAOACAAAAAFoAAAAAAAEAAgAC/wADAAAAB3JxdGFuYzPUhv4l
'/*!*/;
### DELETE FROM `test`.`rqtanc`
### WHERE
### @1=3
### @2='rqtanc3'
# at 736
#240608 1:42:38 server id 1 end_log_pos 767 CRC32 0xcdd3ee31 Xid = 20
COMMIT/*!*/;
# at 767
#240608 1:45:55 server id 1 end_log_pos 815 CRC32 0x09dfc5a8 Rotate to rqtanc-bin.000005 pos: 4
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 ~]# /usr/bin/mysqlbinlog --start-datetime='2024-06-08 01:41:54' --stop-datetime='2024-06-08 01:42:37' --database=test /var/lib/mysql/rqtanc-bin.000004 | /usr/bin/mysql -uroot -p123456 -v test
mysql: [Warning] Using a password on the command line interface can be insecure.
--------------
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/
----------------------------
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/
----------------------------
BINLOG '
6hhkZg8BAAAAeQAAAH0AAAAAAAQAOC4wLjI1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigBU7Qrqg==
'
----------------------------
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*/
----------------------------
/*!80001 SET @@session.original_commit_timestamp=1717836114823630*/
----------------------------
/*!80014 SET @@session.original_server_version=80025*/
----------------------------
/*!80014 SET @@session.immediate_server_version=80025*/
----------------------------
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
----------------------------
SET TIMESTAMP=1717836114
----------------------------
SET @@session.pseudo_thread_id=8
----------------------------
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1
----------------------------
SET @@session.sql_mode=1168113696
----------------------------
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1
----------------------------
/*!*/
----------------------------
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255
----------------------------
SET @@session.lc_time_names=0
----------------------------
SET @@session.collation_database=DEFAULT
----------------------------
/*!80011 SET @@session.default_collation_for_utf8mb4=255*/
----------------------------
BEGIN
----------------------------
BINLOG '
UhlkZhMBAAAAPAAAAHIBAAAAAFoAAAAAAAEABHRlc3QABnJxdGFuYwACAw8CyAACAQEAAgP8/wA7
OiP7
UhlkZh4BAAAASQAAALsBAAAAAFoAAAAAAAEAAgAC/wABAAAABnJxdGFuYwACAAAAB3JxdGFuYzEA
AwAAAAdycXRhbmMzWeEi3Q==
'
----------------------------
COMMIT
----------------------------
SET @@SESSION.GTID_NEXT= 'AUTOMATIC'
----------------------------
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/
----------------------------
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/
--------------
5.6、删除二进制日志文件
MySQL二进制文件可以配置自动删除,同时MySQL也提供了安全的手动删除二进制的方法。如:
PURGE MASTER LOGS
只删除指定部分的二进制日志文件,RESET MASTER
删除所有的二进制日志文件
PURGE MASTER LOGS
:删除指定日志文件。语法如下所示- PURGE { MASTER | BINARY } LOGS TO ‘指定日志文件名’;
- PURGE { MASTER | BINARY } LOGS BEFORE ‘指定日期’
RESET MASTER
:删除所有二进制文件。- 删除后MySQL会重新创建二进制日志文件,新的文件拓展名重新从000001开始编号。
(不推荐)
- 删除后MySQL会重新创建二进制日志文件,新的文件拓展名重新从000001开始编号。
5.7、BinLog写入机制
事务执行过程中,先把日志写入到
binlog cache
,事务提交时,再把binlog cache
写入到binlog文件
中。而一个事务的binlog并不能被拆开,无论这个事务多大也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache。
- 通过设置 binlog_cache_size 参数控制单个线程 binlog cache大小,如果存储内容超过了这个参数则需暂存到磁盘(Swap)中。
mysql> show variables like '%binlog_cache_size%';
+-----------------------+----------------------+
| Variable_name | Value |
+-----------------------+----------------------+
| binlog_cache_size | 32768 |
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+
2 rows in set (1.88 sec)
- binlog日志刷盘流程如下:
- write 和 fsync的时机,可以通过设置 sync_binlog 的参数控制,默认 0。如下所示:
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (2.38 sec)
-
sync_binlog的参数值为 0 时,表示每次提交事务都只write,由系统自行判断什么时候执行fsync。性能得到提升,但是宕机后,page cache 中的binlog信息会丢失,如下所示:
-
sync_binlog的参数值设置为 1,表示每次提交事务都会执行 fsync,就和 redo log 刷盘流程一样。或将参数值设置为N(N>1),表示每次提交事务都write,但累积N个事务后再fsync。如图所示:
6、中继日志(relay log)
中继日志只在主从服务器架构的从服务器上存在
。从服务器为了和主服务器保持一致,要从主服务器读取二进制日志的内容,并将读取的内容写入到本地日志文件中(即 中继日志)
。
从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的数据同步
。
主从服务搭建完成后,中继日志默认保存在从服务器的数据目录下,文件格式为:从服务器名 -relay-bin.序号
。索引文件为:-relay-bin.index
,用来定位当前正在使用的中继日志。
6.1、查看中继日志
- 中继日志与二进制日志格式相同,使用
mysqlbinlog
工具进行查看
mysql> show variables like 'relay_log%';
+---------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------+------------------------------------------+
| relay_log | localhost-relay-bin |
| relay_log_basename | /var/lib/mysql/localhost-relay-bin |
| relay_log_index | /var/lib/mysql/localhost-relay-bin.index |
| relay_log_info_file | relay-log.info |
| relay_log_info_repository | TABLE |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
+---------------------------+------------------------------------------+
8 rows in set (0.18 sec)
6.2、恢复典型错误
如果服务器宕机,有时为了系统恢复需要重新安装操作系统,可能会导致 服务器名称 与之前 并不一致。而中继日志是包含从服务器名称的。
在上述情况下,可能导致恢复从服务器的时候,无法从宕机前的中继日志里读取数据。
解决方案
: 将从服务器名称 修改为 以前的名称