轉自:http://www.jquerycn.cn/a_14108
在mysql中,根據故障的時間點恢復相關數據的方法分享,有需要的朋友參考下。
問題描述:
搭建一個基於binlog的數據庫恢復的測試環境,mysqlbinlog工具可以指定恢復時間點和指定恢復位置,參數分別為
--start-date、--stop-date、start-position、
stop-position。
用於演示使用指定恢復時間點的方式。
准備工作:
1,測試庫新建一個測試庫yewu_test和delete_test的表
1 create table delete_test(uIn int, name varchar(30));
2,插入三條測試數據:
insert into delete_test values(1,'a'),(2,'b'),(3,'c');
3,創建一個全備份,備份完成時間2010-04-05 19:57:29
mysqldump -uroot --socket=/tmp/mysql_tmp.sock --single-transaction --master-data=2 --skip-opt --no-autocommit --create-options yewu_test > yewu_test.sql
4,在2013-04-05 20:01:14分刪除delete_test表
drop table delete_test;
5,在2013-04-05 20:04:47分創建一個新表並插入數據
create table after_time_table(uIn int, colname varchar(30)); insert into after_time_table values(1,'col1'),(2,'col2');
現在要求恢復誤刪的delete_test表的所有數據
實施恢復:
1,停止應用並做當前時間點的一個全備(如果恢復操作失敗,用於回檔)
2,關閉binlog后重啟mysqld
1)注釋/etc/my.cnf配置文件中的log_bin配置 2)mysqladmin --socket=/tmp/mysql_tmp.sock -uroot shutdown 3)mysqld_safe --defaults-file=/etc/my.cnf --socket=/tmp/mysql_tmp.sock &
3,進入mysql客戶端並刪除yewu_test庫
drop database yewu_test;
4,還原2013-04-05 19:57:29的全備
create database yewu_test; mysql --default-character-set=gbk -uroot yewu_test --socket=/tmp/mysql_tmp.sock < yewutest.sql
5,恢復截止到2013-04-05 20:01:13的數據(即恢復drop table delete_test前的所有數據)
mysqlbinlog -uroot --socket=/tmp/mysql_tmp.sock --stop-date='2010-04-05 20:01:13' binlog.000010 | mysql -uroot --socket=/tmp/mysql_tmp.sock
6,恢復從2013-04-05 20:01:15到當前的數據(即恢復drop table delete_test后的所有數據)
mysqlbinlog -uroot --socket=/tmp/mysql_tmp.sock --start-date='2010-04-05 20:01:15' binlog.000010 | mysql -uroot --socket=/tmp/mysql_tmp.sock
7,打開binlog並重啟mysqld
./bin/mysqld_safe --defaults-file=/etc/my.cnf --socket=/tmp/mysql_tmp.sock &
8,此時在yewu_test庫看到delete_test表的所有數據已經還原,另外,在drop table delete_test之后所有的數據庫操作(建表和插入數據到after_time_table),也同樣被恢復。
說明:上述基於時間的恢復,精確的時間是從binlog文件中找到該語句對應的具體時間點。