binlog server还是不可靠吗?

1 | 背  景

MySQL包含许多种日志,其中包括:redo log、undo log、error log、binlog等等,其中binlog是区别其他关系型数据库所独有的,也是MySQL中最重要的日志之一,其作用是用于主备复制、闪回、基于时间点恢复等等;本文基于公司产品需求,对比研究5.7版本下binlog server备份binlog的功能,以及该工具的优缺点。

2 | 测试环境

  • 操作系统:CentOS 7.4

  • MySQL版本:5.7.27/5.7.18

  • 数据库关键配置参数:log-bin=1;binlog_format=ROW;binlog_row_image=FULL

  • MySQL server:10.10.30.243(qfusion1)

  • binlog server:10.10.30.246(qfusion3)

3 | binlog server原理

3.1 请求方式

  • 显式指定一组binlog文件:对于每个文件,mysqlbinlog连接并发出binlog dump命令。server发送文件完成后断开连接(因为mysqlbinlog指定server ID为0)。每个文件有一个连接(one connection per file)。

  • 指定开始binlog文件和--to-last-log:mysqlbinlog连接并为所有binlog文件发出binlog dump命令。server发送所有文件完成后断开连接(因为mysqlbinlog指定server id为0)。

  • 指定开始binlog文件和--stop-never:mysqlbinlog连接并为所有binlog文件发出binlog dump命令。server发送所有文件,但在发送最后一个文件后不会断开连接(mysqlbinlog指定了非零server ID)。

注意:

  • MySQL从库如果省略server-id(默认值0)或设置为0,则slave拒绝连接到master(ERROR] Server id not set, will not start slave for channel '')

3.2 工作形态

  • 未开启binlog server进程的MySQL主库

root@localhost : (none) 03:17:44> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
| 20 | root | localhost | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
  • binlog server节点开启备份进程

[root@qfusion3 backup]# mysqlbinlog -R --raw -upowdba -h10.10.30.243 -pxxx --stop-never mysql-bin.000001 --result-file=/data/backup/ &
[1] 4323
  • 开启binlog server进程MySQL主库

root@localhost : (none) 03:17:45> show processlist;
+----+------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host               | db   | Command     | Time | State                                                         
| Info             |
+----+------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| 20 | root | localhost          | NULL | Query       |    0 | starting                                                      
| show processlist |
| 21 | root | 10.10.30.150:39154 | NULL | Binlog Dump |    3 | Master has sent all binlog to slave; waiting for more updates | NULL             |
+----+------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
  • 可以看到binlog server的工作方式是模拟MySQL的主从,主库上会有Binlog Dump线程用于推送binlog到binlog server节点,binlog server节点类似于io thread接收binlog,并存放在本地。

4 | binlog server重要参数

--raw:

  • 默认情况下不使用--raw选项,mysqlbinlog读取的binlog文件解析为文本格式输出(直接打印在标准输出中,可以使用输出重定向到文件中,也可以使用--result-file选项指定输出文件)。

  • 使用--raw选项时,mysqlbinlog仍然以读取binlog时的原始二进制格式输出。该选项需要结合--read-from-remote-server选项使用,因为mysqlbinlog使用--raw选项输出原始格式的文件来源是从远程server中读取的,因为mysqlbinlog server一直和主库保持连接(使用--stop-never选项之后,在读取主库最后一个binlog之后仍然保持着与主库的连接不断开)。默认情况下,binlog server的输出文件名称与读取的原始日志文件相同,而且会存放在当前路径下,但输出文件名前缀可以使用--result-file选项修改。

  • 注意:

1、如果中途读取发生错误,mysqlbinlog进程会被终止。

2、如果中途读取异常终止,重新启动mysqlbinlog进程会重新获取binlog信息(直接覆盖文件);不会自动检测是否文件中已经存在event。

3、指定的binlog起始文件mysql-bin.000001会使用这个文件名到master的binlog目录下的mysql-bin.index文件中查找,如果没有找到就报错终止,找到了就依次往后读取index文件中的binlog。

--read-from-remote-server, -R:

  • 远程读取其他mysql server的binlog日志,而不是读取本地日志文件。对于选项--host,--password,--port,--protocol,--socket和--user,除非给出了--read-from-remote-server选项结合使用,否则单独指定这些TCP/IP连接选项将被忽略不生效。

  • 使用该选项时,mysqlbinlog会伪装成一个slave,类似于主从复制时io thread读取master的binlog。主库获取接收到这个请求之后就创建一个binlog dump线程推送binlog给binlog server节点。

  • 注意:

仅使用--read-from-remote-server时,mysqlbinlog使用server id为0连接,该server id告知mysqlbinlog进程在接收最后请求的日志文件后断开连接。

联合使用--read-from-remote-server和--stop-never时,mysqlbinlog使用非零server id连接,因此mysqlbinlog进程在接收最后一个日志文件后不会断开连接。默认情况下, server id为65535,但可以使用--stop-never-slave-server-id参数更改。

--result-file=name, -r name:

  • 此选项指定mysqlbinlog解析的文本存放的位置。

  • 当使用--raw选项,不使用--result-file时,mysqlbinlog会使用从远程mysql server传输的原始binlog格式写入本地文件中,默认情况下输出文件与原始日志文件使用相同的文件名称。

  • 如果与--raw选项一并使用时,--result-file选项值会修改输出文件名的前缀,如:原本是mysql-bin.000001,使用--result-file=binlog,则输出文件名为binlogmysql-bin.000001

--stop-never:

  • 此选项需要与--read-from-remote-server一起使用时才有效,它告诉mysqlbinlog保持与server的连接。如果不使用该选项,传输完成server中最后一个日志文件时,mysqlbinlog命令将退出,使用--stop-never选项时传输完成server的最后一个日志文件仍然保持与server的连接。

  • --stop-never通常与--raw选项一起使用,进行实时的二进制格式的日志备份,当不与--raw选项一起使用时,远程传输的binlog文件不会以二进制格式写入本地,而是直接解析为日志事件输出。

--stop-never-slave-server-id=id

  • 默认65535。使用此选项需要REPLICATION SLAVE权限

  • 如果同一个master有多个remote binlog server,需要给binlog server指定 server-id,那么使用参数--stop-never-slave-server-id显式指定连接master的server id值,可以用于避免与其他slave的server id冲突。

--to-last-log:

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值