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;
下一篇:
如何应对高并发问题?