使用mysqlbinlog备份恢复二进制文件
目录
我们知道 mysqlbinlog的功能
- 可以让MySQL的二进制文件以文本格式显示输出,让文件易读。
- mysqlbinlog还可以结合管道符,让mysqlbinlog的输出作为mysql的输入,在恢复二进制日志时可以用到。
- 另外,mysqlbinlog可以用来备份二进制文件。
1 mysqlbinlog的备份功能
mysqlbinlog可以读取二进制日志文件并将读取到的内容完全一致以二进制格式写入到新文件。利用此功能可以轻松备份原始格式的二进制日志。
mysqlbinlog可以进行静态备份,备份一组日志文件,并在到达最后一个文件的末尾时停止。
mysqlbinlog还可以进行连续(实时 )备份,在到达最后一个日志文件末尾时保持与服务器的连接,并在生成新事件时继续进行复制。在连续备份操作中, mysqlbinlog运行直到连接结束(例如,服务器退出时)或 mysqlbinlog被强制终止。连接结束后,不同于从服务器,mysqlbinlog不会等待并重试连接。要在重启服务器后继续实时备份,还必须重启mysqlbinlog。
2 mysqlbinlog的备份选项参数
- -R, --read-from-remote-server Read binary logs from a MySQL server. 使用该该选项后可以连接到MySQL服务,然后从该服务器上获取二进制日志,就像主从复制中salve连接到master获取二进制日志。利用此选项可以实现binlog远程(异地)备份,或者多个MySQL实例的binlog集中备份,搭建binlog server。使用该选项一般需要配合连接数据库的其他选项。
- -h, --host=name 主机名或者ip
- -u, --user=name 用户名
- -p, --password[=name] 密码
- -S, --socket=name socket文件
- -P, --port=# 端口
- --raw Requires -R. Output raw binlog data instead of SQL statements, output is to log files. 需要配合-R使用,以二进制格式写日志而不是文本格式(SQL 语句)。
- --stop-never 到达最后一个日志文件的末尾后,继续保持与服务器的连接并读取新事件
- -r, --result-file=name 输出文件名的前缀
- --stop-never-slave-server-id=# 不能和--connection-server-id=# 一起使用 ,在未来版本中将被弃用 ,使用--connection-server-id=#替代。
- --connection-server-id=# 不能和--stop-never-slave-server-id=#一起使用。有默认值 65535,它可以用来避免与从服务器或另一个mysqlbinlog进程的ID发生冲突 。备份的时候使用这个 ,连接到MySQL时标识自身。
- --server-id=# 仅显示具有该server_id的MySQL创建的事件。这个选项应该是在查看binlog的内容时使用,不是该server_id的MySQL创建的事件是不会显示出来。在备份的时候也可以使用(无影响),即使你指定的server_id和你想要备份的MySQL的server_id不同,但是还是会备份所有的内容。
- 看官方文档中这三个server-id,强迫症想要搞明白o(╥﹏╥)o
3 mysqlbinlog的静态备份
使用命令show binary logs;查看当前需要备份的MySQL服务上有哪些二进制日志
备份文件 mysql-bin.000020 mysql-bin.000021 mysql-bin.000022,
mysqlbinlog -R -h10.238.162.31 -uroot -proot --raw mysql-bin.000020 mysql-bin.000021 mysql-bin.000022
mysqlbinlog -R -h10.238.162.31 -uroot -proot --raw --to-last-log mysql-bin.000020
4 mysqlbinlog的实时备份
备份 mysql-bin.000020 文件之后新产生的所有文件,可以后台执行
nohup mysqlbinlog -R -h10.238.162.31 -uroot -proot --raw --stop-never mysql-bin.000020 &
当执行完此命令后,31上的mysql会多一个线程一直存在获取实时的binlog
在31服务器上执行刷新日志的命令会生产新的binlog,
mysql> flush logs;
在备份binlog的服务器33上,新产生的mysql-bin.000023的也备份了 如下图
5 重命名备份日志文件
nohup mysqlbinlog -R -h10.238.162.31 -uroot -proot --raw --stop-never --result-file=/data/backup/binlog_bk/10.238.162.31- mysql-bin.000020 &
加上选项和参数后 --result-file=/data/backup/binlog_bk/10.238.162.31-
可以指定路径和文件前缀,比如我想在备份的二进制文件前加上备份服务器的IP。生成的备份文件如下。
6 恢复
有个小技巧 可以使用正则匹配多个binlog
shell> mysqlbinlog binlog.[0-9]* | mysql -u root -p