誤刪除InnoDB ibdata資料檔案(無備份)
在日常工作中,因不熟悉InnoDB引擎,在群裡看到有很多人誤刪除了InnoDB ibdata(資料檔案)和ib_logfile(redo log重做事務日誌檔案),結果導致了杯具的發生。如果你有做主從複製同步,那還好,如果是單機呢?如何恢復?
下面,請看恢復演示:
一、你可以用sysbench模擬資料的寫入,如:
- sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000000 --max-requests=10000
- --num-threads=90 --mysql-host=192.168.110.140 --mysql-port=3306 --mysql-user=admin --mysql-password=123456
- --mysql-db=test --oltp-table-name=uncompressed --mysql-socket=/tmp/mysql.sock run
二、rm -f ib*
三、此時我估計你被嚇得夠嗆,臉白手哆嗦,如果你看到這篇文章,心可以穩穩了,沒事,可以恢復的。
四、此時,你會發現資料庫還可以正常工作,資料照樣可以寫入,切記,這時千萬別把mysqld程式殺死,否則你只有跳樓了,神仙都沒法救你。
五、先找到mysqld的程式pid
- # netstat -ntlp | grep mysqld
- tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2463/mysqld
我這裡是30426
六、執行關鍵的一步
[root@wg1 data]# ll /proc/2463/fd | egrep 'ib_|ibdata'
lrwx------ 1 root root 64 08-19 09:51 3 -> /mydata/mysql-5.6.25/data/ibdata1 (deleted)
lrwx------ 1 root root 64 08-19 09:51 8 -> /mydata/mysql-5.6.25/data/ib_logfile0 (deleted)
lrwx------ 1 root root 64 08-19 09:51 9 -> /mydata/mysql-5.6.25/data/ib_logfile1 (deleted)
3,8,9就是我們要恢復的檔案。
七、你可以把前端業務關閉,或者執行FLUSH TABLES WITH READ LOCK;這一步的作用是讓資料庫沒有寫入操作,以便後面的恢復工作。
八、如何驗證沒有寫入操作呢?分以下幾步,記住要結合在一起觀察。
mysql> set global innodb_max_dirty_pages_pct=0;
Query OK, 0 rows affected (0.00 sec)
- # 讓髒頁儘快刷入到磁碟裡。
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000002 | 107 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
確保File和Position值不在變化
- show engine innodb status\G;
- ------------
- TRANSACTIONS
- ------------
- Trx id counter A21837
- Purge done for trx's n:o < A21837 undo n:o < 0
- ## 確保後臺Purge程式把undo log全部清除掉,事務ID要一致。
- -------------------------------------
- INSERT BUFFER AND ADAPTIVE HASH INDEX
- -------------------------------------
- Ibuf: size 1, free list len 65, seg size 67, 0 merges
- ## insert buffer合併插入快取等於1
- ---
- LOG
- ---
- Log sequence number 18158813743 ---- 當前的LSN
- Log flushed up to 18158813743 ----重新整理到redo log的LSN
- Pages flushed up to 18158813743 ---重新整理到磁碟的LSN
- Last checkpoint at 18158813743
- ## 確保這3個值不在變化
- ----------------------
- BUFFER POOL AND MEMORY
- ----------------------
- Total memory allocated 643891200; in additional pool allocated 0
- Dictionary memory allocated 39812
- Buffer pool size 38400
- Free buffers 37304
- Database pages 1095
- Old database pages 424
- Modified db pages 0
- ## 確保髒頁數量為0
- --------------
- ROW OPERATIONS
- --------------
- 0 queries inside InnoDB, 0 queries in queue
- 1 read views open inside InnoDB
- Main thread process no. 30426, id 140111500936976, state: waiting for server activity Number of rows inserted 0, updated 0, deleted 0, read 0
- 0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
- ## 確保插入、更新、刪除為0
九、上面一系列確認工作完成之後,我們就可以恢復了。還記得剛才我們記錄的刪除檔案嗎?
[root@wg1 data]# ll /proc/2463/fd | egrep 'ib_|ibdata'
lrwx------ 1 root root 64 08-19 09:51 3 -> /mydata/mysql-5.6.25/data/ibdata1 (deleted)
lrwx------ 1 root root 64 08-19 09:51 8 -> /mydata/mysql-5.6.25/data/ib_logfile0 (deleted)
lrwx------ 1 root root 64 08-19 09:51 9 -> /mydata/mysql-5.6.25/data/ib_logfile1 (deleted)
把這些檔案複製到原來的目錄下並修改使用者屬性即可。
[root@wg1 data]# cd /proc/2463/fd
[root@wg1 fd]# cp 3 /mydata/mysql-5.6.25/data/ibdata1
[root@wg1 fd]# cp 8 /mydata/mysql-5.6.25/data/ib_logfile0
[root@wg1 fd]# cp 9 /mydata/mysql-5.6.25/data/ib_logfile1
並修改使用者屬性
[root@wg1 fd]# cd /mydata/mysql-5.6.25/data/
[root@wg1 data]# chown mysql:mysql ib*
十、大功告成,只需要重啟MySQL即可。
- /etc/init.d/mysql restart
源文件 <>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29893219/viewspace-1851577/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL資料災難挽救之ibdata檔案誤刪恢復MySql
- Windows 10刪除備份檔案方法Windows
- mysql 5.7 刪除ibdata1 、ib_logfile 檔案的資料恢復MySql資料恢復
- 資料檔案誤刪除(DM_單機)
- Linux基楚操作指引【檔案改名、檔案備份、檔案刪除】Linux
- Linux實現定時備份MySQL資料庫並刪除30天前的備份檔案LinuxMySql資料庫
- win10怎麼刪除舊系統備份_win10如何刪除備份檔案Win10
- linux下恢復誤刪除oracle的資料檔案LinuxOracle
- Ubuntu下(跨機)檔案、資料夾的複製、刪除、重新命名、移動、備份Ubuntu
- oracle徹底刪除資料檔案Oracle
- 雲備份和同步檔案資料
- oracle uncatalog資料庫備份檔案Oracle資料庫
- Dedecms備份的資料檔案位置及備份資料庫的方法資料庫
- 【DATAPUMP】Oracle資料泵定時備份刪除指令碼Oracle指令碼
- u盤裡的檔案無法刪除 如何刪除u盤裡刪不掉的檔案
- Oracle10g刪除資料檔案Oracle
- ibdata1檔案損壞時恢復InnoDB單表測試
- 檔案資料同步備份工具:ChronoSync for MacMac
- hadoop 資料夾檔案的建立與刪除Hadoop
- FileUtils類建立、刪除檔案及資料夾
- 1.7.8. 刪除資料庫密碼檔案資料庫密碼
- win10系統刪除檔案提示檔案正在使用無法刪除如何解決Win10
- 誤刪除資料了怎麼辦?小編交易誤刪除資料的恢復方法
- win10 如何取消c盤的系統備份 如何刪除c盤備份檔案win10Win10
- 【伺服器資料恢復】Zfs檔案系統下誤刪除怎麼恢復資料伺服器資料恢復
- SQL SERVER備份資料庫檔案(使用SSMS)SQLServer資料庫SSM
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- 【Linux】linux下刪除/清空資料夾/檔案命令Linux
- 【HBase】誤刪除資料怎麼辦?
- SVN !檔案刪除
- rm 刪除檔案
- Git——刪除檔案Git
- 【北亞資料恢復】zfs檔案系統的伺服器誤刪除的資料恢復資料恢復伺服器
- win10電腦刪除檔案時提示檔案正在使用無法刪除怎麼解決Win10
- SQL Server實戰一:建立、分離、附加、刪除、備份資料庫SQLServer資料庫
- find 命令刪除冗餘 Nginx 錯誤日誌並實現備份Nginx
- Mysql中備份資料檔案中/*!*/的含義MySql
- 遠端備份資料庫和檔案的方法資料庫
- 雲伺服器:Linux資料夾檔案建立、刪除伺服器Linux