您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。
❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
binlog主要用于记录MySQL中的数据库操作,它包括DDL和DML语句(除了查询语句)。它以事件的形式记录,它是一个二进制文件。MySQL的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:
binlog日志主要包括两类文件:二进制索引文件(文件名后缀为.index)用于记录所有二进制文件,二进制日志文件(文件名后缀为.0000*),记录数据库中所有的DDL和DML语句。
binlog有三种模式
format | 定义 | 优点 | 缺点 |
---|---|---|---|
statement | 记录的是修改SQL语句 | 日志文件小,节约IO,提高性能 | 准确性差,对一些系统函数不能准确复制或不能复制,如now0.uuid0等 |
row | 记录的是每行实际数据变化 | 准确性强,能准确复制数据的变更 | 日志文件大,较大的网络10和磁盘lO |
mixed | statement和row模式的混合 | 准确性强,文件大小适中 | 有可能发生主从不一致问题 |
业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。mysql默认的也是row模式。
binlog日志文件是二进制文件,不能直接查看。可以通过下面的命令进行查看
mysqlbinlog mysql-bin.00001
如果是row模式的话
mysqlbinlog -vv mysql-bin.00001
mysql> show master status; #查看当前正在写入的binlog文件
如果没有开启的话则可以通过修改 my.ini (windows环境下)或者/etc/my.cnf 配置文件的 log-bin选项。
在配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)
[mysqld] log-bin=my-binlog-name
mysqlbinlog 是一个查看mysql二进制日志的工具,可以把mysql上面的所有操作记录从日志里导出,默认的安装路径是 :/usr/local/mysql/bin/mysqlbinlog
可以通过 find / -name "mysqlbinlog" 或者 which mysqlbinlog 命令来查找mysqlbinlog 工具的路径。
如果输入 mysqlbinlog 命令提示找不到命令的话,则可以通过建立软链的方式。比如我的mysqlbinlog命令在 /data/server/mysql/bin/mysqldump 路径下,可以通过如下命令建立软链解决此问题
ln -s /data/server/mysql/bin/mysqldump /usr/bin/mysqldump
如下是使用mysqlbinlog 命令的基本示例
# mysqlbinlog 的执行格式 mysqlbinlog [options] log_file ... # 查看bin-log二进制文件(shell方式) mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 # 查看bin-log二进制文件(带查询条件) mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \ --start-datetime="2023-09-11 00:00:00" \ --stop-datetime="2023-09-12 00:00:00" \ --start-position="5000" \ --stop-position="20000"
这里设置了日志查询的开始时间(2023-09-11 00:00:00),结束时间(2023-09-12 00:00:00),开始位置(5000)以及结束位置(20000)。
更多的mysqlbinlog命令的操作参数可以通过 mysqlbinlog --help进行查看。
mysqlbinlog 日志的部分内容
#230910 15:38:30 server id 1 end_log_pos 328 CRC32 0x3bb60240 Query thread_id=63 exec_time=0 error_code=0 BEGIN /*!*/; # at 328 # at 575 #230910 15:38:30 server id 1 end_log_pos 658 CRC32 0x20b2fcd1 Table_map: `db1`.`table1` mapped to number 197 # has_generated_invisible_primary_key=0 # at 658 #230910 15:38:30 server id 1 end_log_pos 771 CRC32 0xa0d5cf45 Write_rows: table id 197 flags: STMT_END_F ### INSERT INTO `db1`.`table1` ### SET ### @1=1 ### @2=2190000159000076193 ### @3=585 ### @4=3 ### @5=4 ### @6=2 ### @7=NULL ### @8='2020-06-05 17:04:51' ### @9='2023-09-10 15:38:30' ### @10='1268831135392108546' ### @11=0 # at 771 #230910 15:38:30 server id 1 end_log_pos 802 CRC32 0xecd87f75 Xid = 90733 COMMIT/*!*/;
上面的输出包括信息
position: 位于文件中的位置,即第一行的(# at 230910),说明该事件记录从文件第230910 个字节开始 timestamp: 事件发生的时间戳,即第二行的(#190308 15:38:30) server id: 服务器标识(1) end_log_pos 表示下一个事件开始的位置(即当前事件的结束位置+1) thread_id: 执行该事件的线程id (thread_id=63) exec_time: 事件执行的花费时间 error_code: 错误码,0意味着没有发生错误 type:事件类型Query
增加 --base64-output=decode-rows –v 选项解析
(base64-output,可以控制输出语句输出base64编码的BINLOG语句;decode-rows:选项将把基于行的事件解码成一个SQL语句)
mysqlbinlog --no-defaults --database=db1 --base64-output=decode-rows -v mysql-bin.000269>/data/server/binlog.sql
通过这个命令可以将mysql-bin.000269二进制文件的内容写到binlog.sql文件中。
删除binlog 可以通过 reset master 命令来实现。