使用mysqlbinlog恢复指定表
從整庫備份的sql文件中導(dǎo)出某個(gè)表的sql語句時(shí),vim查找到表的第一條INSERT語句后,按上下?lián)Q行鍵計(jì)數(shù)INSERT語句的條數(shù),然后按n yy復(fù)制,退出vim后,
再新建一個(gè)文件,按p粘貼剛才的n條INSERT語句,再進(jìn)行source導(dǎo)入。
----------------------------------------------------------------
一、登錄數(shù)據(jù)庫刷新binlog
1.1)查看當(dāng)前的binlog
MySQL> show master status;
+---------------------+----------+--------------+------------------+-------------------+
| File??????????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------+
| test-150-bin.000003 |? 2895377 |????????????? |????????????????? |?????????????????? |
+---------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
1.2)刷新binlog
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
1.3)確認(rèn)刷新binlog成功
mysql> show master status;
+---------------------+----------+--------------+------------------+-------------------+
| File??????????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------+
| test-150-bin.000004 |????? 120 |????????????? |????????????????? |?????????????????? |
+---------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
用show master status 命令查看當(dāng)前的binlog已經(jīng)由test-150-bin.000003變?yōu)閠est-150-bin.000004,
證明binlog已經(jīng)刷新成功。
二、查詢二進(jìn)制日志位置
mysql> show variables like'log_bin%';
+---------------------------------+------------------------------------------+
| Variable_name?????????????????? | Value??????????????????????????????????? |
+---------------------------------+------------------------------------------+
| log_bin ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ON?????????????????????????????????????? |
| log_bin_basename ? ? ? ? ? ? | /db/mysql5.6/data/test-150-bin?????? |
| log_bin_index ? ? ? ? ? ? ? ? ? ?| /db/mysql5.6/data/test-150-bin.index |
| log_bin_trust_function_creators ?| ON?????????????????????????????????????? |
| log_bin_use_v1_row_events?????? | OFF????????????????????????????????????? |
+---------------------------------+------------------------------------------+
三、從二進(jìn)制日志中獲取表被刪除的時(shí)間
$ mysqlbinlog test-150-bin.000003 | grep -i DROP? -A3 -B4
COMMIT/*!*/;
# at 122869
#140126 17:03:35 server id 150? end_log_pos 122989 CRC32 0x8707c4c4???? Query?? thread_id=12519 exec_time=0???? error_code=0
SET TIMESTAMP=1390727015/*!*/;
DROP TABLE `test` /* generated by server */
/*!*/;
# at 122989
#140126 17:04:06 server id 150? end_log_pos 123039 CRC32 0x43476aad???? Rotate to test-150-bin.000004? pos: 4
drop語句的前兩行表名drop語句的執(zhí)行時(shí)間是在 17:03:35
mysql> SELECT from_unixtime('1390727015');
+-----------------------------+
| from_unixtime('1390727015') ?|
+-----------------------------+
| 2014-01-26 17:03:35.000000 |
+-----------------------------+
1 row in set
?
四、從binlog中獲取指定數(shù)據(jù)庫的改變數(shù)據(jù)
用mysqlbinlog 恢復(fù)ivr數(shù)據(jù)庫在二進(jìn)制日志test-150-bin.000003中的數(shù)據(jù)
假設(shè)從上一次mysql備份后,只有一個(gè)binlog產(chǎn)生,即登錄數(shù)據(jù)庫時(shí)查詢到binlog test-150-bin.000003
mysqlbinlog -d ivr --stop-datetime='2014-01-26 17:03:35' test-150-bin.000003 > recover_ivr.sql
如果從上次備份刷新binlog,到發(fā)現(xiàn)表被刪掉的過程中產(chǎn)生了多個(gè)binlog。則要按照binlog產(chǎn)生的順序進(jìn)行恢復(fù),那
么恢復(fù)的次序應(yīng)該是按照binglog的產(chǎn)生的序號,從小到大依次恢復(fù)。
假如從上次備份,到發(fā)現(xiàn)表被刪除,共有兩個(gè)binlog文件,分別是test-150-bin.000002,test-150-bin.000003 ,
則按照binlog序號從小到大的排列,恢復(fù)的順序應(yīng)該是:
mysqlbinlog -d ivr? test-150-bin.000002? > recover_ivr.sql
mysqlbinlog -d ivr --stop-datetime='2014-01-26 17:03:35' test-150-bin.000003? >> recover_ivr.sql
由于恢復(fù)的文件recover_ivr.sql中包含了整個(gè)ivr數(shù)據(jù)庫的所有表,我們只要恢復(fù)指定的表mytable,還要對恢復(fù)出來的sql進(jìn)行過濾。
cat recover_ivr.sql | grep ?-A1 -B3 -i -E '^insert|^update|^delete|^replace|^alter'?| grep -A1 -B3?mytable ?> mytable.sql
可以先使用more確認(rèn)一下
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
--
# at 122721
#140126 17:03:28 server id 150? end_log_pos 122721 CRC32 0xe0f851bb???? Intvar
SET INSERT_ID=4/*!*/;
#140126 17:03:28 server id 150? end_log_pos 122838 CRC32 0x9efcc7b2???? Query?? thread_id=12578 exec_time=0???? error_code=0
use `ivr`/*!*/;
SET TIMESTAMP=1390727008/*!*/;
INSERT INTO `testtuo` (`name`) VALUES ('d')
/*!*/;
# at 122838
將過濾后的結(jié)果保存為sql腳本,恢復(fù)到數(shù)據(jù)庫即可。
恢復(fù)之前為了避免產(chǎn)生沒有用的二進(jìn)制日志,可以關(guān)閉二進(jìn)制日志的記錄
SET SESSION sql_log_bin=0;
恢復(fù)完成,啟用記錄二進(jìn)制日志
SET SESSION sql_log_bin=1;
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/wjoyxt/p/5435687.html
總結(jié)
以上是生活随笔為你收集整理的使用mysqlbinlog恢复指定表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python特性、属性以及私有化
- 下一篇: EF架构~codeFirst从初始化到数