docker mysql通过bin-log位置/时间恢复数据

先清空bin-log,生产环境就不要执行reset master;因为会清空所有bin-log日志内容。

确保开启了bin-log日志 /etc/my.cnf

#服务器ID必须唯一
server-id=1
#log-bin的名称默认存放在/var/lib/mysql目录下(可选)
log-bin=mysql-bin
#日志格式:MIXED、STATEMENT、ROW(可选)
binlog_format=MIXED
#设置一个 binlog 文件的最大字节(如100MB)
max_binlog_size=104857600
#日志保存天数(可选)
expire_logs_days=30

先清空日志(生产环境不要reset master;这样做!)

mysql -uroot -p
mysql> reset master;
mysql> show variables like %log_bin%;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

然后创建数据库,写入数据,可以用工具,也可以用sql,我就用工具了。

创建了一个demo库和一张quality_testing表,以及一行数据。

删除数据库,通过bin-log恢复数据

mysql> SHOW BINLOG EVENTS IN mysql-bin.000001;

因此得出:我们只要8078结束即可恢复已经被删除的数据。

mysql> exit
#退出容器里的数据库,回到容器,执行恢复数据语句。如果不填start-position则恢复binlog从头到stop-position的数据
root@8c33acc9c8cc:/# /usr/bin/mysqlbinlog --no-defaults --stop-position=8078 --database=demo  /var/lib/mysql/mysql-bin.000001 | /usr/bin/mysql -uroot -p123456
#执行完,数据已经恢复了。重新进入容器里的mysql
root@8c33acc9c8cc:/# mysql -uroot -p123456
mysql> SHOW BINLOG EVENTS IN mysql-bin.000001;

如果想按时间恢复,不填start-datetime="2022-10-20 00:00:00"则从binlog日志开头恢复到结束时间为止。

mysqlbinlog -v --start-datetime="2022-10-20 00:00:00" --stop-datetime="2022-10-20 16:50:00" mysql-bin.000001 | /usr/bin/mysql -uroot -p123456

其它相关命令

#重置日志
reset master;
#查看是否开启日志
show variables like %log_bin%;
#查看日志列表
SHOW MASTER LOGS;
#查看当前binlog以及当前位置
SHOW MASTER STATUS;
#查看binlog内容
##从哪个位置开始
show binlog events in mysql-bin.000001 FROM 396;
##获取多少行
SHOW BINLOG EVENTS IN mysql-bin.000001 limit 10,5;
#开启新日志binlog,即:新增文件mysql-bin.000002,并使用新文件进行记录日志
FLUSH LOGS;
经验分享 程序员 微信小程序 职场和发展