最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql8.0無(wú)備份通過(guò)idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理

 更新時(shí)間:2025年03月02日 17:02:05   作者:小小碼農(nóng)  
文章描述了公司服務(wù)器斷電后數(shù)據(jù)庫(kù)故障的過(guò)程,作者通過(guò)查看錯(cuò)誤日志、重新初始化數(shù)據(jù)目錄、恢復(fù)備份文件、修改配置文件等步驟,成功修復(fù)了MySQL數(shù)據(jù)庫(kù)

周末突然接到一位一年多沒(méi)聯(lián)系的妹妹打來(lái)電話,“劉哥,快來(lái)救救我”,我腦海瞬間冒出妙瓦底,電信火苲馬扁.....,當(dāng)時(shí)就冒汗了,心想這個(gè)妹子怎么被...

問(wèn)其原由,原來(lái)是他們公司服務(wù)器掉電,重啟后單位的站點(diǎn)打不開(kāi)了,請(qǐng)求支援...

妹妹說(shuō)搞定請(qǐng)我吃臨沂炒雞,作為從業(yè)N年的碼農(nóng),英雄救美義不容辭。立即驅(qū)車(chē)18公里,火速前往事故現(xiàn)場(chǎng)。

經(jīng)了解項(xiàng)目tomcat服務(wù)啟動(dòng)正常,但是數(shù)據(jù)庫(kù)沒(méi)有正常啟動(dòng)導(dǎo)致web應(yīng)用無(wú)法訪問(wèn),數(shù)據(jù)數(shù)版本mysql8.0.26,這個(gè)沒(méi)玩過(guò)咋整,平時(shí)都是弄mssql,oracle。

修復(fù)過(guò)程

百度查閱各種資料,歷時(shí)1天的時(shí)間,下面簡(jiǎn)單記錄整個(gè)修復(fù)過(guò)程。

1、查看錯(cuò)誤日志信息

日志文件在mysql數(shù)據(jù)目錄中 C:\ProgramData\MySQL\MySQL Server 8.0\Data,文件命名格式為 計(jì)算機(jī)名稱.err,本地文件liuxiaoxiao.err

信息顯示: file not found liuxiaoxiao-bin.000031

此問(wèn)題重命名data目錄中l(wèi)iuxiaoxiao-bin.index文件為其他名稱,或刪除此文件。重啟數(shù)據(jù)庫(kù)服務(wù)后數(shù)據(jù)庫(kù)正常啟動(dòng),項(xiàng)目可以訪問(wèn)。

2、很開(kāi)心,美女說(shuō)還有一臺(tái)也出故障,是以前的一個(gè)老項(xiàng)目不怎么用,但是歷史數(shù)據(jù)偶爾查詢,心想如法炮制不就ok了嗎,一招制敵簡(jiǎn)單,哈哈

打開(kāi)錯(cuò)誤日志看到的信息完全不一樣,錯(cuò)誤信息顯示mysqld got exception 0x80000003

11:38:26 UTC - mysqld got exception 0x80000003 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x2ce9279b3f0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
7ff70802a1a2 mysqld.exe!?my_errno@@YAHXZ()
7ff970f3e5f5 ucrtbase.dll!raise()
7ff970f3f601 ucrtbase.dll!abort()
此處省略若干行......
7ff970ee9363 ucrtbase.dll!_recalloc()
7ff97285257d KERNEL32.DLL!BaseThreadInitThunk()
7ff9738caa58 ntdll.dll!RtlUserThreadStart()

3、查閱資料嘗試操作,對(duì)Data目錄進(jìn)行重新初始化,可以正常啟動(dòng)數(shù)據(jù)庫(kù)服務(wù),但是復(fù)制備份文件過(guò)去后服務(wù)啟動(dòng)仍然異常,過(guò)程如下。

  1)、備份整個(gè)data目錄,現(xiàn)場(chǎng)電腦的路徑是C:\ProgramData\MySQL\MySQL Server 8.0\Data,然后清空Data目錄

      2)、cmd 運(yùn)行C:\Program Files\MySQL\MySQL Server 8.0\bin目錄下的mysqld.exe 執(zhí)行以下命令mysqld --initialize回車(chē)等待完成

初始化完成,服務(wù)啟動(dòng)讓提示錯(cuò)誤,這里操作完成后查看data目錄并沒(méi)有產(chǎn)生新文件,結(jié)果初始化后Data目錄跑到C:\Program Files\MySQL\MySQL Server 8.0\Data目錄,手動(dòng)將初始化產(chǎn)生的文件復(fù)制到C:\ProgramData\MySQL\MySQL Server 8.0\Data下,啟動(dòng)服務(wù)成功。

根據(jù)文章指導(dǎo),初始化后root的新密碼在錯(cuò)誤日志文件中xxxxx.err獲取,修改root密碼為原密碼

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -P 3306 -p
mysql> alter user 'root'@'localhost' identified by '123xxx' password expire never;
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123xxx';
mysql> flush privileges;

根據(jù)文章提示停止mysql服務(wù),復(fù)制原Data備份目錄的ibdata1、ib_logfile1、ib_logfile0、ib_buffer_pool、auto.cnf、 mysql.ibd到新產(chǎn)生的Data下,再重啟服務(wù)失敗,查看錯(cuò)誤日志無(wú)任何日志輸出,而且服務(wù)啟動(dòng)提示失敗,查看window事件日志也沒(méi)有任何可用信息。

使用記事本修改my.ini數(shù)據(jù)庫(kù)配置文件在[mysqld]下增加innodb_force_recovery=1配置信息,仍然啟動(dòng)失敗

重新初始化Data目錄,刪除上面改動(dòng)添加的innodb_force_recovery=1配置信息,啟動(dòng)提示同樣錯(cuò)誤,提示大致信息:服務(wù)依賴的xxxx停止。

截至目前情況變的更糟糕了,初始化后正常的服務(wù)都不能啟動(dòng),本身就對(duì)mysql不太了解,心里開(kāi)始發(fā)懵,決定嘗試卸載重新安裝mysql,版本必須保持與原來(lái)安裝版本一直,因?yàn)楹竺孢€要進(jìn)行數(shù)據(jù)庫(kù)修復(fù)。

4、重新安裝數(shù)據(jù)庫(kù):

卸載數(shù)據(jù)庫(kù),刪除C:\ProgramData\MySQL\;C:\Program Files\MySQL\ 兩個(gè)目錄下的MySQL Server 8.0文件夾、(注意:原來(lái)Data目錄備份保留好),重新安裝數(shù)據(jù)庫(kù)服務(wù)正常啟動(dòng),備份my.ini配制文件,采取逐步嘗試的方法發(fā)現(xiàn),my.ini文件修改后,服務(wù)就啟動(dòng)不起來(lái),猜測(cè)修改配制異常導(dǎo)致的,恢復(fù)my.ini的備份使用notepad++修改配制文件后可以正常啟動(dòng)服務(wù)。

小總結(jié):mysql數(shù)據(jù)庫(kù)配置文件my.ini不能使用記事本編輯,這個(gè)會(huì)導(dǎo)致文件編碼異常進(jìn)而導(dǎo)致服務(wù)不能啟動(dòng)。這個(gè)要注意?。?!

重復(fù)上述操作復(fù)制ibdata1、ib_logfile1、ib_logfile0...等文件到新目錄,服務(wù)啟動(dòng)失敗。

關(guān)鍵一步:僅復(fù)制Data備份mysql.ibd文件到現(xiàn)有目錄,數(shù)據(jù)庫(kù)服務(wù)啟動(dòng)正常,且使用Navicat鏈接數(shù)據(jù)庫(kù)可以看到數(shù)據(jù)庫(kù),使用Navicat管理工具在數(shù)據(jù)庫(kù)上鼠標(biāo)右鍵|轉(zhuǎn)儲(chǔ)SQL文件|僅結(jié)構(gòu),順利將整個(gè)庫(kù)的建表語(yǔ)句生成,當(dāng)時(shí)開(kāi)心壞了...,猜想mysql.idb文件包含了每個(gè)數(shù)據(jù)庫(kù)對(duì)象的信息。(此步記不清當(dāng)時(shí)是否已將項(xiàng)目數(shù)據(jù)庫(kù)目錄文件放到Data中了,印象中記得是沒(méi)有)

        

5、表修復(fù)和恢復(fù)數(shù)據(jù)庫(kù)

1)、通過(guò)執(zhí)行上步獲取的腳本,重新創(chuàng)建數(shù)據(jù)庫(kù),這樣就獲取了一個(gè)空白的項(xiàng)目數(shù)據(jù)庫(kù)。

2)、執(zhí)行sql丟棄表空間,每個(gè)表都需要操作一遍:alter table cms_xxx discard tablespace; 其中cms_xxx是表名

3)、停止mysql服務(wù)復(fù)制備份目錄項(xiàng)目數(shù)據(jù)庫(kù)的idb文件替換覆蓋第一步腳本創(chuàng)建生成的文件。

4)、執(zhí)行sql導(dǎo)入表空間,每個(gè)表都需要操作一遍:alter table cms_xxx import tablespace; 其中cms_xxx是表名

執(zhí)行不報(bào)錯(cuò)誤的話,這個(gè)表就正??梢栽L問(wèn)了。

當(dāng)前項(xiàng)目數(shù)據(jù)庫(kù)共77個(gè)表,執(zhí)行過(guò)程中62張是可以導(dǎo)入表空間正常了,其中還有5張導(dǎo)入失敗,其中3張是log_開(kāi)頭的,估計(jì)是操作日志類(lèi)的表,沒(méi)有太大業(yè)務(wù)關(guān)系,這個(gè)3張表直接新建數(shù)據(jù)不管了,另外一張是一個(gè)基礎(chǔ)檔案表數(shù)據(jù)不多,新建讓重新維護(hù)記錄就好了。

5)、麻煩的是其中最大的一張表200多兆,不能正常導(dǎo)入,而且根據(jù)名稱推斷這個(gè)是個(gè)關(guān)鍵的業(yè)務(wù)表。網(wǎng)絡(luò)搜索相關(guān)資料,最終恢復(fù)了大部分?jǐn)?shù)據(jù),仍有部分?jǐn)?shù)據(jù)丟失。

總結(jié)具體操作步驟如下,恢復(fù)過(guò)程進(jìn)行要損壞表對(duì)應(yīng)的idb文件就行:

a、安裝全新的mysql環(huán)境安裝路徑和服務(wù)器原來(lái)的路徑要相同(或者在現(xiàn)有的mysql環(huán)境下操作也行),創(chuàng)建相同編碼排序規(guī)則的同名數(shù)據(jù)庫(kù),創(chuàng)建同名的表名稱。

b、停止服務(wù),剪切a步驟新建表Data目錄產(chǎn)生的.idb文件到其他任意自己的備份目錄,將損壞的idb文件放到Data目錄中,my.ini添加innodb_force_recovery=1配置信息,啟動(dòng)數(shù)據(jù)庫(kù)服務(wù),然后嘗試查詢這張數(shù)據(jù)表,數(shù)據(jù)庫(kù)會(huì)報(bào)錯(cuò)或直接服務(wù)停掉了,此時(shí)查看錯(cuò)誤日志,獲取損壞文件的tablespace id值。

錯(cuò)誤日志會(huì)看到大致如此信息:

[ERROR] InnoDB: Error: tablespace id in file ‘.\db_web\cms_content_detail.ibd’ is 233, but in the InnoDB InnoDB: data dictionary it is 109

這是因?yàn)閿?shù)據(jù)庫(kù)系統(tǒng)記憶此表的表空間id和idb文件頭里保存的表空間id不一致導(dǎo)致,(期間還發(fā)現(xiàn)mysql在啟動(dòng)的時(shí)候會(huì)訪問(wèn)數(shù)據(jù)庫(kù)目錄中的每個(gè)idb文件,如果庫(kù)文件目錄中將任意一個(gè)idb文件復(fù)制副本,啟動(dòng)mysql服務(wù)的時(shí)候,日期會(huì)提示重復(fù)的表空間文件)

這里233十進(jìn)制轉(zhuǎn)換16進(jìn)制數(shù)據(jù)為E9,通過(guò)UltraEdit打開(kāi)idb文件查看,驗(yàn)證了此結(jié)果,之所以有兩處,是因?yàn)閕db文件在文件頭和page區(qū)的頭部都保存了此信息。

 接下來(lái)我們需要在此數(shù)據(jù)庫(kù)上不停建立新表,每創(chuàng)建一個(gè)新表mysql系統(tǒng)內(nèi)的tablespace id就會(huì)增加1,直到創(chuàng)建出來(lái)的新表文件這個(gè)ID值是E8,再通過(guò)建表語(yǔ)句創(chuàng)建待修復(fù)的表cms_content_detail,如此新產(chǎn)生的表對(duì)象的表空間ID就和原來(lái)壞掉的保持一致了,如何盤(pán)點(diǎn)新創(chuàng)建的表到E8(十進(jìn)制232)呢,還是用UltraEdit(或其他16進(jìn)制查看文件的工具)打開(kāi)idb文件查看就可以。這里我是通過(guò)重復(fù)執(zhí)行固定次數(shù)的建表tb1達(dá)到需要的目的( DROP table tb1;CREATE table tb1(id int);  )

啟動(dòng)數(shù)據(jù)庫(kù)服務(wù),cmd命令窗口使用mysqldump導(dǎo)出備份數(shù)據(jù)(注意:mysqldump命令需要在mysql的bin目錄執(zhí)行,否則可能會(huì)提示無(wú)效命令)

mysqldump -u root -P 3306 -p db_web cms_content_detail > cms_tb01.sql

回車(chē),輸入root密碼回車(chē)等待導(dǎo)出語(yǔ)句完成,cmsfix_01.sql文件包含了修復(fù)表的create、insert語(yǔ)句。

這里我是將修復(fù)級(jí)別改為6,即innodb_force_recovery=6才完成了數(shù)據(jù)導(dǎo)出的,逐個(gè)嘗試1-5并不能完成修復(fù),在6這個(gè)級(jí)別下最終還是有部分?jǐn)?shù)據(jù)丟失沒(méi)能找回,使用UltraEdit查看idb文件尾部都是000000空白內(nèi)容(如果你的mysql占用的不是默認(rèn)3306端口,可以使用-P 3307指定端口號(hào)的方式連接數(shù)據(jù)庫(kù))。

 有了sql腳本,通過(guò)執(zhí)行該腳本就可以重建表了,將mysql配置文件my.ini文件內(nèi)的innodb_force_recovery配置項(xiàng)注釋掉(否則數(shù)據(jù)庫(kù)處于只讀狀態(tài),沒(méi)法寫(xiě)入數(shù)據(jù))啟動(dòng)數(shù)據(jù)庫(kù),刪除損壞的表,執(zhí)行導(dǎo)出的sql腳本,執(zhí)行語(yǔ)句格式:mysql -u<username> -p<password> <database> < <table_name>.sql

這里執(zhí)行:mysql -u root -p db_web < cms_tb01.sql  回車(chē)等待執(zhí)行完成,查看恢復(fù)表數(shù)據(jù)的情況。

系統(tǒng)復(fù)線后,添加內(nèi)容提示錯(cuò)誤,查看tomcat日志發(fā)現(xiàn)提示ID主鍵沖突,估計(jì)是數(shù)據(jù)庫(kù)損壞導(dǎo)致新增序列ID值與已有數(shù)據(jù)庫(kù)記錄的ID重復(fù),通過(guò)上面的mysqldump導(dǎo)出整個(gè)庫(kù),重新建庫(kù)導(dǎo)入后正常(這樣表的序列和索引都會(huì)被重建)至此整個(gè)修復(fù)過(guò)程結(jié)束,妹妹開(kāi)心的不得了,“幸好有你”。

--->>>期間還走了其他很多彎路,比如通過(guò)idb文件逆向生成建表語(yǔ)句,修改表數(shù)據(jù)庫(kù)引擎類(lèi)型,嘗試其他修復(fù)語(yǔ)句等等,不嘮叨了...

關(guān)于mysql本地計(jì)算機(jī)上的MySQL服務(wù)啟動(dòng)后停止。某些服務(wù)在未由其他服務(wù)或程序使用時(shí)將自動(dòng)停止問(wèn)題

背景:由于某些原因,服務(wù)器需要重啟一下,結(jié)果重啟完就出現(xiàn)這個(gè)mysql本地計(jì)算機(jī)上的MySQL服務(wù)啟動(dòng)后停止。某些服務(wù)在未由其他服務(wù)或程序使用時(shí)將自動(dòng)停止問(wèn)題,一想到平時(shí)偷懶沒(méi)有做數(shù)據(jù)庫(kù)自動(dòng)備份,當(dāng)時(shí)心態(tài)就炸了,找個(gè)各種辦法最后還是用初始化數(shù)據(jù)庫(kù)解決了

首先找到 Mysql 的安裝路徑,看看有沒(méi)有data文件夾,如果沒(méi)有data文件夾(一般默認(rèn)安裝的mysql可以在你的C:\ProgramData\MySQL中找到),自己重新建一個(gè),如果有的話,就把里面的內(nèi)容全部清空,但保留該目錄。注意?。。∵@里data文件夾里面的東西都是你的數(shù)據(jù)庫(kù)信息,一定要先備份起來(lái),后面可以通過(guò)data文件夾里面的文件恢復(fù)你之前的數(shù)據(jù)庫(kù)信息

在這里插入圖片描述

通過(guò)命令行進(jìn)入到MySQL安裝目錄下的 bin 文件夾,也可以直接在bin路徑輸入cmd即可進(jìn)入

在這里插入圖片描述

進(jìn)入到命令行之后輸入初始化命令mysqld --initialize按回車(chē)等待初始化完成即可,大概10秒左右,之后你可以看到清空的data文件已經(jīng)重新生成了文件

在這里插入圖片描述

以上做完可以在命令行net start mysql,也可以打開(kāi)服務(wù)管理器選擇MySQL服務(wù)進(jìn)行啟動(dòng),你就發(fā)現(xiàn)可以正常啟動(dòng)了,但還有一個(gè)問(wèn)題就是初始化的密碼是隨機(jī)生成的,很難記住,需要自己重置一個(gè)自己能記住的密碼。

查看 mysql 隨機(jī)生成的密碼,用記事本打開(kāi) data 文件夾下的 XXXXXXX.err 文件,搜索 password ,會(huì)看到密碼重置,由于隨機(jī)密碼不好記,這個(gè)時(shí)候需要自己重置密碼。

在這里插入圖片描述

進(jìn)入到mysql環(huán)境中,密碼是第五步查找到的隨機(jī)生成的密碼,輸入進(jìn)去即可

在這里插入圖片描述

輸入ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';更改為自己的密碼即可。

至此數(shù)據(jù)庫(kù)就可以正常使用了,當(dāng)然還有最重要的一步就是你的恢復(fù)初始化之前的數(shù)據(jù)庫(kù)信息,這時(shí)候就要用到第一步讓你備份的data文件夾了。

繼上篇文章MySQL本地計(jì)算機(jī)的MYSQL服務(wù)啟動(dòng)后停止問(wèn)題,解決完之后恢復(fù)數(shù)據(jù)庫(kù)信息

前面我有提到?jīng)]有做數(shù)據(jù)庫(kù)的日常備份,所以在解決完以上問(wèn)題之后,我這邊又找到通過(guò)data文件夾備份數(shù)據(jù)庫(kù)信息的方法,這里也一同說(shuō)一下

在恢復(fù)數(shù)據(jù)庫(kù)的時(shí)候一定要保證當(dāng)前的MySQL版本跟之前你的MySQL版本完全一致的情況下,其他版本我不敢保證可以成功

首先打開(kāi)你備份的data文件夾選擇里面ibdata1、ib_logfile1、ib_logfile0、ib_buffer_pool、auto.cnf、 mysql.ibd以及你的數(shù)據(jù)庫(kù)文件夾,馬賽克的地方是我要恢復(fù)的數(shù)據(jù)庫(kù),復(fù)制并覆蓋初始化之后的data文件里面的文件(需要先關(guān)閉mysql服務(wù)才可以復(fù)制進(jìn)去)。

之后啟動(dòng)mysql服務(wù),你就可以看到你之前的所有數(shù)據(jù)庫(kù)都正常出現(xiàn)并使用了。

修復(fù)參考:https://www.cnblogs.com/jiangxu67/p/4744283.html

感謝以上網(wǎng)絡(luò)資料博主的分享

相關(guān)文章

最新評(píng)論

宜良县| 社旗县| 高要市| 沙湾县| 奉化市| 襄城县| 鹤峰县| 中山市| 广南县| 克拉玛依市| 平舆县| 保靖县| 上高县| 海安县| 双江| 鲁甸县| 柳州市| 泰宁县| 大兴区| 武胜县| 黎川县| 汾阳市| 龙里县| 无为县| 辽源市| 开远市| 怀远县| 永修县| 汾阳市| 岳阳县| 江华| 孟津县| 玉屏| 东兴市| 娱乐| 青岛市| 新民市| 正安县| 务川| 额济纳旗| 兴文县|