idb文件被誤刪除了,如何恢復
解決思路:實例在沒有重啟的狀況下可以根據lsof恢復,這也是linux常用文件恢復的方法
恢復步驟(網絡上有較多解決思路,這里簡單記錄,便于下次使用):
1、ps -ef|grep mysqld 找到mysql對應的進程號,這個時候訪問出問題最好給mysql加個全局的鎖(flush tables with read lock;)
2、lsof|grep deleted|grep *.ibd 看下這個文件還有木有
3、找到這個對應的文件拷貝回去
根據進程號找到目錄
cd /proc/123940/fd (ps:123940就是ps -ef|grep mysqld 查到的進程號)
這個時候執行ll會出現文件號指向不同的文件,找到想要恢復的文件cp回去
cp /proc/123940/fd/70 > /data/mysql/data/xxx.ibd
4、修改文件權限到mysql,重啟即可
具體操作
1、MySQL進程還在
MySQL進程存在的情況下,操作系統還保留進程打開的文件句柄,可以進入/proc/$進程pid/fd 目錄下查到文件對應的句柄文件,通過cp 拷貝到原路徑下
模擬故障,mysql正常運行,查看fd狀態

刪除ibdata文件

查看mysql的進程還在

FD指向的文件已經變成delete狀態

登錄數據庫:
1、添加全局讀鎖同時開啟super_read_only
2、修改強制臟頁刷新,調整innodb_io_capacity 增加IO刷新參數
3、查找鏈接并組成kill 語句

確認臟頁是否刷新完成
1、確保insert buffer 合并插入緩存等于1
2、確保這三個值不變
3、確保臟頁數量為0確保插入、更新、刪除為0



備份數據目錄
cp -rf data data_bak
拷貝文件句柄
cp 10 /data/3306/data/ibdata1
賦權
chown mysql:mysql ibdata1
重啟數據庫
mysqld_safe --defaults-file=/etc/my.cnf




