MySQL8.0-二进制日志(binlog)

1,182 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

二进制日志(binlog)

启用二进制日志,需要设置 log_binserver_id

如果将 big_bin 设置为 /data/binlogs/ 那么,二进制日志就会存储在 这个目录下的 server1.00001server1.00002 等日志文件中

每当服务器启动或刷新日志时,或者当前日志的大小达到 max_binlog_size(默认1GB)时,服务器都会新建一个文件;

每个日志文件都会在 server1.index 文件中维护

查看是否启用二进制日志

show variables like '%log_bin%';

+---------------------------------+--------------------+
| Variable_name                   | Value              |
+---------------------------------+--------------------+
| log_bin                         | ON                 |
| log_bin_basename                | /data/binlog       |
| log_bin_index                   | /data/binlog.index |
| log_bin_trust_function_creators | OFF                |
| log_bin_use_v1_row_events       | OFF                |
| sql_log_bin                     | ON                 |
+---------------------------------+--------------------+

# 显示当前服务器所有的二进制日志
show master logs;
show binary logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |       477 | No        |
| binlog.000002 |       156 | No        |
+---------------+-----------+-----------+

# 获取当前的二进制日志位置
show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      156 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

修改日志位置

需要先停止mysql

# 创建日志存储目录
mkdir /data/binlogs/server1
# 给mysql用户组权限
sudo chown -R mysql:mysql /data/binlogs/server1

修改my.cnf

[mysqld]追加第四、五行

注意:log_bin 这个路径表示:日志文件存储在/data/binlogs目录,前缀以server1命名

这样生成的文件如下

server_id保持唯一

/data/binlogs

  • server1
  • server1.000001
  • server1.index

修改完毕后重启,再次执行上面的sql查看是否修改成功

[mysqld]
lower_case_table_names=1
datadir=/data
log_bin=/data/binlogs/server1
server_id=100

修改 max_binlog_size

当日志文件达到设置的标准后,将会新建一个日志文件存储(默认1GB),所以我们可以动态的修改此值,无需重启

set @@global.max_binlog_size=536870912;

查看

select @@global.max_binlog_size;

切换到下一个日志文件

flush logs;

执行后可以使用查看日志sql查看效果

清理日志

1、设置日志过期时间

# 以秒为单位设置过期时间
set @@global.binlog_expire_logs_seconds=10000;

2、手动清除日志

方式1

手动清除可以使用sql purge binary logs to 'log_name';来删除,

其中log_name需要注意

例如:有日志文件:server1.000001、server1.000002、server1.000003

如果 log_name 填入 server1.000002,那么表示,server1.000001 会被删除

如果 log_name 填入 server1.000003,那么表示,server1.000001、server1.000002 都会被删除

即:填入的会删除比自身小的日志文件,但不包含自己

按照日期删除

purge binary logs before '2022-01-02 14:30:00';

删除所有日志从头开始

reset master;

不建议使用

提取日志

设置二进制格式

# 基于语句的复制 (SBR)
set @@global.binlog_format='STATEMENT';
# 基于行的复制(RBR)
set @@global.binlog_format='ROW';
# 基于 MIXED 格式
set @@global.binlog_format='MIXED';

global 级别的修改需要断开连接重新连接

提取日志

mysqlbinlog /data/binlogs/server1.000001

根据时间和位置抽取:

mysqlbinlog /data/binlogs/server1.000001 \
--start-datetime="2022-01-02 15:00:00" \
--stop-datetime="2022-01-02 19:00:00" \
> binlog_extract

根据数据库提取

mysqlbinlog /data/binlogs/server1.000001 \
--database=test \
> binlog_extract
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220102 19:31:31 server id 100  end_log_pos 125 CRC32 0xba41dff0        Start: binlog v 4, server v 8.0.27 created 220102 19:31:31 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
E43RYQ9kAAAAeQAAAH0AAAABAAQAOC4wLjI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAATjdFhEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigB8N9Bug==
'/*!*/;
# at 125
#220102 19:31:31 server id 100  end_log_pos 156 CRC32 0x14d6d966        Previous-GTIDs
# [empty]
# at 156
#220102 19:32:10 server id 100  end_log_pos 235 CRC32 0x0c1d9e4c        Anonymous_GTID  last_committed=0        sequence_number=1       rbr_only=no     original_committed_timestamp=1641123130966660    immediate_commit_timestamp=1641123130966660     transaction_length=309
# original_commit_timestamp=1641123130966660 (2022-01-02 19:32:10.966660 CST)
# immediate_commit_timestamp=1641123130966660 (2022-01-02 19:32:10.966660 CST)
/*!80001 SET @@session.original_commit_timestamp=1641123130966660*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 235
#220102 19:32:10 server id 100  end_log_pos 317 CRC32 0xf41a257f        Query   thread_id=25    exec_time=0     error_code=0
SET TIMESTAMP=1641123130/*!*/;
SET @@session.pseudo_thread_id=25/*!*/;
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 317
#220102 19:32:10 server id 100  end_log_pos 434 CRC32 0x375ef53a        Query   thread_id=25    exec_time=0     error_code=0
use `test`/*!*/;
SET TIMESTAMP=1641123130/*!*/;
insert into table_1 values (2, '张三')
/*!*/;
# at 434
#220102 19:32:10 server id 100  end_log_pos 465 CRC32 0xcffe53e0        Xid = 175
COMMIT/*!*/;
# at 465
#220102 19:32:59 server id 100  end_log_pos 544 CRC32 0xd12df013        Anonymous_GTID  last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1641123179339229    immediate_commit_timestamp=1641123179339229     transaction_length=317
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1641123179339229 (2022-01-02 19:32:59.339229 CST)
# immediate_commit_timestamp=1641123179339229 (2022-01-02 19:32:59.339229 CST)
/*!80001 SET @@session.original_commit_timestamp=1641123179339229*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 544
#220102 19:32:59 server id 100  end_log_pos 628 CRC32 0x06cd606a        Query   thread_id=26    exec_time=0     error_code=0
SET TIMESTAMP=1641123179/*!*/;
BEGIN
/*!*/;
# at 628
#220102 19:32:59 server id 100  end_log_pos 689 CRC32 0xd823f6d4        Table_map: `test`.`table_1` mapped to number 164
# at 689
#220102 19:32:59 server id 100  end_log_pos 751 CRC32 0x00f5fa0a        Update_rows: table id 164 flags: STMT_END_F

BINLOG '
a43RYRNkAAAAPQAAALECAAAAAKQAAAAAAAEABHRlc3QAB3RhYmxlXzEAAgMPAvwDAgEBAAID/P8A
1PYj2A==
a43RYR9kAAAAPgAAAO8CAAAAAKQAAAAAAAEAAgAC//8AAgAAAAYA5byg5LiJAAIAAAAGAOi1teS/
oQr69QA=
'/*!*/;
# at 751
#220102 19:32:59 server id 100  end_log_pos 782 CRC32 0x75c1558f        Xid = 185
COMMIT/*!*/;
# at 782
#220102 19:33:24 server id 100  end_log_pos 861 CRC32 0xa3f54f52        Anonymous_GTID  last_committed=2        sequence_number=3       rbr_only=no     original_committed_timestamp=1641123204180632    immediate_commit_timestamp=1641123204180632     transaction_length=334
# original_commit_timestamp=1641123204180632 (2022-01-02 19:33:24.180632 CST)
# immediate_commit_timestamp=1641123204180632 (2022-01-02 19:33:24.180632 CST)
/*!80001 SET @@session.original_commit_timestamp=1641123204180632*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 861
#220102 19:33:24 server id 100  end_log_pos 952 CRC32 0x72a8370a        Query   thread_id=27    exec_time=0     error_code=0
SET TIMESTAMP=1641123204/*!*/;
BEGIN
/*!*/;
# at 952
#220102 19:33:24 server id 100  end_log_pos 1085 CRC32 0xe89627c1       Query   thread_id=27    exec_time=0     error_code=0
SET TIMESTAMP=1641123204/*!*/;
update table_1 set name = '韩信' where id = 2
/*!*/;
# at 1085
#220102 19:33:24 server id 100  end_log_pos 1116 CRC32 0xafc6ecf9       Xid = 194
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*/;

# at 1540后面的数字表示二进制文件中事件的起始位置(文件偏移量)

第二行包含了语句在服务器上启用的时间戳,时间戳后面跟随了server idend_log_posthread_idexec_timeerror_code

  • server id 产生该事件的服务器的 server_id值(就在上面设置的那个server id)
  • end_log_pos 下一个事件的开始位置
  • exec_time 在住服务器上,它代表执行事件的事件;在从服务器上,它代表服务器的最终执行时间与主服务器的开始执行时间之间的差值,这个差值可以做为备份相对于主服务器滞后多少的指标
  • error_code 代表执行事件的结果;0表示没有错误发生