mysql读取binlog日志

103 阅读3分钟

一、登陆mysql

 mysql -uroot -p -P3306 -h127.0.0.1

相关解释:

binlog模式分三种(row,statement,mixed)

  • row

日志中会记录成每一行数据修改的形式,然后在slave端再对相同的数据进行修改。

1、记录详细

2、解决statement level模式无法解决的复制问题。

row level的缺点:日志量大,因为是按行来拆分。

  • statement

每一条修改数据的sql都会记录到master的bin_log中,slave在复制的时候sql进程会解析成master端执行过的相同的sql在slave库上再次执行。

1、解决了row level的缺点,不需要记录每一行的变化。

2、日志量少,节约IO,从库应用日志块。

Statement level缺点:一些新功能同步可能会有障碍,比如函数、触发器等。

  • mixed

新版本中的mysql中对row level模式也做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

二、查看binlog信息

  • 查看binlog是否开启,如果没有开启则在my.cnf中添加如下配置,并重启
//mysql的相关配置
# 开启 Binlog 并写明存放日志的位置
log_bin = /usr/local/mysql/log/bin-log
 
# 指定索引文件的位置
log_bin_index = /usr/local/mysql/log/mysql-bin.index
 
#删除超出这个变量保留期之前的全部日志被删除
expire_logs_days = 7
 
# 指定一个集群内的 MySQL 服务器 ID,如果做数据库集群那么必须全局唯一,一般来说不推荐 指定 server_id 等于 1。
server_id = 1
 
# 设置方面提到过的三种 Binlog 的日志模式
binlog_format = ROW
 
# 控制对哪些数据库进行收集,如果不配置,默认全部数据库都会进行日志收集
binlog_do_db = xxxDbName
mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
  • 查看binlog存储目录
mysql> show variables like 'log_%';
//log_bin_basename  为日志存储目录
+----------------------------------------+---------------------------------------------------+
| Variable_name                          | Value                                             |
+----------------------------------------+---------------------------------------------------+
| log_bin                                | ON                                                |
| log_bin_basename                       | /data/mysql/binlog/master-bin       |
| log_bin_index                          | /data/mysql/binlog/master-bin.index |
SHOW MASTER STATUS;
//文件名称,binlog的末尾位置
+-------------------+-----------+--------------+------------------+-------------------+
| File              | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+-----------+--------------+------------------+-------------------+
| master-bin.000026 | 957037682 |              |                  |                   |
+-------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • binlog文件位置
[root@localhost binlog]# cd /data/mysql/binlog/
[root@localhost binlog]# ll
total 3448800
-rw-r----- 1 linkdood linkdood 1073742730 Jul 11 20:18 master-bin.000020
-rw-r----- 1 linkdood linkdood  297821006 Jul 24 14:33 master-bin.000021
-rw-r----- 1 linkdood linkdood  119947833 Jul 17 10:15 master-bin.000022
-rw-r----- 1 linkdood linkdood        177 Jul 17 10:23 master-bin.000023
-rw-r----- 1 linkdood linkdood     622981 Jul 17 10:50 master-bin.000024
-rw-r----- 1 linkdood linkdood 1073789832 Jul 18 14:07 master-bin.000025
-rw-r----- 1 linkdood linkdood  957311865 Jul 25 14:12 master-bin.000026
-rw-r----- 1 linkdood linkdood        357 Jul 18 14:07 master-bin.index

三、解码binlog日志文件

使用mysql自带的mysqlbinlog解析文件

//解析IM_USER库,从2023-07-25 00:00:00开始的日志
/data/linkdood/im/soft/mysql/bin/mysqlbinlog --start-datetime='2023-07-25 00:00:00' -d IM_USER  master-bin.000026 > mysql.log

部分字段如下:

BEGIN
/*!*/;
# at 944973031
# at 944973193
#230725  0:00:00 server id 10  end_log_pos 944973281 CRC32 0x72a9e00b 	Query	thread_id=145521	exec_time=0	error_code=0
SET TIMESTAMP=1690214400/*!*/;
COMMIT

exec_time表示奔驰事务执行时长,单位为s

begin表示事务开始标记

commit表示事务提交标记

server id事件发起的服务器的值

end_log_pos表示下一个事件的开始位置(即当前事件的结束位置+1)

thread_id指示哪个线程执行了该事件

error_code表示执行事件的结果。零表示没有发生错误。