1. 程式人生 > 實用技巧 >MySQL中刪除了資料庫中的某哥表之後恢復

MySQL中刪除了資料庫中的某哥表之後恢復

假設不是系統損壞,而是人為損壞,如手誤刪除表

前提條件:

  假裝置份的條件是每天凌晨2點開始備份,週一備份正常,現在是週一下午18點,此時你的同事刪除了hellodb資料庫的中students表,而其他表沒有損壞,可以正常訪問,此時時間18點20分,使用者表示不能訪問了,

一、現在開始備份

mysqldump -A --master-data=2 > /data/backup_`date +%F_%T`.sql
ll /data/backup_2021-01-07_22\:02\:56.sql 
-rw-r--r-- 1 root root 8445056 Jan  7 22:02 /data/backup_2021-01-07_22:02:56.sql

註釋:-A全域性備份--master-data=2 備份的時候多加一個註釋,註釋內容為當前的二進位制日誌檔案的位置

二、模擬資料庫使用中,被刪除students表

MariaDB [hello]> drop table students;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hello]> select * from studnets;
ERROR 1146 (42S02): Table 'hello.studnets' doesn't exist

三、其他表正常使用,模擬teachers表正在新增資料

MariaDB [hello
]> insert teachers (name,age)values('WoShiCeSi',100);

註釋:此處可以看到students表已經找不到了,而teachers表彙總被新增了一條資料

四、開始恢復資料

  1、第一步:通過防火牆或者資料庫配置做限制使用者訪問(此處資料庫配置檔案中修改為只能使用本地套接字連線)

vim /etc/my.cnf

skip
-networking

  2、第二步:檢視之前二進位制日誌檔案的位置在哪

vim /data/backup_2021-01-07_22\:02\:56.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=245;

註釋:此處用vim不用cat 是因為cat直接顯示的是最後一頁,但我們需要的資訊在第一頁,可以直接檢視到需要的資訊

  3、第三步:生成一個新的日誌檔案

flush logs;
 show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1175 |
| mysql-bin.000002 |     30379 |
| mysql-bin.000003 |   1038814 |
| mysql-bin.000004 |      1565 |
| mysql-bin.000005 |       264 |
| mysql-bin.000006 |       245 |
| mysql-bin.000007 |     30379 |
| mysql-bin.000008 |   1038814 |
| mysql-bin.000009 |       833 |
| mysql-bin.000010 |       245 |
+------------------+-----------+

註釋:剛剛記錄的日誌位置是在mysql-bin.000009的245位置,而mysql-bin.000010是剛剛新生成的,只需要恢復這中間的資訊就行。

  4、第四步:把剛剛的定位的二進位制日誌檔案從245開始給他匯出來

mysqlbinlog --start-position=245 /data/logbin/mysql-bin.000009 > /data/inc.sql

  5、第五步:以防萬一的話可以備份一下這個匯出的二進位制日誌檔案(也可以省略這一步)

cp /data/inc.sql /data/inc_backup.sql

  6、第六步:修改之前匯出的二進位制檔案,找到中間刪除表的那行

vim /data/inc.sql 

通過vim中帶的命令來查看出/DROP開頭的命令(此處不確定是用大寫還是小寫刪除的,可以兩個都試一下)

/DROP
或者
/drop

  7、第七步:找到了刪除表的這行命令,加#號登出掉或者刪除這行命令

  8、第八步:下面開始還原:

比較簡單的方式是直接把整個庫刪乾淨在還原,

直接還原,是覆蓋庫,如果裡面有表的話會刪除掉現存的表,然後在恢復過去
rm -rf /var/lib/mysql/*

註釋:此處直接刪除掉了資料庫裡的資料檔案

  9、第九步:重新啟動服務

systemctl restart mariadb

  10、第十步:進入資料庫中先臨時關閉繼續生成新的二進位制日誌檔案

MariaDB [(none)]> set sql_log_bin=0;

  11、第十一步:開始還原資料

MariaDB [test]> source /data/backup_2021-01-07_22:02:56.sql
MariaDB [hello]> source /data/inc.sql

註釋:先恢復資料庫檔案,在恢復二進位制日誌裡的檔案,此處在哪個庫中並沒有關係

五、檢視資料是否恢復(包括students表被刪除後,這段空白時間的資料)

select * from students;

select * from teachers;

六、恢復完成,先讓二進位制日誌檔案繼續記錄,然後關掉之前的使用者訪問限制

set sql_log_bin=on
 vim /etc/my.cnf

#skip-networking