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