注意:本案例適用于人為SQL語句造成的誤操作或者沒有主從復制等的熱備情況宕機時的修復
思路:
- 利用全備的sql文件中記錄的CHANGE MASTER語句记靡,binlog文件及其位置點信息蛙酪,找出binlog文件中增量的那部分
- 用mysqlbinlog 命令將上述的binlog 文件導出為sql文件,并剔除其中的drop語句
- 通過全備文件和增量binlog文件的導出sql文件呵燕,就可以恢復到完整的數(shù)據(jù)
詳細模擬操作如下:
一. 創(chuàng)建數(shù)據(jù)庫,表扶认,插入模擬數(shù)據(jù)
開啟 binlog日志功能
/etc/my.cnf文件里的[mysqld]區(qū)塊添加:<code>log-bin=mysql-bin</code> 重啟服務
use test;
CREATE TABLE IF NOT EXISTS recover_table(
id mediumint unsigned NOT NULL AUTO_INCREMENT,
name varchar(32) NOT NULL,
age int unsigned NOT NULL,
PRIMARY KEY(id)
)ENGINE=innoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT 'recover_table';
insert into recover_table values(null, 'tom', 20);
insert into recover_table values(null, 'jack', 22);
insert into recover_table values(null, 'rose', 23);
insert into recover_table values(null, 'json', 23);
mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | tom | 20 |
| 2 | jack | 22 |
| 3 | rose | 23 |
| 4 | json | 22 |
+----+------+-----+
4 rows in set (0.00 sec)
二. 進行全文件備份
參數(shù)說明:
-B:指定數(shù)據(jù)庫
-F:刷新日志
-R:備份存儲過程等
-x:鎖表
--master-data:在備份語句里添加CHANGE MASTER語句以及binlog文件及位置點信息
test 為數(shù)據(jù)庫名
[root@iZ95i72m2pc9 backup]# mysqldump -uroot -p -B -F -R -x --master-data=2 test|gzip >/test/backup/test_$(date +%F).sql.gz
Enter password:
mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | tom | 20 |
| 2 | jack | 22 |
| 3 | rose | 23 |
| 4 | json | 22 |
+----+------+-----+
4 rows in set (0.00 sec)
三. 再插入模擬數(shù)據(jù), 刪除數(shù)據(jù)庫
insert into recover_table values(null, 'sam', 25);
insert into recover_table values(null, 'jare', 26);
mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | tom | 20 |
| 2 | jack | 22 |
| 3 | rose | 23 |
| 4 | json | 22 |
| 5 | sam | 25 |
| 6 | jare | 26 |
+----+------+-----+
6 rows in set (0.00 sec)
drop database test;
四. 查看全備之后新增的binlog文件
[root@iZ95i72m2pc9 backup]# ll
-rw-r--r-- 1 root root 936 Oct 17 10:40 test_2017-10-17.sql.gz
[root@iZ95i72m2pc9 backup]# gzip -d test_2017-10-17.sql.gz
[root@iZ95i72m2pc9 backup]# ll
-rw-r--r-- 1 root root 2397 Oct 17 10:40 test_2017-10-17.sql
[root@iZ95i72m2pc9 backup]# grep CHANGE test_2017-10-17.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=120;
說明:mysql-bin.000002的120行唇跨,在該文件之前的binlog文件中的數(shù)據(jù)都已經(jīng)包含在這個全備的sql文件中了(增量)
五. 查看并切換到mysql 數(shù)據(jù)存放目錄, 轉(zhuǎn)sql 格式
[root@iZ95i72m2pc9 backup]# ps -ef|grep mysql
root 4411 4376 0 10:13 pts/0 00:00:00 mysql -uroot -p
root 4458 4421 0 10:45 pts/1 00:00:00 grep mysql
root 13046 1 0 Apr12 ? 00:00:00 /bin/sh /alidata/server/mysql/bin/mysqld_safe --datadir=/alidata/server/mysql/data --pid-file=/alidata/server/mysql/data/iZ95i72m2pc9.pid
mysql 13347 13046 0 Apr12 ? 02:03:40 /alidata/server/mysql/bin/mysqld --basedir=/alidata/server/mysql --datadir=/alidata/server/mysql/data --plugin-dir=/alidata/server/mysql/lib/plugin --user=mysql --log-error=/alidata/log/mysql/error.log --pid-file=/alidata/server/mysql/data/iZ95i72m2pc9.pid --socket=/tmp/mysql.sock --port=3306
[root@iZ95i72m2pc9 backup]# cd /alidata/server/mysql/data
備份日志數(shù)據(jù)到指定目錄,避免數(shù)據(jù)混亂的問題
[root@iZ95i72m2pc9 mysql]# cp ./data/mysql-bin.000004 /opt/backup/
[root@iZ95i72m2pc9 backup]# cd /opt/backup/
[root@iZ95i72m2pc9 backup]# ll
-rw-r----- 1 root root 743 Oct 17 10:52 mysql-bin.000004
-rw-r--r-- 1 root root 2397 Oct 17 10:40 test_2017-10-17.sql
轉(zhuǎn)為sql 格式
[root@iZ95i72m2pc9 backup]# mysqlbinlog -d test mysql-bin.000004 >00004bin.sql
刪除里面的drop 語句(或誤操作的語句)
六. 開始恢復數(shù)據(jù),先恢復備份文件层坠,再恢復增加文件
[root@iZ95i72m2pc9 backup]# mysql -uroot -p < test_2017-10-17.sql
Enter password:
mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | tom | 20 |
| 2 | jack | 22 |
| 3 | rose | 23 |
| 4 | json | 22 |
+----+------+-----+
4 rows in set (0.00 sec)
[root@iZ95i72m2pc9 backup]# mysql -uroot -p < 00004bin.sql
Enter password:
mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | tom | 20 |
| 2 | jack | 22 |
| 3 | rose | 23 |
| 4 | json | 22 |
| 5 | sam | 25 |
| 6 | jare | 26 |
+----+------+-----+
6 rows in set (0.00 sec)
總結(jié):
- 恢復條件為mysql要開啟binlog日志功能殖妇,并且要全備和增量的所有數(shù)據(jù)
- 恢復時建議對外停止更新,即禁止更新數(shù)據(jù)庫
- 先恢復全量破花,然后把全備時刻點以后的增量日志谦趣,按順序恢復成SQL文件,然后把文件中有問題的SQL語句刪除(也可通過時間和位置點)座每,再恢復到數(shù)據(jù)庫