@Zjmainstay
2023-02-02T01:47:10.000000Z
字数 2788
阅读 1967
MySQL binlog 数据恢复
@author Zjmainstay
@website http://www.zjmainstay.cn
在my.cnf [mysqld]节点添加:
log-bin=mysql-binbinlog_format=mixed
show variables like '%log_bin%';
| Variable_name | Value |
|---|---|
| log_bin | ON |
show variables like '%datadir%';
| Variable_name | Value |
|---|---|
| datadir | /var/lib/mysql/ |
show binlog events in 'mysql_bin.000001'\G
mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000001|more可以指定参数:--start-position=0 --stop-position=xxx
请留意日志中额外添加的注释,如(作者注:开始的位置)
#161118 21:58:58 server id 1 end_log_pos 1974 CRC32 0x733660ed Query thread_id=7 exec_time=0 error_code=0SET TIMESTAMP=1479477538/*!*/;insert into `tb_abc` (`id`, `name`) values ('1', 'abc')/*!*/;# at 1974(作者注:开始的位置)# (作者注:需要恢复的内容Begin)#161118 21:58:06(开始的时间) server id 1 end_log_pos 2161 CRC32 0xcd3cd3d2 Query thread_id=7 exec_time=784 error_code=0SET TIMESTAMP=1479477486/*!*/;CREATE TABLE `binlog-find` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT) DEFAULT CHARACTER SET `utf8`/*!*/;# at 2161#161118 21:58:18 server id 1 end_log_pos 2307 CRC32 0x1e28b93d Query thread_id=7 exec_time=772 error_code=0SET TIMESTAMP=1479477498/*!*/;ALTER TABLE `binlog-find` ADD `name` INTNULLDEFAULT NULLAFTER `id`/*!*/;# at 2307#161118 21:58:23 server id 1 end_log_pos 2386 CRC32 0x34669ad7 Query thread_id=7 exec_time=767 error_code=0SET TIMESTAMP=1479477503/*!*/;BEGIN/*!*/;# at 2386#161118 21:58:23 server id 1 end_log_pos 2518 CRC32 0xf4f4adb4 Query thread_id=7 exec_time=767 error_code=0SET TIMESTAMP=1479477503/*!*/;INSERT INTO `binlog-find` (`id`, `name`) VALUES ('1', '2')/*!*/;# at 2518#161118 21:58:23 server id 1 end_log_pos 2549 CRC32 0x54679b22 Xid = 2426COMMIT/*!*/;# at 2549(作者注:结束的位置)# (作者注:需要恢复的内容End)#161118 21:58:27(作者注:结束的时间) server id 1 end_log_pos 2673 CRC32 0x35b852fa Query thread_id=7 exec_time=860 error_code=0SET TIMESTAMP=1479477507/*!*/;DROP TABLE `binlog-find` /* generated by server *//*!*/;# at 2673
##导入sql结果到sql文件sudo mysqlbinlog --no-defaults --start-position="1974" --stop-position="2549" /var/lib/mysql/mysql-bin.000001 >> res.sql##通过管道方式直接运行(基于位置)sudo mysqlbinlog --no-defaults --start-position="1974" --stop-position="2549" /var/lib/mysql/mysql-bin.000001 |mysql -uzjmainstay --binary-mode--start-position 为需要恢复开始语句上一条语句运行结束位置--stop-position 为需要恢复结束语句运行结束位置(删表上一条语句)或##通过管道方式直接运行(基于时间)sudo mysqlbinlog --no-defaults --start-datetime="2016-11-18 21:58:06" --stop-datetime="2016-11-18 21:58:27" /var/lib/mysql/mysql-bin.000001 |mysql -uzjmainstay --binary-mode--start-datetime 为需要恢复开始语句运行时间--stop-datetime 为需要恢复结束语句下一条语句运行时间(删表语句)
如果没有上一次备份,使用类似mysqlbinlog /var/lib/mysql/mysql-bin.000001 --start-position=0 --stop-position=9999999999999 | mysql -uroot -pxxxx 从第一个bin-log日志文件,逐步恢复到删表操作前的位置
--stop-position=9999999999999设置成接近无限大是为了无视文件的结束位置,方便操作