生產環境中會出現誤刪數據,使用增備又無法恢復到指定位置。可以通過全備+binlog server方式將數據庫恢復至指定位置。
環境描述:
1.將3316實例全備,apply好的數據拷貝到數據庫:
[root@bogon backup]# ll 總用量 2586672 -rw-r-----. 1 root root 387 7月 26 17:27 backup-my.cnf drwx------. 2 root root 4096 7月 26 17:27 employees -rw-r-----. 1 root root 1073741824 7月 26 17:30 ibdata1 -rw-r--r--. 1 root root 524288000 7月 26 17:30 ib_logfile0 -rw-r--r--. 1 root root 524288000 7月 26 17:29 ib_logfile1 -rw-r--r--. 1 root root 524288000 7月 26 17:30 ib_logfile2 drwx------. 2 root root 4096 7月 26 17:27 mysql drwx------. 2 root root 4096 7月 26 17:27 performance_schema -rw-r-----. 1 root root 21 7月 26 17:27 xtrabackup_binlog_info -rw-r--r--. 1 root root 26 7月 26 17:29 xtrabackup_binlog_pos_innodb -rw-r-----. 1 root root 117 7月 26 17:29 xtrabackup_checkpoints -rw-r-----. 1 root root 502 7月 26 17:27 xtrabackup_info -rw-r-----. 1 root root 2097152 7月 26 17:29 xtrabackup_logfile drwx------. 2 root root 4096 7月 26 17:27 zhangshuo [root@bogon backup]# mv * /data/mysql/mysql3318/data/
2.啟動3318實例並查看zhangshuo庫:
[root@bogon backup]# /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my3318.cnf &
root@localhost:mysql3318.sock 17:55:40 [(none)]>use zhangshuo; Database changed root@localhost:mysql3318.sock 17:55:44 [zhangshuo]>select * from zs; Empty set (0.03 sec)
3.將3316實例binlog文件拷貝到新實例3318並查找到誤刪數據的起始位置:
[root@bogon backup]# cp -p /data/mysql/mysql3316/logs/mysql-bin.* /binlog/ [root@bogon data]# /usr/local/mysql/bin/mysqlbinlog -v --base64-output=decode-rows /binlog/mysql-bin.000014 BEGIN /*!*/; # at 197 #160726 17:54:45 server id 1283316 end_log_pos 250 CRC32 0xc6b65dcb Table_map: `zhangshuo`.`zs` mapped to number 70 # at 250 #160726 17:54:45 server id 1283316 end_log_pos 301 CRC32 0xf809a3da Write_rows: table id 70 flags: STMT_END_F ### INSERT INTO `zhangshuo`.`zs` ### SET ### @1=1 ### @2='zhangshuo' # at 301 #160726 17:54:45 server id 1283316 end_log_pos 332 CRC32 0x7f925ebd Xid = 54 COMMIT/*!*/;
可以看到誤刪數據begin位置197和commit位置301.
4.在新實例3318 zhangshuo庫中將數據恢復:
[root@bogon data]# /usr/local/mysql/bin/mysqlbinlog --start-position=197 --stop-position=301 /binlog/mysql-bin.000014 |/usr/local/mysql/bin/mysql -S /tmp/mysql3318.sock zhangshuo
root@localhost:mysql3318.sock 18:12:39 [zhangshuo]>select * from zs; +------+-----------+ | id | name | +------+-----------+ | 1 | zhangshuo | +------+-----------+ 1 row in set (0.00 sec)
至此,數據恢復成功。
遠程備份binlog文件:
/usr/local/mysql/bin/mysqlbinlog --read-from-remote-server --host=192.168.1.113 --user=repl --password=repl --port=3316 --raw --stop-never mysql-bin.000001 --result-file=/binlog/master3316/
--read-from-remote-server #遠程備份mysql binlog的核心選項
--raw #使用該選項,mysqlbinlog將獲取的二進制日志原原本本的記錄到磁盤,若不是用會生成變換為文本形式的二進制文件
--stop-never #只要遠程服務器未關閉,或連接未斷開,將會持續不斷的復制遠程服務器的二進制日志
--result-file #指定備份目錄,也可以將選項設置為/backup/master-xxxx
