由於頭兩天面試時被問了這樣一個問題,如果某同事誤刪了某個表,你該怎么恢復?
當時想了一下,因為博主沒有遇到過這個問題,但是也多少了解一些,所以就回答通過mysql的binlog日志進行恢復。
面試官當時問了一下具體的流程。就有些懵逼了。所以就總結了一下,前提一定要做好備份!
數據庫誤刪某表恢復方法,這個前提是針對每天有備份的數據庫和開啟binlog日志的 ,如果沒有備份和binlog日志 恢復起來會非常非常麻煩,所以奉勸大家還是要備份!備份!備份!
/*查看數據庫是否開啟binlog日志*/
mysql> show variables like '%log_bin%'; +---------------------------------+---------------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------------+ | log_bin | ON | | log_bin_basename | /home/mysql/mysql/lib/mysql-bin | | log_bin_index | /home/mysql/mysql/lib/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.00 sec)
/*首先查看一下數據表中的數據*/ MariaDB [drop_test]> select * from python_test; +----+-----------+------------+ | id | name | class_time | +----+-----------+------------+ | 1 | 字典 | 3 | | 2 | 列表 | 2 | | 3 | 函數 | 5 | | 4 | 裝飾器 | 2 | | 5 | 迭代器 | 2 | +----+-----------+------------+ 5 rows in set (0.00 sec)
/*備份*/ mysqldump -uroot -p111111 -B drop_test >drop_test.sql
/*再插入數據后刪除數據庫*/ MariaDB [drop_test]> INSERT INTO python_test(id,name,class_time) value(6,'生成器',2); Query OK, 1 row affected (0.01 sec) MariaDB [drop_test]> INSERT INTO python_test(id,name,class_time) value(7,'類的方法',5); Query OK, 1 row affected (0.00 sec)
刪除數據庫
MariaDB [drop_test]> drop database drop_test ; Query OK, 1 row affected (0.01 sec)
切記這個時候不要有任何的操作!!!
查看當前的binlog
1 mysql> show master status\G; 2 *************************** 1. row *************************** 3 File: mysql-bin.000001 4 Position: 4666 5 Binlog_Do_DB: 6 Binlog_Ignore_DB: 7 Executed_Gtid_Set: 8 1 row in set (0.00 sec)
/*這個時候要將當前的binlog日志拷貝到其他目錄,以免后續操作對binlog日志產生影響*/ cp /var/lib/mysql/mysql-bin.000001 /home
/*執行命令*/ 轉換binlog日志為sql mysqlbinlog -d drop_test mysql-bin.000001 >001bin.sql
編輯001bin.sql將里面的誤操作命令(DROP命令)全部刪除
保存后開始進行恢復數據
/*首先恢復備份文件*/ mysql -uroot -p111111 drop_test < drop_test.sql
/*查看數據庫備份文件*/ MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | drop_test | | for_bak | | lhc | | mysql | | performance_schema | | test | +--------------------+ 7 rows in set (0.00 sec) /*備份的數據已經恢復了*/ MariaDB [drop_test]> show tables; +---------------------+ | Tables_in_drop_test | +---------------------+ | python_test | +---------------------+ 1 row in set (0.00 sec) MariaDB [drop_test]> select * from python_test; +----+-----------+------------+ | id | name | class_time | +----+-----------+------------+ | 1 | 字典 | 3 | | 2 | 列表 | 2 | | 3 | 函數 | 5 | | 4 | 裝飾器 | 2 | | 5 | 迭代器 | 2 | +----+-----------+------------+ 5 rows in set (0.00 sec)
接下來恢復備份之后被刪除的數據
mysql -uroot -p111111 drop_test < 001bin.sql
遇到報錯問題
編輯009bin.sql文件,將報錯信息中提示的293行一下文件全部刪除
然后重新導入
/*恢復后查看數據*/ MariaDB [drop_test]> select * from python_test; +----+--------------+------------+ | id | name | class_time | +----+--------------+------------+ | 1 | 字典 | 3 | | 2 | 列表 | 2 | | 3 | 函數 | 5 | | 4 | 裝飾器 | 2 | | 5 | 迭代器 | 2 | | 6 | 生成器 | 2 | | 7 | 類的方法 | 5 | +----+--------------+------------+ 7 rows in set (0.00 sec)
以上就是數據庫表被誤刪或數據被誤刪的恢復方法!
*******************總結************************
此方法只能對啟動binlog日志的mysql進行恢復
恢復過程中禁止在對數據庫進行任何操作
數據庫乃是企業的重中之重,備份一定要做的,也不要覺得有了備份就萬無一失了,定期要恢復備份文件查看備份文件與生產庫數據是否同步!