亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中truncate誤操作后的數(shù)據(jù)恢復案例

 更新時間:2015年05月09日 11:31:09   作者:吳炳錫  
這篇文章主要介紹了MySQL中truncate誤操作后的數(shù)據(jù)恢復案例,主要是要從日志中定位到truncate操作的地方然后備份之前丟失的數(shù)據(jù),需要的朋友可以參考下

實際線上的場景比較復雜,當時涉及了truncate, delete 兩個操作,經(jīng)確認丟數(shù)據(jù)差不多7萬多行,等停下來時,差不多又有共計1萬多行數(shù)據(jù)寫入。 這里為了簡單說明,只拿弄一個簡單的業(yè)務場景舉例。

測試環(huán)境: Percona-Server-5.6.16
日志格式: mixed 沒起用gtid

表結構如下:

CREATE TABLE `tb_wubx` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
 
CREATE TABLE `tb_wubx` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

基于某個時間點有一個備份或是有全量的binlog是能恢復數(shù)據(jù)的一個唯一保證。 例如我們的備份就是一個表結構創(chuàng)建語句,binlog pos相關信息: mysql-bin.000004 , 4,然后進行了如下:

–t1時間 程序?qū)懭耄?br />

insert into tb_wubx(name) values(‘張三'),(‘李四');
insert into tb_wubx(name) values(‘隔壁老王');

–t2時間 某個人員失誤

truncate table tb_wubx;

–t3時間 程序?qū)懭?br />

insert into tb_wubx(name) values(‘老趙');
update tb_wubx set name='老趙趙' where id=1;

現(xiàn)在表里的數(shù)據(jù)情況:

mysql>select * from tb_wubx;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 老趙趙 |
+----+-----------+
1 row in set (0.00 sec)
 
mysql>select * from tb_wubx;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 老趙趙 |
+----+-----------+
1 row in set (0.00 sec)

可以見truncate table操作后,表的自增id又變更為從1開始,原來寫入的數(shù)據(jù)應該是:

+—-+———–+
| id | name |
+—-+———–+
| 1 | 張三 |
+—-+———–+
| 2 | 李四 |
+—-+———–+
| 3 | 隔壁老王 |
+—-+———–+

如果沒生truncate table操作,實際的數(shù)據(jù)應該為:

+—-+———–+
| id | name |
+—-+———–+
| 1 | 張三 |
+—-+———–+
| 2 | 李四 |
+—-+———–+
| 3 | 隔壁老王 |
+—-+———–+
| 4 | 老趙趙 |
+—-+———–+

而且線上的恢復那個表時和序序開發(fā)人員了解才知道,原來那個id和緩存及其它地方有依賴,因為id亂了,也會造成程序錯亂。這個時間修復id在程序?qū)渝e亂的事,留給開發(fā)人員了關建是給他們講明白恢復的結果是什么樣,我們的關建任務是把數(shù)據(jù)恢復出來。好,接下來的工作是開始從binlog中恢復數(shù)據(jù)。
利用: show binary logs; 查看當?shù)膌og文件分布, 然后利用show binlog events in ‘binary log文件'; 查看log文件的內(nèi)容,目的是找到truncate發(fā)生的日志位置。
另外因為基于備份(由log的啟始位置)或是從量log, 如果基于備份有l(wèi)og的起始位置,我們需要處理的log文件是啟始位置到發(fā)生truncate的日值(后面的數(shù)據(jù)處理不了,會發(fā)生主建沖突的錯誤造成truncate后的數(shù)據(jù)不能恢復),
如果是全量日志,需要從創(chuàng)建完mysql后庫后的日志去處理到當前的發(fā)生truncate的位置(后面數(shù)據(jù)會因為主建沖突寫不進去)
恢復準備工作,創(chuàng)建一個庫用于恢復數(shù)據(jù),這里創(chuàng)建了一個re_wubx, 及原結構的表: tb_wubx (相當于恢復了備份,過程省略)

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 261 |
| mysql-bin.000003 | 562 |
| mysql-bin.000004 | 1144 |
+------------------+-----------+
4 rows in set (0.00 sec)
 
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 261 |
| mysql-bin.000003 | 562 |
| mysql-bin.000004 | 1144 |
+------------------+-----------+
4 rows in set (0.00 sec)

我這里有一個備份文件就是那個創(chuàng)建表的sql語句,位置是mysql-bin.000004 , 4
在這個案例里我只用cover住mysql-bin.000004這個文件。

mysql>show binlog events in 'mysql-bin.000004';
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
| Log_name   | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
| mysql-bin.000004 | 4 | Format_desc | 753306 | 120 | Server ver: 5.6.16-64.2-rel64.2-log, Binlog ver: 4 |
| mysql-bin.000004 | 120 | Query   | 753306 | 209 | use `wubx`; truncate table tb_wubx |
| mysql-bin.000004 | 209 | Query   | 753306 | 281 | BEGIN |
| mysql-bin.000004 | 281 | Table_map  | 753306 | 334 | table_id: 91 (wubx.tb_wubx) |
| mysql-bin.000004 | 334 | Write_rows | 753306 | 393 | table_id: 91 flags: STMT_END_F |
| mysql-bin.000004 | 393 | Xid   | 753306 | 424 | COMMIT /* xid=1073 */ |
| mysql-bin.000004 | 424 | Query   | 753306 | 496 | BEGIN |
| mysql-bin.000004 | 496 | Table_map  | 753306 | 549 | table_id: 91 (wubx.tb_wubx) |
| mysql-bin.000004 | 549 | Write_rows | 753306 | 602 | table_id: 91 flags: STMT_END_F |
| mysql-bin.000004 | 602 | Xid   | 753306 | 633 | COMMIT /* xid=1074 */ |
| mysql-bin.000004 | 633 | Query   | 753306 | 722 | use `wubx`; truncate table tb_wubx |
| mysql-bin.000004 | 722 | Query   | 753306 | 794 | BEGIN |
| mysql-bin.000004 | 794 | Table_map  | 753306 | 847 | table_id: 92 (wubx.tb_wubx) |
| mysql-bin.000004 | 847 | Write_rows | 753306 | 894 | table_id: 92 flags: STMT_END_F |
| mysql-bin.000004 | 894 | Xid   | 753306 | 925 | COMMIT /* xid=1081 */ |
| mysql-bin.000004 | 925 | Query   | 753306 | 997 | BEGIN |
| mysql-bin.000004 | 997 | Table_map  | 753306 | 1050 | table_id: 92 (wubx.tb_wubx) |
| mysql-bin.000004 | 1050 | Update_rows | 753306 | 1113 | table_id: 92 flags: STMT_END_F |
| mysql-bin.000004 | 1113 | Xid   | 753306 | 1144 | COMMIT /* xid=1084 */ |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
19 rows in set (0.00 sec)
 
mysql>show binlog events in 'mysql-bin.000004';
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
| Log_name   | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
| mysql-bin.000004 | 4 | Format_desc | 753306 | 120 | Server ver: 5.6.16-64.2-rel64.2-log, Binlog ver: 4 |
| mysql-bin.000004 | 120 | Query   | 753306 | 209 | use `wubx`; truncate table tb_wubx |
| mysql-bin.000004 | 209 | Query   | 753306 | 281 | BEGIN |
| mysql-bin.000004 | 281 | Table_map  | 753306 | 334 | table_id: 91 (wubx.tb_wubx) |
| mysql-bin.000004 | 334 | Write_rows | 753306 | 393 | table_id: 91 flags: STMT_END_F |
| mysql-bin.000004 | 393 | Xid   | 753306 | 424 | COMMIT /* xid=1073 */ |
| mysql-bin.000004 | 424 | Query   | 753306 | 496 | BEGIN |
| mysql-bin.000004 | 496 | Table_map  | 753306 | 549 | table_id: 91 (wubx.tb_wubx) |
| mysql-bin.000004 | 549 | Write_rows | 753306 | 602 | table_id: 91 flags: STMT_END_F |
| mysql-bin.000004 | 602 | Xid   | 753306 | 633 | COMMIT /* xid=1074 */ |
| mysql-bin.000004 | 633 | Query   | 753306 | 722 | use `wubx`; truncate table tb_wubx |
| mysql-bin.000004 | 722 | Query   | 753306 | 794 | BEGIN |
| mysql-bin.000004 | 794 | Table_map  | 753306 | 847 | table_id: 92 (wubx.tb_wubx) |
| mysql-bin.000004 | 847 | Write_rows | 753306 | 894 | table_id: 92 flags: STMT_END_F |
| mysql-bin.000004 | 894 | Xid   | 753306 | 925 | COMMIT /* xid=1081 */ |
| mysql-bin.000004 | 925 | Query   | 753306 | 997 | BEGIN |
| mysql-bin.000004 | 997 | Table_map  | 753306 | 1050 | table_id: 92 (wubx.tb_wubx) |
| mysql-bin.000004 | 1050 | Update_rows | 753306 | 1113 | table_id: 92 flags: STMT_END_F |
| mysql-bin.000004 | 1113 | Xid   | 753306 | 1144 | COMMIT /* xid=1084 */ |
+------------------+------+-------------+-----------+-------------+----------------------------------------------------+
19 rows in set (0.00 sec)

看到這個表剛開始就發(fā)生一次truncate, 那其實也可以說明我就恢復剛開始那個truncate到后來那個誤操作的truncate table的語句之間的數(shù)據(jù)就是丟失的數(shù)據(jù)。
這個恢復可以從mysql-bin.000004 pos: 4到mysql-bin.000004 pos: 633 即:

mysqlbinlog --rewrite-db='wubx->re_wubx' --start-position=4 --stop-position=633 mysql-bin.000004 |mysql -S /tmp/mysql.sock re_wubx


mysqlbinlog --rewrite-db='wubx->re_wubx' --start-position=4 --stop-position=633 mysql-bin.000004 |mysql -S /tmp/mysql.sock re_wubx

恢復結果如下:

mysql -S /tmp/mysql.sock re_wubx;
mysql>select count(*) from tb_wubx;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.02 sec)

mysql>select * from tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
+----+--------------+
3 rows in set (0.00 sec)

mysql>insert into tb_wubx(name) select name from wubx.tb_wubx;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> rename table wubx.tb_wubx to wubx.bak_tb_wubx;
Query OK, 0 rows affected (0.04 sec)

mysql> rename table re_wubx.tb_wubx to wubx.tb_wubx;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from wubx.tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
| 4 | 老趙趙 |
+----+--------------+
4 rows in set (0.00 sec)
 
mysql -S /tmp/mysql.sock re_wubx;
mysql>select count(*) from tb_wubx;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.02 sec)
 
mysql>select * from tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
+----+--------------+
3 rows in set (0.00 sec)
 
mysql>insert into tb_wubx(name) select name from wubx.tb_wubx;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
 
mysql> rename table wubx.tb_wubx to wubx.bak_tb_wubx;
Query OK, 0 rows affected (0.04 sec)
 
mysql> rename table re_wubx.tb_wubx to wubx.tb_wubx;
Query OK, 0 rows affected (0.03 sec)
 
mysql> select * from wubx.tb_wubx;
+----+--------------+
| id | name |
+----+--------------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 隔壁老王 |
| 4 | 老趙趙 |
+----+--------------+
4 rows in set (0.00 sec)

恢復完成。

相關文章

  • 關于MySQL索引的幾點值得注意的事項

    關于MySQL索引的幾點值得注意的事項

    索引對查詢的速度有著至關重要的影響,MySQL索引的建立對于MySQL的高效運行是很重要的
    2014-07-07
  • MySQL curdate()函數(shù)的實例詳解

    MySQL curdate()函數(shù)的實例詳解

    這篇文章主要介紹了MySQL curdate()函數(shù)的實例詳解的相關資料,希望通過本文能幫助到大家理解應用MysqL curdate()的使用方法,需要的朋友可以參考下
    2017-09-09
  • Mysql數(shù)據(jù)庫分庫分表全面瓦解

    Mysql數(shù)據(jù)庫分庫分表全面瓦解

    物理服務機的CPU、內(nèi)存、存儲設備、連接數(shù)等資源有限,某個時段大量連接同時執(zhí)行操作,會導致數(shù)據(jù)庫在處理上遇到性能瓶頸。為了解決這個問題,行業(yè)先驅(qū)門充分發(fā)揚了分而治之的思想,對大庫表進行分割
    2022-01-01
  • MySQL控制流函數(shù)(-if?,elseif,else,case...when)

    MySQL控制流函數(shù)(-if?,elseif,else,case...when)

    這篇文章主要介紹了MySQL控制流函數(shù)(-if?,elseif,else,case...when),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • Navicat出現(xiàn)無法遠程連接MySql服務器問題的解決辦法

    Navicat出現(xiàn)無法遠程連接MySql服務器問題的解決辦法

    這篇文章主要介紹了Navicat出現(xiàn)無法遠程連接MySql服務器問題的解決辦法,文章通過思路判斷出現(xiàn)問題的情況,然后進行逐一排查,確定問題出現(xiàn)的原因并給出解決辦法,本文對此問題的解決介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • mysql服務性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存)

    mysql服務性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存)

    這篇文章主要介紹了mysql服務性能優(yōu)化—my.cnf_my.ini配置說明詳解(16G內(nèi)存),需要的朋友可以參考下
    2016-05-05
  • php基礎之連接mysql數(shù)據(jù)庫和查詢數(shù)據(jù)

    php基礎之連接mysql數(shù)據(jù)庫和查詢數(shù)據(jù)

    這篇文章主要介紹了php連接mysql數(shù)據(jù)庫和查詢數(shù)據(jù)的方法和示例,需要的朋友可以參考下
    2014-08-08
  • mysql多表聯(lián)合查詢操作實例分析

    mysql多表聯(lián)合查詢操作實例分析

    這篇文章主要介紹了mysql多表聯(lián)合查詢操作,結合實例形式分析了mysql多表聯(lián)合查詢的語法、功能、相關操作技巧與注意事項,需要的朋友可以參考下
    2019-04-04
  • 創(chuàng)建mysql表分區(qū)的方法

    創(chuàng)建mysql表分區(qū)的方法

    我來給大家介紹一下mysql表分區(qū)創(chuàng)建與使用吧,希望對各位同學會有所幫助。表分區(qū)的測試使用,主要內(nèi)容來自于其他博客文章以及mysql5.1的參考手冊。
    2013-10-10
  • Win7下mysql5.5安裝圖文教程

    Win7下mysql5.5安裝圖文教程

    這篇文章主要為大家詳細介紹了Win7下mysql5.5安裝的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論