快速回滚mysql数据
使用binlog快速回滚mysql数据
在日常使用mysql时,特殊是在开发环境,经常会有一些憨憨操作,手动去操作数据库,或者又删表导入等操作,除了运维备份mysql,也可以记录binlog的的一些信息,比如在手动操作前记录一下时间点和position,操作结束之后也分别记录一下,这样对于数据会更安全,在开发环境时也可以一波骚操作把数据库搞坏又快速回滚。
模拟操作
在各种蜜汁操作前,特殊是没有把握的操作,例如各种批量操作,结构更新,和手动执行一些sql时,如果操作失误比如没有加where等。会直接污染数据库
在操作前强烈建议备份或记录binlog,备份往往是全量的大文本数据,无论是导出还是导入都会导致速度比较慢很麻烦,而通过binlog可以快速回滚到指定状态。
记录时间点和position
开始记录
在执行sql脚本之前,记录当前的timepoint和position:
SET @start_time = NOW();
SELECT MASTER_POS_WAIT(NULL, 10);
结束记录
在执行sql脚本之后,记录结束的timepoint和position:
SET @end_time = NOW();
SELECT MASTER_POS_WAIT(NULL, 10);
回滚操作
如果出了错误或污染了数据,可以通过binlog回滚到数据刚被导入的状态。假设你已经记录了开始和结束的position。
mysqlbinlog --start-position=3775337 --skip-gtids --stop-position=6796448 mysql-bin.000013 | mysql -u root -p
通过这种方式,可以快速回滚到指定状态,避免数据污染。