MySQL的binlog日志的简介与查看
作者:mmseoamin日期:2023-12-11

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。

💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通

😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。

❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶

❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战

❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

文章目录

      • 1、binlog日志是什么
      • 2、binlog日志如何查看
          • 2.1. 查看binlog日志是否开启
          • 2.2. 通过mysqlbinlog命令查看binlog日志
          • 删除binlog

            1、binlog日志是什么

            binlog主要用于记录MySQL中的数据库操作,它包括DDL和DML语句(除了查询语句)。它以事件的形式记录,它是一个二进制文件。MySQL的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:

            1. MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致性的目的。
            2. 数据恢复,通过使用 mysqlbinlog 工具来恢复数据。

            binlog日志主要包括两类文件:二进制索引文件(文件名后缀为.index)用于记录所有二进制文件,二进制日志文件(文件名后缀为.0000*),记录数据库中所有的DDL和DML语句。

            2、binlog日志如何查看

            binlog有三种模式

            format定义优点缺点
            statement记录的是修改SQL语句日志文件小,节约IO,提高性能准确性差,对一些系统函数不能准确复制或不能复制,如now0.uuid0等
            row记录的是每行实际数据变化准确性强,能准确复制数据的变更日志文件大,较大的网络10和磁盘lO
            mixedstatement和row模式的混合准确性强,文件大小适中有可能发生主从不一致问题

            业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。mysql默认的也是row模式。

            binlog日志文件是二进制文件,不能直接查看。可以通过下面的命令进行查看

            mysqlbinlog mysql-bin.00001
            

            如果是row模式的话

            mysqlbinlog -vv mysql-bin.00001
            
            2.1. 查看binlog日志是否开启

            MySQL的binlog日志的简介与查看,在这里插入图片描述,第1张

            mysql> show master status; #查看当前正在写入的binlog文件
            

            如果没有开启的话则可以通过修改 my.ini (windows环境下)或者/etc/my.cnf 配置文件的 log-bin选项。

            在配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)

            [mysqld]
            log-bin=my-binlog-name
            
            2.2. 通过mysqlbinlog命令查看binlog日志

            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进行查看。

            MySQL的binlog日志的简介与查看,在这里插入图片描述,第2张

            MySQL的binlog日志的简介与查看,在这里插入图片描述,第3张

            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

            删除binlog 可以通过 reset master 命令来实现。