Mysql 完全恢复、基于时间点恢复、基于位置恢复
(注意根据实际环境调整)
1.刷新binlog (取得最后1份有价值的2进制日志),或执行一次增量备份的脚本。
#mysqladmin -u**** -p**** flush-logs
 


2.全备当前要操作的数据库,防止2次破坏。(如 lsws)
# mysqldump lsws > lsws.sql


 
3.恢复时间最近的全备数据。(db121019为最近的全备数据库)
#mysql lsws < db121019 


 
4.恢复从db121019数据库后所有的binlog,到出问题的日志为止(这里假设1-20为正常,21为错误的日志。)
#ls -t -r -l /data/dbbak/daily/mysql-bin.* | xargs mysqlbinlog | mysql    
(此操作ls -t -r -l /data/dbbak/daily/mysql-bin.* ,确保显示的日志顺序是按正常排序。如果顺序不对则用下一条命令,或者手动按顺序依次恢复,注意不要包含了错的日志)
#mysqlbinlog mysql-bin.000001  (省略mysql-bin.00002-19 ......)  mysql-bin.000020 | mysql


 
5.恢复有错误的binlog,为不完全恢复(假设为mysql-bin.000021)
⑴基于时间点的恢复。(首先找到出错的时间,如:2012-10-19 17:25:44 45 46 秒的操作都是错误的,然后跳过故障时间点,进行恢复。)
#mysqlbinlog --stop-date="2012-10-19 17:25:44" mysql-bin.000021 | mysql
#mysqlbinlog --start-date="2012-10-19 17:25:47" mysql-bin.000021 | mysql


 
⑵基于位置的恢复。(首先找到出错的位置,然后跳过故障位置点,进行恢复。)
我们发现故障前后的位置号是分别是413到517。就是end_log_pos后边显示的。 
#mysqlbinlog --stop-position="413" mysql-bin-3306.000021 | mysql
#mysqlbinlog --start-position="517" mysql-bin-3306.000021 | mysql


 
假如有报错 ERROR 1062 (23000) at line 32: Duplicate entry '27' for key 'PRIMARY'
找到正确操作的那条语句,找准原先操作语句的位置点end_log_pos,再执行一次就行了。
 
比如正确操作的位置点为"175"到"398"
下面这条语句,就实现了恢复
mysqlbinlog --start-position="175" --stop-position="398" mysql-bin-3306.000021 | mysql -uroot -proot


https://blog.51cto.com/361031315/1034709