mysqlbinlog的问题求助

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysqlbinlog的问题求助相关的知识,希望对你有一定的参考价值。

1. 开启压缩功能后,通过 ZSTD 算法对每个事务进行压缩,写入二进制日志。

2. 新版本更改了 libbinlogevents,新增 Transaction_payload_event 作为压缩后的事务表示形式。

class Transaction_payload_event : public Binary_log_event protected:  const char *m_payload;  uint64_t m_payload_size;  transaction::compression::type m_compression_type;  uint64_t m_uncompressed_size;

3. 新增 Transaction_payload_event 编码器/解码器,用于实现对压缩事务的编码和解码。

    namespace binary_log

    namespace transaction

    namespace compression

    enum type

    /* No compression. */

    NONE = 0,

    /* ZSTD compression. */

    ZSTD = 1,

    ;

    4. 在 mysqlbinlog 中设计和实现每个事务的解压缩和解码,读取出来的日志与未经压缩的原日志相同,并打印输出所用的压缩算法,事务形式,压缩大小和未压缩大小,作为注释。

    #200505 16:24:24 server id 1166555110  end_log_pos 2123 CRC32 0x6add0216    Transaction_Payload     payload_size=863    compression_type=ZSTD   uncompressed_size=2184# Start of compressed events!


    5. 从库(或 MGR-member)在接收已压缩的 binlog 时识别 Transaction_payload_event,不进行二次压缩或解码。以原本的压缩状态写入中继日志;保持压缩状态。回放日志的解码和解压缩过程由 SQL 线程负责。

    总结日志压缩过程为:

    1)单位事务需要提交并记录 binlog。

    2)压缩编码器在缓存中通过 ZSTD 算法压缩以及编码该事务。

    3)将缓存中压缩好的事务写入日志中,落盘。

    日志读取过程为:

    客户端工具(mysqlbinlog、sql 线程)对压缩日志进行解压缩、解码。解压出原本未压缩的日志进行读取或回放。

    注意事项

    1. 压缩功能以事务为单位进行压缩,不支持非事务引擎。

    2. 仅支持对 ROW 模式的 binlog 进行压缩。

    3. 目前仅支持 ZSTD 压缩算法,但是,底层设计是开放式的,因此后续官方可能会根据需要添加其他压缩算法(例如 zlib 或 lz4)。

    4. 压缩动作是并行进行的,并且发生在 binlog 落盘之前的缓存步骤中。

    5. 压缩过程占用本机 CPU 及内存资源。在主从延迟的场景中,如果性能瓶颈时,网络带宽、压缩功能可以有效缓解主从延迟;但是如果性能瓶颈是本机自身处理能力,那么压缩功能反而可能加大主从延迟。

参考技术A 通过mysqlbinlog 导出来的日志文件,mysql如论如何都认不到

mysqlbinlog mysql-bin.000067 >xxx.sql
mysqlbinlog xxx.sql 这里就报错了
ERROR: File is not a binary log file

mysqlbinlog --start-position=433760210 --stop-position=433761222 mysql-bin.000067 >xx.sql
mysqlbinlog xx.sql 也是报一样错
ERROR: File is not a binary log file
这个?
先确定 /home/mysql/bin/mysqlbinlog 是你当前运行的mysqld对应的版本,另外,可能是该binlog已经损坏了本回答被提问者和网友采纳

如何读取mysql binlog 解析

mysqlbinlog 是将 binlog 解析成可读可执行的 SQL 的重要工具。

但解析体积较大的 binlog 时,如何查看 mysqlbinlog 的执行进度就变成了一个问题,mysqlbinlog 并未提供 –progress 这样的参数。

那要怎么查看 mysqlbinlog 的解析进度?

实验

我们在 实验 08 中介绍了如何生成随机数据。可以利用其中技巧,生成较大的 binlog,我们忽略这个过程。

从已有的 binlog 开始,bin.000002 大约有 1.1 个 G:

用 mysqlbinlog 解析该 binlog:

大概会执行 4.6 秒左右。大家仔细做实验时,可以将 binlog 放大一些,让执行实验更长一些。

我们在 mysqlbinlog 解析时,查看其文件句柄:

可以看到 mysqlbinlog 用句柄 3 读取 binlog。(我们暂时忽略句柄 4 指向的临时文件,其涉及到了行格式的解析过程,我们安排在以后的实验中慢慢介绍)

获取了 mysqlbinlog 处理文件句柄 3 的进度,就可以大概估算 mysqlbinlog 的整体进度:

可以看到 mysqlbinlog 此时的进度大概是 600M 左右,整体进度估算为 54%。

结论

我们无法让 mysqlbinlog 直接输出进度,于是通过观察 mysqlbinlog 对 binlog 的读取进度,估算mysqlbinlog 的整体处理进度。

参考技术A 你进入mysql /bin目录下你可以看到有一个mysqlbinlog可执行文件,只要 在命令下
~ mysqlbinlog binlog文件
就可以查看咯,一般做增量备份,查看数据操作或是恢复数据才看这个的吧本回答被提问者采纳

以上是关于mysqlbinlog的问题求助的主要内容,如果未能解决你的问题,请参考以下文章

如何读取mysql binlog 解析

Mysql之mysqlbinlog使用

mysqlbinlog(日志管理工具)

技术分享 mysqlbinlog 技巧

mysqlbinlog 抽取(读取) 二进制日志

mysqlbinlog 参数及用法说明