Mysql誤刪表中數據與誤刪表的恢復方法(轉)


由於頭兩天面試時被問了這樣一個問題,如果某同事誤刪了某個表,你該怎么恢復?

  當時想了一下,因為博主沒有遇到過這個問題,但是也多少了解一些,所以就回答通過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進行恢復

  恢復過程中禁止在對數據庫進行任何操作

  數據庫乃是企業的重中之重,備份一定要做的,也不要覺得有了備份就萬無一失了,定期要恢復備份文件查看備份文件與生產庫數據是否同步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM