赞
踩
binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL
语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是不会记录SELECT和SHOW这类操作。
开启Binlog日志有以下两个最重要的使用场景:
主从复制
:在主库中开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。数据恢复
:通过mysqlbinlog工具来恢复数据。日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。
记录每一条修改数据的SQL语句(批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句事件), slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。简称SQL语句复制。
以上两种模式的混合使用,一般会使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择写入模式。
企业场景如何选择binlog的模式
- 跳过语句模式:默认情况下,MySQL复制使用的是语句模式(Statement mode),即主服务器上执行的SQL语句会被发送到从服务器执行。然而,对于某些存储过程,MySQL可能无法正确复制执行过程中的SQL语句,因为存储过程可能包含了诸如非确定性函数、临时表等语句,这些语句在从服务器上可能无法正确执行,从而导致复制的不一致性。
- 函数依赖:存储过程中可能会调用其他存储过程或自定义函数,而这些函数的结果可能会因为主服务器和从服务器上的数据不一致而产生不同的结果,导致数据不一致。
- 依赖外部数据:存储过程可能会依赖外部的数据或环境变量,而这些数据在主服务器和从服务器上可能不同,导致存储过程的执行结果不一致。
- 并发执行问题:如果多个客户端同时执行存储过程,可能会出现并发执行的问题,从而导致数据不一致。
Query event
、Row event
、Xid event
等。binlog文件的内容就是各种Log event的集合。binlog 的写入顺序: binlog cache (write)
-> OS cache
-> (fsync) disk.
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (0.00 sec)
注意: 不建议将这个参数设成 0,比较常见的是将其设置为 100~1000 中的某个数值。如果设置成0,主动重启丢失的数据不可控制。设置成1,效率低下,设置成N(N>1),则主机重启,造成最多N个事务的binlog日志丢失,但是性能高,丢失数据量可控。
特性 | redo log | binlog |
---|---|---|
引擎支持 | InnoDB 引擎特有 | MySQL 的 Server 层实现,所有引擎都可以使用 |
日志类型 | 物理日志 | 逻辑日志 |
记录内容 | 记录的是“在XXX数据页上做了XXX修改” | 记录的是原始逻辑,其记录是对应的 SQL 语句 |
日志写入方式 | 循环写 | 追加写 |
写入空间管理 | 需要 write pos 和 check point 搭配 | 写到一定大小会切换到下一个,并不会覆盖以前的日志 |
用途 | 作为服务器异常宕机后事务数据自动恢复使用 | 可以作为主从复制和数据恢复使用 |
CrashSafe能力 | 有 | 没有 |
CrashSafe指MySQL服务器宕机重启后,能够保证:
- 所有已经提交的事务的数据仍然存在。
- 所有没有提交的事务的数据自动回滚。
vim /etc/my.cnf
--增加下面几个参数
binlog-format=ROW
log-bin=mysqlbinlog
server-id=1
-- 重启mysql
systemctl restart mysqld
启动成功之后,我们可以登陆查看我们的配置是否起作用
mysql> show variables like '%log_bin%';
+---------------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysqlbinlog |
| log_bin_index | /var/lib/mysql/mysqlbinlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+----------------------------------+
mysql> show binary logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mysqlbinlog.000001 | 177 |
| mysqlbinlog.000002 | 177 |
| mysqlbinlog.000003 | 154 |
+--------------------+-----------+
show master status;
使用show binlog events命令查询到的每一行数据就是一个binlog管理事件
mysql> show binlog events;
+--------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+--------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysqlbinlog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.30-log, Binlog ver: 4 |
| mysqlbinlog.000001 | 123 | Previous_gtids | 1 | 154 | |
| mysqlbinlog.000001 | 154 | Stop | 1 | 177 | |
+--------------------+-----+----------------+-----------+-------------+-----------
参数说明
第一个事件位置并不是从0开始,而是从4。Mysql通过文件中的前4个字节,来判断这是不是一个binlog文件。这种方式很常见,很多格式文件,如pdf、doc、jpg等,都会通常前几个特定字符判断是否是合法文件。
mysql> show binlog events in 'mysqlbinlog.000001'\G; *************************** 1. row *************************** Log_name: mysqlbinlog.000001 Pos: 4 Event_type: Format_desc Server_id: 1 End_log_pos: 123 Info: Server ver: 5.7.30-log, Binlog ver: 4 *************************** 2. row *************************** Log_name: mysqlbinlog.000001 Pos: 123 Event_type: Previous_gtids Server_id: 1 End_log_pos: 154 Info: *************************** 3. row *************************** Log_name: mysqlbinlog.000001 Pos: 154 Event_type: Stop Server_id: 1 End_log_pos: 177 Info: 3 rows in set (0.00 sec)
[root@localhost mysql]# mysqlbinlog mysqlbinlog.000001 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #220125 6:40:35 server id 1 end_log_pos 123 CRC32 0x1e570724 Start: binlog v 4, server v 5.7.30-log created 220125 6:40:35 at startup ROLLBACK/*!*/; BINLOG ' 4wvwYQ8BAAAAdwAAAHsAAAAAAAQANS43LjMwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADjC/BhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA ASQHVx4= '/*!*/; # at 123 #220125 6:40:35 server id 1 end_log_pos 154 CRC32 0x43fa19f1 Previous-GTIDs # [empty] # at 154 #220125 6:41:17 server id 1 end_log_pos 177 CRC32 0x205de899 Stop 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*/;
输出指定position位置的binlog日志
mysqlbinlog --start-position='154' --stop-position='177'
输出指定position位置的binlog日志到指定文件中
mysqlbinlog --start-position='154' --stop-position='177' mysqlbinlog.000001 > test.log
输出指定position位置的binlog日志到压缩文件中
mysqlbinlog --start-position="指定开始位置" --stop-position="指定结束位置" binlog文件|gzip > 压缩文件名
输出指定开始时间的binlog日志
mysqlbinlog --start-datetime="yyyy-MM-dd HH:mm:ss" binlog文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。