從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見(jiàn)錯(cuò)誤
1.背景
前段時(shí)間,我的云服務(wù)器被病毒木馬入侵了,導(dǎo)致服務(wù)器所有服務(wù)全部下線,且22
端口被侵,遠(yuǎn)程無(wú)法登錄,VNC
模式也無(wú)法登錄。嘗試備份鏡像和云硬盤,并用原來(lái)的鏡像重裝系統(tǒng),依舊無(wú)法登錄。
遂只能采用xx云服務(wù)器上的救援模式,掛載一下原來(lái)的硬盤,把關(guān)鍵的文件導(dǎo)出到本地,再重裝系統(tǒng)將文件重新上傳。
在MySQL
數(shù)據(jù)庫(kù)數(shù)據(jù)的恢復(fù)的過(guò)程中,踩了一些坑,下文給出具體的恢復(fù)的操作過(guò)程。
2.操作步驟
2.1 備份源數(shù)據(jù)庫(kù)的ibd文件
整個(gè)MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)的恢復(fù)都是基于ibd
文件的,所以最重要的自然是將源數(shù)據(jù)庫(kù)的ibd文件保存下來(lái)。
這里要注意的是,MySQL默認(rèn)的數(shù)據(jù)保存地點(diǎn)在/var/lib/mysql
目錄下,這個(gè)目錄下會(huì)有你創(chuàng)建的具體的schema
的文件夾,以及這個(gè)schema
中所有表的ibd
文件,我們直接使用SFTP
導(dǎo)出整個(gè)文件夾即可,后續(xù)的恢復(fù)操作都會(huì)基于ibd
文件來(lái)展開(kāi)。
如果你的MySQL
之前安裝的時(shí)候是自己手動(dòng)指定的安裝目錄,可以使用下面的命令查詢mysql的安裝目錄,然后備份的操作同上。
find / -name mysql
2.2 準(zhǔn)備數(shù)據(jù)庫(kù)建表語(yǔ)句
這里可能有些人沒(méi)有備份建表語(yǔ)句的習(xí)慣,大家可以先斷開(kāi)自己本地的網(wǎng)絡(luò)連接,然后使用自己平時(shí)常用的數(shù)據(jù)庫(kù)連接工具,直接查看DDL語(yǔ)句,一般數(shù)據(jù)庫(kù)連接工具里面都有緩存的數(shù)據(jù)庫(kù)的建表語(yǔ)句。
2.3 重新安裝新數(shù)據(jù)庫(kù)
在新的系統(tǒng)上安裝好新數(shù)據(jù)庫(kù),默認(rèn)安裝會(huì)安裝到地址/var/lib/mysql
下。
2.4 新數(shù)據(jù)庫(kù)恢復(fù)數(shù)據(jù)具體步驟
1、創(chuàng)建數(shù)據(jù)庫(kù)schema
比如我們創(chuàng)建數(shù)據(jù)庫(kù)test
,并切換到test
數(shù)據(jù)庫(kù)。在MySQL
中執(zhí)行如下SQL。
create database test; use test;
2、創(chuàng)建表
這里直接把前面準(zhǔn)備好的數(shù)據(jù)庫(kù)建表語(yǔ)句全部執(zhí)行,在MySQL
中執(zhí)行如下SQL。
create table xxx ...
3、移除表空間
這一步是直接把剛才建好的表空間移除,執(zhí)行命令如下,在MySQL
中執(zhí)行如下SQL。
alter table xxx discard tablespace;
其中xxx
為具體的表名,做完這一步的現(xiàn)象就是在/var/lib/mysql/test
目錄下,剛才因?yàn)槲覀儎?chuàng)建表所生成的ibd
文件被刪除了。
4、上傳源數(shù)據(jù)庫(kù)ibd文件
前面我們已經(jīng)備份了源數(shù)據(jù)庫(kù)中表的ibd
文件,現(xiàn)在將文件使用SFTP
工具上傳到剛才的/var/lib/mysql/test
目錄下。(注意:這里的/var/lib/mysql
是我本地?cái)?shù)據(jù)庫(kù)的安裝目錄,而test
是我數(shù)據(jù)庫(kù)的名稱,各位具體情況需要根據(jù)自己數(shù)據(jù)庫(kù)的情況而定)
5、修改ibd文件權(quán)限
上一步通過(guò)SFTP
上傳的ibd
文件正常應(yīng)該是root
用戶上傳的,我們需要使用mysql
用戶來(lái)完成剩下的操作,在Linux
中Shell
的命令行中執(zhí)行下面的命令。
chown mysql:mysql /var/lib/mysql/test/*.ibd
同理,上述的/var/lib/mysql/test
是我本機(jī)的數(shù)據(jù)庫(kù)位置,各位實(shí)際操作的時(shí)候需要根據(jù)自己本機(jī)情況進(jìn)行相應(yīng)的修改,而*.ibd
表示給所有的ibd
文件都修改權(quán)限。
6、重導(dǎo)表空間
上一步我們已經(jīng)上傳好ibd
文件,并修改了文件權(quán)限,這一步要做的就是讓MySQL
識(shí)別到剛才上傳的數(shù)據(jù),重新導(dǎo)入表空間。這一步可以一個(gè)表一個(gè)表的進(jìn)行導(dǎo)入表空間,原因是因?yàn)橛行┍淼?code>ibd文件可能已經(jīng)不支持導(dǎo)入了,導(dǎo)入的時(shí)候會(huì)報(bào)錯(cuò),我們先把可以恢復(fù)的表恢復(fù)了,在MySQL
中執(zhí)行如下SQL。
alter table xxx import tablespace;
3.常見(jiàn)錯(cuò)誤
在操作恢復(fù)數(shù)據(jù)庫(kù)的過(guò)程中,我遇到了一些錯(cuò)誤,并且導(dǎo)致了部分表無(wú)法恢復(fù)成功,在這里總結(jié)幾種。
3.1 權(quán)限問(wèn)題
由于上傳的ibd
文件是root
用戶上傳的,導(dǎo)致在MySQL
中執(zhí)行SQL會(huì)報(bào)錯(cuò),這個(gè)時(shí)候通過(guò)Shell
工具修改ibd
文件的權(quán)限即可,具體參考2.4
節(jié)第5步。
3.2 報(bào)錯(cuò)不存在CFG文件
這個(gè)報(bào)錯(cuò)我網(wǎng)上查了一下,有的文章說(shuō),在數(shù)據(jù)庫(kù)ibd
文件同級(jí)目錄下存在CFG文件,需要和ibd
文件一起導(dǎo)入新的數(shù)據(jù)庫(kù),但是我的MySQL
版本是8.0.31
并沒(méi)有相關(guān)的CFG文件。
后續(xù)查閱官方文檔,是因?yàn)槲以谧铋_(kāi)始建表以后,使用ALTER
操作新增了列,導(dǎo)致表結(jié)構(gòu)的存儲(chǔ)發(fā)生了變化,這被官方稱為DDL INSTANT
,所以無(wú)法恢復(fù)。面對(duì)這種問(wèn)題,建議大家平時(shí)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)多多備份,減少數(shù)據(jù)丟失。
3.3 通過(guò)ibd文件恢復(fù)數(shù)據(jù)后自增主鍵問(wèn)題報(bào)沖突
我有一些表使用了數(shù)據(jù)庫(kù)的自增主鍵,在恢復(fù)完數(shù)據(jù)以后,重新部署了應(yīng)用,在使用自增主鍵的表中出現(xiàn)了主鍵沖突的情況。
原因是通過(guò)原來(lái)的ibd
文件導(dǎo)入數(shù)據(jù)并沒(méi)有同步相應(yīng)的系統(tǒng)表的結(jié)構(gòu),所以新的MySQL
認(rèn)為自增主鍵還是從1開(kāi)始算,實(shí)際上數(shù)據(jù)庫(kù)中的數(shù)據(jù)自增列早已增長(zhǎng)到一定數(shù)目了。針對(duì)這個(gè)問(wèn)題,我目前沒(méi)有想到好的方法,只能先將恢復(fù)好的數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出到SQL,然后刪除原表重新建表以后,再重新導(dǎo)入。
當(dāng)然如果沒(méi)有使用到系統(tǒng)能力(比如自增主鍵)的表,是無(wú)需刪除表再重新導(dǎo)入數(shù)據(jù)的。
總結(jié)
到此這篇關(guān)于從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見(jiàn)錯(cuò)誤的文章就介紹到這了,更多相關(guān)從ibd文件恢復(fù)MySQL數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中關(guān)于null值的一個(gè)小問(wèn)題
這篇文章主要介紹了MySQL中關(guān)于null值的一個(gè)小問(wèn)題,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-03-03關(guān)于Mysql中current_time/current_date()與now()區(qū)別
這篇文章主要介紹了關(guān)于current_time/current_date()與now()區(qū)別,在Mysql中 current_time函數(shù)是顯示當(dāng)前時(shí)間的,而其他兩個(gè)函數(shù)有何不同呢, 接下來(lái)我們就一起來(lái)看看吧2023-04-04MySQL啟動(dòng)失敗報(bào)錯(cuò):mysqld.service failed to run 
在日常運(yùn)維中,MySQL 作為廣泛應(yīng)用的關(guān)系型數(shù)據(jù)庫(kù),其穩(wěn)定性和可用性至關(guān)重要,然而,有時(shí)系統(tǒng)升級(jí)或配置變更后,MySQL 服務(wù)可能會(huì)出現(xiàn)無(wú)法啟動(dòng)的問(wèn)題,本文針對(duì)某次實(shí)際案例進(jìn)行深入分析和處理,需要的朋友可以參考下2024-12-12MySQL窗口函數(shù)OVER使用示例詳細(xì)講解
這篇文章主要介紹了MySQL窗口函數(shù)OVER()用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01數(shù)據(jù)庫(kù)中row_number()、rank() 和 dense_rank() 的區(qū)別
本文主要結(jié)合了SQL中的排名函數(shù)ROW_NUMBER()、RANK()和DENSE_RANK(),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11MySQL事務(wù)及Spring隔離級(jí)別實(shí)現(xiàn)原理詳解
這篇文章主要介紹了MySQL事務(wù)及Spring隔離級(jí)別實(shí)現(xiàn)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05設(shè)置MySQL中的數(shù)據(jù)類型來(lái)優(yōu)化運(yùn)行速度的實(shí)例
這篇文章主要介紹了設(shè)置MySQL中索引的數(shù)據(jù)類型來(lái)優(yōu)化運(yùn)行速度的實(shí)例,主要是適當(dāng)使用短字節(jié)的數(shù)據(jù)類型來(lái)處理短索引,需要的朋友可以參考下2015-05-05