一、登陆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表示执行事件的结果。零表示没有发生错误。