在日常運維工作中數據庫刪除記錄語句數據庫刪除記錄語句,對于數據庫的備份是至關重要的!數據庫對于網站的重要性使得我們對 MySQL 數據庫的管理不容有失!然而是人總難免會犯錯誤,說不定哪天大腦短路了,誤操作把數據庫給刪除了,怎么辦?
下面,就 MySQL 數據庫誤刪除后的恢復方案進行說明。
一、工作場景
(1)MySQL數據庫每晚12:00自動完全備份。
(2)某天早上上班,9點的時候,一同事犯暈drop了一個數據庫!
(3)需要緊急恢復!可利用備份的數據文件以及增量的文件進行數據恢復。
二、數據恢復思路
(1)利用全備的sql文件中記錄的 語句,文件及其位置點信息,找出文件中增量的那部分。
(2)用命令將上述的文件導出為sql文件,并剔除其中的drop語句。
(3)通過全備文件和增量文件的導出sql文件,就可以恢復到完整的數據。
三、實例說明
首先,要確保mysql開啟了日志功能。在/etc/f文件里的[]區塊添加:
log-bin=mysql-bin
然后重啟mysql服務
(1)在ops庫下創建一張表
mysql>;
mysql>(
->,
->(20),
->,
->(id)
->)=;
,(0.09sec)
mysql>;
+---------------+
||
+---------------+
||
+---------------+
(0.00sec)
mysql>;
+-------+----------+------+-----+---------+----------------+
|Field|Type|Null|Key||Extra|
+-------+----------+------+-----+---------+----------------+
|id|int(11)|NO|PRI|NULL||
|name|char(20)|NO||NULL||
|age|int(11)|NO||NULL||
+-------+----------+------+-----+---------+----------------+
(0.02sec)
mysql>alues(1,"","24");
,(0.06sec)
mysql>alues(2,"","22");
,(0.06sec)
mysql>alues(3,"","27");
,(0.09sec)
mysql>*;
+----+-----------+-----+
|id|name|age|
+----+-----------+-----+
|1||24|
|2||22|
|3||27|
+----+-----------+-----+
(0.00sec)
(2)現在進行全備份
[root@vm-002~]#-uroot-p-B-F-R-x---data=2ops|gzip>/opt//ops_$(date+%F).sql.gz
:
[root@vm-002~]#ls/opt//
-09-25.sql.gz
參數說明:
-B:指定數據庫
-F:刷新日志
-R:備份存儲過程等
-x:鎖表
–-data:在備份語句里添加 語句以及文件及位置點信息
(3)再次插入數據
mysql>alues(4,"","21");
,(0.06sec)
mysql>alues(5,"","31");
,(0.07sec)
mysql>alues(6,"","26");
,(0.06sec)
mysql>*;
+----+-----------+-----+
|id|name|age|
+----+-----------+-----+
|1||24|
|2||22|
|3||27|
|4||21|
|5||31|
|6||26|
+----+-----------+-----+
(0.00sec)
(4)此時誤操作,刪除了test數據庫
mysql>;
,(0.04sec)
此時,全備之后到誤操作時刻之間,用戶寫入的數據在中,需要恢復出來!
(5)查看全備之后新增的文件
[root@vm-002~]#cd/opt//
[root@vm-]#ls
-09-25.sql.gz
[root@vm-]#gzip--09-25.sql.gz
[root@vm-]#ls
-09-25.sql
[root@vm-]#-09-25.sql
--='mysql-bin.',=106;
這是全備時刻的文件位置,即mysql-bin.的106行,因此在該文件之前的文件中的數據都已經包含在這個全備的sql文件中了
(6)移動文件,并導出為sql文件,剔除其中的drop語句,查看mysql的數據存放目錄,有下面可知是在/var/lib/mysql下
[root@vm-]#ps-ef|
:43pts/100:00:00/bin/sh/usr/bin/--=/var/lib/mysql--=/var/lib/mysql/mysql.sock--pid-file=/var/run//.pid--=/usr--user=mysql
:43pts/100:00:00/usr//--=/usr--=/var/lib/mysql--user=mysql--log-error=/var/log/.log--pid-file=/var/run//.pid--=/var/lib/mysql/mysql.sock
[root@vm-]#cd/var/lib/mysql/
[root@vm-]#ls
-bin.-bin.-bin..
[root@vm-]#-bin./opt//
將文件導出sql文件,并vim編輯它刪除其中的drop語句
[root@vm-]#--bin.>.sql
[root@vm-]#ls
.-bin.-09-25.sql
[root@vm-]#.sql#刪除里面的drop語句
注意:在恢復全備數據之前必須將該文件移出,否則恢復過程中,會繼續寫入語句到,最終導致增量恢復數據部分變得比較混亂
(7)恢復數據
[root@vm-]#mysql-uroot-;
+--------------------+
||
+--------------------+
||
|mysql|
|ops|
|test|
+--------------------+
(0.00sec)
mysql>;
-A
mysql>*;
+----+-----------+-----+
|id|name|age|
+----+-----------+-----+
|1||0|
|2||0|
|3||0|
+----+-----------+-----+
(0.00sec)
此時恢復了全備時刻的數據。接著,使用.sql文件恢復全備時刻到刪除數據庫之間,新增的數據
[root@vm-]#mysql-uroot-pops
:
[root@vm-]#
再次查看數據庫,發現全備份到刪除數據庫之間的那部分數據也恢復了!!
mysql>*;
+----+-----------+-----+
|id|name|age|
+----+-----------+-----+
|1||24|
|2||22|
|3||27|
|4||21|
|5||31|
|6||26|
+----+-----------+-----+
(0.00sec)