1. 程式人生 > >mysql 恢復誤刪資料

mysql 恢復誤刪資料

mysql通過bin_log恢復資料

轉載 2016年09月26日 15:55:39
一、開啟binlog日誌: 編輯開啟mysql配置檔案my.cnf,在[mysqld]區塊設定/新增 log-bin=mysql-bin  確認是開啟狀態(值 mysql-bin 是日誌的基本名或字首名),重啟mysqld服務使配置生效。日誌重新整理命令:mysql> flush logs。 二、也可登入mysql伺服器,通過mysql的變數配置表,檢視二進位制日誌是否已開啟 mysql> show variables like 'log_%'; 
+----------------------------------------+---------------------------------------+ | Variable_name  | Value  | +----------------------------------------+---------------------------------------+ | log_bin  | ON  | ------> ON表示已經開啟binlog日誌 | log_bin_basename  | /usr/local/mysql/data/mysql-bin  
| | log_bin_index  | /usr/local/mysql/data/mysql-bin.index | | log_bin_trust_function_creators  | OFF  | | log_bin_use_v1_row_events  | OFF  | | log_error  | /usr/local/mysql/data/martin.err  | | log_output  | FILE  | | log_queries_not_using_indexes  | OFF  | | log_slave_updates  
| OFF  | | log_slow_admin_statements  | OFF  | | log_slow_slave_statements  | OFF  | | log_throttle_queries_not_using_indexes | 0  | | log_warnings  | 1  | +----------------------------------------+---------------------------------------+ 三、常用binlog日誌操作命令 1.檢視所有binlog日誌列表 mysql> show master logs; 2.檢視master狀態,即最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)值 mysql> show master status; 3.重新整理log日誌,自此刻開始產生一個新編號的binlog日誌檔案 mysql> flush logs; 注:每當mysqld服務重啟時,會自動執行此命令,重新整理binlog日誌;在mysqldump備份資料時加 -F 選項也會重新整理binlog日誌; 4.重置(清空)所有binlog日誌 mysql> reset master; 四、檢視某個binlog日誌內容,常用有兩種方式: 1.使用mysqlbinlog自帶檢視命令法: 注: binlog是二進位制檔案,普通檔案檢視器cat more vi等都無法開啟,必須使用自帶的 mysqlbinlog 命令檢視 binlog日誌與資料庫檔案在同目錄中(我的環境配置安裝是選擇在/usr/local/mysql/data中) 在MySQL5.5以下版本使用mysqlbinlog命令時如果報錯,就加上 “--no-defaults”選項 # /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000013 下面擷取一個片段分析: ............................................................................... # at 552 #131128 17:50:46 server id 1  end_log_pos 665  Query  thread_id=11  exec_time=0  error_code=0 ---->執行時間:17:50:46;pos點:665 SET TIMESTAMP=1385632246; update zyyshop.stu set name='李四' where id=4  ---->執行的SQL ; # at 665 #131128 17:50:46 server id 1  end_log_pos 692  Xid = 1454 ---->執行時間:17:50:46;pos點:692  ............................................................................... 注: server id 1  資料庫主機的服務號; end_log_pos 665 pos點 thread_id=11  執行緒號 2.上面這種辦法讀取出binlog日誌的全文內容較多,不容易分辨檢視pos點資訊,這裡介紹一種更為方便的查詢命令: mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]; 選項解析: IN 'log_name'  指定要查詢的binlog檔名(不指定就是第一個binlog檔案) FROM pos  指定從哪個pos起始點開始查起(不指定就是從整個檔案首個pos點開始算) LIMIT [offset,] 偏移量(不指定就是0) row_count  查詢總條數(不指定就是所有行) 擷取部分查詢結果: *************************** 20. row *************************** Log_name: mysql-bin.000021  ----------------------------------------------> 查詢的binlog日誌檔名 Pos: 11197 ----------------------------------------------------------> pos起始點: Event_type: Query ----------------------------------------------------------> 事件型別:Query Server_id: 1 --------------------------------------------------------------> 標識是由哪臺伺服器執行的 End_log_pos: 11308 ----------------------------------------------------------> pos結束點:11308(即:下行的pos起始點) Info: use `zyyshop`; INSERT INTO `team2` VALUES (0,345,'asdf8er5') ---> 執行的sql語句 *************************** 21. row *************************** Log_name: mysql-bin.000021 Pos: 11308 ----------------------------------------------------------> pos起始點:11308(即:上行的pos結束點) Event_type: Query Server_id: 1 End_log_pos: 11417 Info: use `zyyshop`; *************************** 22. row *************************** Log_name: mysql-bin.000021 Pos: 11417 Event_type: Query Server_id: 1 End_log_pos: 11510 Info: use `zyyshop`; DROP TABLE IF EXISTS `type` 這條語句可以將指定的binlog日誌檔案,分成有效事件行的方式返回,並可使用limit指定pos點的起始偏移,查詢條數; A.查詢第一個(最早)的binlog日誌: mysql> show binlog events\G;  B.指定查詢 mysql-bin.000021 這個檔案: mysql> show binlog events in 'mysql-bin.000021'\G; C.指定查詢 mysql-bin.000021 這個檔案,從pos點:8224開始查起: mysql> show binlog events in 'mysql-bin.000021' from 8224\G; D.指定查詢 mysql-bin.000021 這個檔案,從pos點:8224開始查起,查詢10條 mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 10\G; E.指定查詢 mysql-bin.000021 這個檔案,從pos點:8224開始查起,偏移2行,查詢10條 mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 2,10\G; 五、恢復binlog日誌實驗(zyyshop是資料庫) 1.假設現在是凌晨4:00,我的計劃任務開始執行一次完整的資料庫備份: 將zyyshop資料庫備份到 /root/BAK.zyyshop.sql 檔案中: # /usr/local/mysql/bin/mysqldump -uroot -p123456 -lF --log-error=/root/myDump.err -B zyyshop > /root/BAK.zyyshop.sql ...... 大約過了若干分鐘,備份完成了,我不用擔心資料丟失了,因為我有備份了,嘎嘎~~~ 由於我使用了-F選項,當備份工作剛開始時系統會重新整理log日誌,產生新的binlog日誌來記錄備份之後的資料庫“增刪改”操作,檢視一下: mysql> show master status; +------------------+----------+--------------+------------------+ | File  | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000023 |  120 |  |  | +------------------+----------+--------------+------------------+ 也就是說, mysql-bin.000023 是用來記錄4:00之後對資料庫的所有“增刪改”操作。 2.早9:00上班了,業務的需求會對資料庫進行各種“增刪改”操作~~~~~~~ @ 比如:建立一個學生表並插入、修改了資料等等: CREATE TABLE IF NOT EXISTS `tt` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(16) NOT NULL, `sex` enum('m','w') NOT NULL DEFAULT 'm', `age` tinyint(3) unsigned NOT NULL, `classid` char(6) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 匯入實驗資料 mysql> insert into zyyshop.tt(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'), ('wangwu','w',26,'cls6'); 檢視資料 mysql> select * from zyyshop.tt; +----+----------+-----+-----+---------+ | id | name  | sex | age | classid | +----+----------+-----+-----+---------+ |  1 | yiyi  | w  |  20 | cls1  | |  2 | xiaoer  | m  |  22 | cls3  | |  3 | zhangsan | w  |  21 | cls5  | |  4 | lisi  | m  |  20 | cls4  | |  5 | wangwu  | w  |  26 | cls6  | +----+----------+-----+-----+---------+ 中午時分又執行了修改資料操作 mysql> update zyyshop.tt set name='李四' where id=4; mysql> update zyyshop.tt set name='小二' where id=2; 修改後的結果: mysql> select * from zyyshop.tt; +----+----------+-----+-----+---------+ | id | name  | sex | age | classid | +----+----------+-----+-----+---------+ |  1 | yiyi  | w  |  20 | cls1  | |  2 | 小二  | m  |  22 | cls3  | |  3 | zhangsan | w  |  21 | cls5  | |  4 | 李四  | m  |  20 | cls4  | |  5 | wangwu  | w  |  26 | cls6  | +----+----------+-----+-----+---------+ 假設此時是下午18:00,莫名地執行了一條悲催的SQL語句,整個資料庫都沒了: mysql> drop database zyyshop; 3.此刻杯具了,別慌!先仔細檢視最後一個binlog日誌,並記錄下關鍵的pos點,到底是哪個pos點的操作導致了資料庫的破壞(通常在最後幾步); 備份一下最後一個binlog日誌檔案: <