Mysql 通過全量備份和binlog恢復整體數據
某天工作時間,一個二貨犯暈登錯生產當測試環境了,直接drop了一個數據庫,需要緊急恢復!可利用備份的數據文件以及增量的 binlog 文件進行數據恢復。
具體思路歸納幾點:
1、恢復條件為 MySQL 要開啟 binlog 日誌功能,並且要全備和增量的所有數據。
2、恢復時建議對外停止更新,即禁止更新數據庫。(這點很重要)
3、先恢復全量,然後把全備時刻點以後的增量日誌,按順序恢復成 SQL 文件,
4、然後把文件中有問題的SQL語句刪除(也可通過時間和位置點),再恢復到數據庫。
具體實例演示:
1、首先要確保MySQL開啟了binlog日誌功能,檢查如下結果
mysql> show variables like ‘%log_bin%‘; +---------------------------------+-----------------------------+ | Variable_name | Value | +---------------------------------+-----------------------------+ | log_bin | ON | | log_bin_basename | /mysql_data/mysql-bin | | log_bin_index | /mysql_data/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+-----------------------------+ 6 rows in set (0.01 sec)
2、查看當前測試表裏面數據信息後面好做對比
mysql> select * from Student; +-----------+-----------+------+------+-------+ | Sno | Sname | Ssex | Sage | Sdept | +-----------+-----------+------+------+-------+ | 200215121 | 李勇 | 男 | 20 | CS | | 200215122 | 劉晨 | 女 | 19 | CS | | 200215123 | 王敏 | 女 | 18 | MA | | 200215125 | 張立 | 女 | 19 | IS | | 200215126 | 虎威 | 男 | 25 | CS | | 200215127 | 魏大師 | 男 | 35 | IS | | 200215128 | 老謝 | 男 | 33 | MA | | 200215129 | 小賈 | 男 | 30 | CS | | 200215130 | 會民 | 男 | 23 | CS | | 200215131 | 陳興 | 男 | 33 | MA | | 200215132 | 阿帆 | 男 | 36 | IS | | 200215133 | 國良 | 男 | 40 | IS | | 200215134 | 老宋 | 男 | 40 | IS | | 200215135 | 光光 | 男 | 35 | IS | | 200215136 | 王老板 | 女 | 27 | IS | +-----------+-----------+------+------+-------+ 15 rows in set (0.00 sec)
3、現在進行全備份
mysqldump -u root -p -B -F -R -x student|gzip > /mysql_backup/student_$(date +%Y%m%d_%H%M%S).sql.gz 參數說明: -B:指定數據庫 -F:刷新日誌 -R:備份存儲過程等 -x:鎖表
4、再次插入新數據
INSERT INTO Student VALUES (‘200215137‘,‘程程‘,‘女‘,30,‘IS‘); INSERT INTO Student VALUES (‘200215138‘,‘琪琪‘,‘男‘,29,‘MA‘); INSERT INTO Student VALUES (‘200215139‘,‘龍龍‘,‘男‘,27,‘IS‘);
5、檢查是否插入成功,如下可以看出已經插入成功
mysql> select * from Student; +-----------+-----------+------+------+-------+ | Sno | Sname | Ssex | Sage | Sdept | +-----------+-----------+------+------+-------+ | 200215121 | 李勇 | 男 | 20 | CS | | 200215122 | 劉晨 | 女 | 19 | CS | | 200215123 | 王敏 | 女 | 18 | MA | | 200215125 | 張立 | 女 | 19 | IS | | 200215126 | 虎威 | 男 | 25 | CS | | 200215127 | 魏大師 | 男 | 35 | IS | | 200215128 | 老謝 | 男 | 33 | MA | | 200215129 | 小賈 | 男 | 30 | CS | | 200215130 | 會民 | 男 | 23 | CS | | 200215131 | 陳興 | 男 | 33 | MA | | 200215132 | 阿帆 | 男 | 36 | IS | | 200215133 | 國良 | 男 | 40 | IS | | 200215134 | 老宋 | 男 | 40 | IS | | 200215135 | 光光 | 男 | 35 | IS | | 200215136 | 王老板 | 女 | 27 | IS | | 200215137 | 程程 | 女 | 30 | IS | | 200215138 | 琪琪 | 男 | 29 | MA | | 200215139 | 龍龍 | 男 | 27 | IS | +-----------+-----------+------+------+-------+ 18 rows in set (0.00 sec)
6.此時誤操作,刪除了student數據庫
mysql> drop database student; Query OK, 3 rows affected (0.11 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
7.查看全備之後備份文件
[[email protected] mysql_backup]# cd /mysql_backup [[email protected] mysql_backup]# gzip -d student_20170829_090319.sql.gz [[email protected] mysql_backup]# ls student_20170829_090319.sql [[email protected] mysql_backup]# vim student_20170829_090319.sql
8.檢查並移動binlog文件,並導出為 SQL 文件剔除其中的 drop 語句,查看 MySQL 的數據存放目錄,
由下面可知是在/mysql_data下,將 binlog 文件導出SQL文件,並vim編輯它刪除其中的 drop 語句。
/home/mysql/mysql5/bin/mysqlbinlog --no-defaults /tmp/mysql-bin.000004 > /tmp/04.sql
註意:在恢復全備數據之前必須將該 binlog文件移出,否則恢復過程中,會繼續寫入語句到 binlog,最終導致增量恢復數據部分變得比較混亂。
在轉換sql的時候可能會報錯,具體信息如下:
[[email protected] tmp]# /home/mysql/mysql5/bin/mysqlbinlog /tmp/mysql-bin.000004 > /tmp/04.sql
mysqlbinlog: [ERROR] unknown variable ‘default-character-set=utf8‘
原因是mysqlbinlog這個工具無法識別binlog中的配置中的default-character-set=utf8這個指令。
兩個方法可以解決這個問題
在MySQL的配置/etc/my.cnf中將default-character-set=utf8 修改為 character-set-server = utf8,但是這需要重啟MySQL服務,如果你的MySQL服務正在忙,那這樣的代價會比較大。
用mysqlbinlog --no-defaults mysql-bin.000004 命令打開
9、開始恢復全備數據
[[email protected] tmp]# mysql -u root -p < /mysql_backup/student_20170829_090319.sql Enter password:
查看數據看看,student在不在,可以看到已經在了
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | student | | sys | +--------------------+ 5 rows in set (0.00 sec)
11、開始恢復增量數據
使用04.sql文件恢復全備時刻到刪除數據庫之間新增的數據,編輯04bin.sql #刪除裏面的drop語句
[[email protected] tmp]# vim 04.sql
將drop 操作下面的內容刪除 drop database student /*!*/; SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/; DELIMITER ; /*!50003 SET [email protected]_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
不然會報如下錯誤:
ERROR 1790 (HY000) at line 96: @@SESSION.GTID_NEXT cannot be changed by a client that owns a GTID.
The client owns ANONYMOUS. Ownership is released on COMMIT or ROLLBACK.
我的binlog文件具體內容如下:
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #170829 9:03:22 server id 201609 end_log_pos 123 CRC32 0x669b3a18 Start: binlog v 4, server v 5.7.18-log created 170829 9:03:22 # Warning: this binlog is either in use or was not closed properly. BINLOG ‘ Wr2kWQ+JEwMAdwAAAHsAAAABAAQANS43LjE4LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA ARg6m2Y= ‘/*!*/; # at 123 #170829 9:03:22 server id 201609 end_log_pos 154 CRC32 0xf909764e Previous-GTIDs # [empty] # at 154 #170829 9:04:42 server id 201609 end_log_pos 219 CRC32 0x754f68f2 Anonymous_GTIDlast_committed=0sequence_number=1 SET @@SESSION.GTID_NEXT= ‘ANONYMOUS‘/*!*/; # at 219 #170829 9:04:42 server id 201609 end_log_pos 294 CRC32 0xdef39415 Querythread_id=7exec_time=0error_code=0 SET TIMESTAMP=1503968682/*!*/; SET @@session.pseudo_thread_id=7/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1344274432/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 294 #170829 9:04:42 server id 201609 end_log_pos 359 CRC32 0xad757652 Table_map: `student`.`Student` mapped to number 225 # at 359 #170829 9:04:42 server id 201609 end_log_pos 421 CRC32 0x5da9edf3 Write_rows: table id 225 flags: STMT_END_F BINLOG ‘ qr2kWROJEwMAQQAAAGcBAAAAAOEAAAAAAAEAB3N0dWRlbnQAB1N0dWRlbnQABf7+/gL+CP4h/jz+ Bv48HlJ2da0= qr2kWR6JEwMAPgAAAKUBAAAAAOEAAAAAAAEAAgAF/+AJMjAwMjE1MTM3Bueoi+eoiwPlpbMeAAJJ U/PtqV0= ‘/*!*/; # at 421 #170829 9:04:42 server id 201609 end_log_pos 452 CRC32 0xfcd87186 Xid = 168 COMMIT/*!*/; # at 452 #170829 9:04:42 server id 201609 end_log_pos 517 CRC32 0xe47a26ba Anonymous_GTIDlast_committed=1sequence_number=2 SET @@SESSION.GTID_NEXT= ‘ANONYMOUS‘/*!*/; # at 517 #170829 9:04:42 server id 201609 end_log_pos 592 CRC32 0x0d3e44d1 Querythread_id=7exec_time=0error_code=0 SET TIMESTAMP=1503968682/*!*/; BEGIN /*!*/; # at 592 #170829 9:04:42 server id 201609 end_log_pos 657 CRC32 0x98d94728 Table_map: `student`.`Student` mapped to number 225 # at 657 #170829 9:04:42 server id 201609 end_log_pos 719 CRC32 0x32c7750e Write_rows: table id 225 flags: STMT_END_F BINLOG ‘ qr2kWROJEwMAQQAAAJECAAAAAOEAAAAAAAEAB3N0dWRlbnQAB1N0dWRlbnQABf7+/gL+CP4h/jz+ Bv48HihH2Zg= qr2kWR6JEwMAPgAAAM8CAAAAAOEAAAAAAAEAAgAF/+AJMjAwMjE1MTM4BueQqueQqgPnlLcdAAJN QQ51xzI= ‘/*!*/; # at 719 #170829 9:04:42 server id 201609 end_log_pos 750 CRC32 0x92ebbf95 Xid = 169 COMMIT/*!*/; # at 750 #170829 9:04:42 server id 201609 end_log_pos 815 CRC32 0xfe05a22e Anonymous_GTIDlast_committed=2sequence_number=3 SET @@SESSION.GTID_NEXT= ‘ANONYMOUS‘/*!*/; # at 815 #170829 9:04:42 server id 201609 end_log_pos 890 CRC32 0x551c26a4 Querythread_id=7exec_time=0error_code=0 SET TIMESTAMP=1503968682/*!*/; BEGIN /*!*/; # at 890 #170829 9:04:42 server id 201609 end_log_pos 955 CRC32 0x67c477d0 Table_map: `student`.`Student` mapped to number 225 # at 955 #170829 9:04:42 server id 201609 end_log_pos 1017 CRC32 0x5d3f2503 Write_rows: table id 225 flags: STMT_END_F BINLOG ‘ qr2kWROJEwMAQQAAALsDAAAAAOEAAAAAAAEAB3N0dWRlbnQAB1N0dWRlbnQABf7+/gL+CP4h/jz+ Bv48HtB3xGc= qr2kWR6JEwMAPgAAAPkDAAAAAOEAAAAAAAEAAgAF/+AJMjAwMjE1MTM5Bum+mem+mQPnlLcbAAJJ UwMlP10= ‘/*!*/; # at 1017 #170829 9:04:42 server id 201609 end_log_pos 1048 CRC32 0x2d5f70ba Xid = 170 COMMIT/*!*/; # at 1048 #170829 9:06:30 server id 201609 end_log_pos 1113 CRC32 0xb8cdf9b6 Anonymous_GTIDlast_committed=3sequence_number=4 SET @@SESSION.GTID_NEXT= ‘ANONYMOUS‘/*!*/; # at 1113 #170829 9:06:30 server id 201609 end_log_pos 1214 CRC32 0x69d17a84 Querythread_id=7exec_time=0error_code=0 SET TIMESTAMP=1503968790/*!*/; drop database student /*!*/; SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/; DELIMITER ; /*!50003 SET [email protected]_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
調整好後開始恢復增量數據
[[email protected] tmp]# mysql -u root -p < 04.sql
Enter password:
再次查看數據庫,發現全備份到刪除數據庫之間的那三條數據也恢復了!!
mysql> select * from Student; +-----------+-----------+------+------+-------+ | Sno | Sname | Ssex | Sage | Sdept | +-----------+-----------+------+------+-------+ | 200215121 | 李勇 | 男 | 20 | CS | | 200215122 | 劉晨 | 女 | 19 | CS | | 200215123 | 王敏 | 女 | 18 | MA | | 200215125 | 張立 | 女 | 19 | IS | | 200215126 | 虎威 | 男 | 25 | CS | | 200215127 | 魏大師 | 男 | 35 | IS | | 200215128 | 老謝 | 男 | 33 | MA | | 200215129 | 小賈 | 男 | 30 | CS | | 200215130 | 會民 | 男 | 23 | CS | | 200215131 | 陳興 | 男 | 33 | MA | | 200215132 | 阿帆 | 男 | 36 | IS | | 200215133 | 國良 | 男 | 40 | IS | | 200215134 | 老宋 | 男 | 40 | IS | | 200215135 | 光光 | 男 | 35 | IS | | 200215136 | 王老板 | 女 | 27 | IS | | 200215137 | 程程 | 女 | 30 | IS | | 200215138 | 琪琪 | 男 | 29 | MA | | 200215139 | 龍龍 | 男 | 27 | IS | +-----------+-----------+------+------+-------+ 18 rows in set (0.00 sec)
以上就是MySQL 數據庫增量數據恢復的實例過程!如有不足還請指正
本文出自 “老白的博客” 博客,請務必保留此出處http://laobaiv1.blog.51cto.com/2893832/1960846
Mysql 通過全量備份和binlog恢復整體數據