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

mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)

 更新時間:2023年08月26日 10:25:57   作者:不愛代碼的小杜  
這篇文章主要介紹了mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

問題描述

客戶那邊的測試服務(wù)器下午3:00左右因不明原因,所有服務(wù)訪問不了,ssh也無法連接,客戶手動進行強制重啟服務(wù)器,重啟后將所有應(yīng)用、中間件重啟,重啟nacos時發(fā)現(xiàn)無法連接數(shù)據(jù)庫,通過賬號密碼登錄到數(shù)據(jù)庫發(fā)現(xiàn)可以正常登錄,但是奇怪的問題來了。。。

show tables 時可以正常看到表,但是查詢表中數(shù)據(jù)時發(fā)現(xiàn)提示表不存在。。

如下圖:

查看mysql日志:

作為一名mysql菜的不能再菜的小白。。這屬實難到我了,看起來像是數(shù)據(jù)損壞。。沒辦法,通過多方查詢資料,解決辦法如下:

解決辦法

首先了解InnoDB引擎創(chuàng)建數(shù)據(jù)庫會產(chǎn)生的文件:

  • .ibd:包含每個表的數(shù)據(jù)和索引
  • .frm:描述表的結(jié)構(gòu)
  • ibdata1:包含所有表的字典和歷史操作

在test目錄下,包含每個表的.ibd和.frm文件

恢復(fù)前提:ibd文件的數(shù)據(jù)都是正常的

之后也是需要通過這些文件進行恢復(fù),我這邊新啟了一個mysql實例,過程略,

大體的恢復(fù)步驟如下:

1.在新的mysql實例中創(chuàng)建數(shù)據(jù)庫,需要跟原數(shù)據(jù)庫的庫名和字符集保持一致

2.創(chuàng)建數(shù)據(jù)表,表名要求一致,對應(yīng)原庫data目錄下的表名(我這里用工具對原庫表的表結(jié)構(gòu)導(dǎo)出創(chuàng)建的)

3.通過.ibd文件批量恢復(fù)表數(shù)據(jù)信息

  • 3.1 讓表結(jié)構(gòu)和表空間脫離
  • 3.2 將需要恢復(fù)的.ibd替換到新實例的/data的對應(yīng)庫下

1、安裝mysqlfrm 工具

下載鏈接:

wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
tar -xvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5/
安裝(需要Python環(huán)境,python2.6及以上)
python ./setup.py build
python ./setup.py install
檢查是否安裝成功
mysqlfrm --version

2、使用mysqlfrm查看表結(jié)構(gòu)創(chuàng)建語句

mysqlfrm 有–basedir模式以及–server 模式,推薦–server,能夠還原最為準(zhǔn)確的信息

使用方式(需要啟動原mysql):

格式:mysqlfrm --server=用戶名:密碼@數(shù)據(jù)庫地址:端口 需恢復(fù)的frm文件目錄 --diagnostic > 保存SQL文件名.sql

mysqlfrm --server=root:password@x.x.x.x:13306 /home/mysql/data/test/*.frm --diagnostic > test_frm.sql

執(zhí)行所生成的SQL文件

注:mysqlfrm僅僅顯示整個數(shù)據(jù)庫的表結(jié)構(gòu)創(chuàng)建語句,可以顯示在控制臺也可以輸出到文件,不過需要手動執(zhí)行這些表的創(chuàng)建SQL語句。

先創(chuàng)建數(shù)據(jù)庫

CREATE database  test;

可以查看生成的sql文件手動刪除相關(guān)無用信息等,可命令行執(zhí)行或者客戶端執(zhí)行等

命令行導(dǎo)入:

mysql -uroot -ppassword test < test_frm.sql

此時執(zhí)行完就可以通過desc命令查看到表結(jié)構(gòu)了(報錯1:這步我遇到報錯,下面有解決方法)

3、通過.ibd文件批量恢復(fù)表數(shù)據(jù)信息

1)讓表結(jié)構(gòu)和表空間脫離

成表結(jié)構(gòu)和表空間脫離的sql:

mysql -uroot -ppassword -h x.x.x.x  -P 13306 -e " SELECT concat('alter table ', table_name, ' discard tablespace;') FROM information_schema.tables WHERE table_schema = 'test';" > /root/test.sql

將sql文件中沒有用的內(nèi)容刪除

sed '/^c/d' /root/test.sql> /root/test_discard_new.sql

將sql文件導(dǎo)入到新庫

mysql -uroot -ppassword -h x.x.x.x -P 13307 test_AII < test_discard_new.sql

2)將需要恢復(fù)的.ibd文件替換到新庫所在的/data/庫名 目錄下

cp /home/mysql/data/test/*.ibd  /home/mysql-test/data/test/

3)權(quán)限設(shè)置

chown -R mysql.  /home/mysql-test/data/test

4)導(dǎo)入表空間

mysql -uroot -ppassword -h x.x.x.x -P 13306 -e " SELECT concat('alter table ', table_name, ' import tablespace;') FROM information_schema.tables WHERE table_schema = 'test';" > /root/tem_import.sql

清除沒用的數(shù)據(jù)

sed '/^c/d' /root/tem_import.sql > /root/config_import.sql

將sql文件導(dǎo)入(報錯2:有報錯,下面有解決方法)

mysql -uroot -ppassword -h x.x.x.x -P 13307 test_aii < /root/config_import.sql

此時如果操作沒問題,查看數(shù)據(jù)庫表已經(jīng)有了原始數(shù)據(jù)了(報錯3:有報錯,查看下面解決方法)

恢復(fù)過程中遇到的問題

報錯1、在導(dǎo)入創(chuàng)建表結(jié)構(gòu)語句的時候報錯了,顯示語法錯誤我的創(chuàng)建表語句如下:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '5, COMMENT 'config_info'' at line 21, Time: 0.011000s

建表語句:

CREATE TABLE `test_config`.`config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT comment 'id', 
  `data_id` varchar(255) COLLATE `utf8_bin` NOT NULL comment 'data_id', 
  `group_id` varchar(255) COLLATE `utf8_bin` DEFAULT NULL, 
  `content` longtext COLLATE `utf8_bin` comment 'content', 
  `md5` varchar(32) COLLATE `utf8_bin` DEFAULT NULL comment 'md5', 
  `gmt_create` datetime NOT NULL comment '創(chuàng)建時間', 
  `gmt_modified` datetime NOT NULL comment '修改時間', 
  `src_user` text COLLATE `utf8_bin` DEFAULT NULL comment 'source user', 
  `src_ip` varchar(50) COLLATE `utf8_bin` DEFAULT NULL comment 'source ip', 
  `app_name` varchar(128) COLLATE `utf8_bin` DEFAULT NULL, 
  `tenant_id` varchar(128) COLLATE `utf8_bin` DEFAULT NULL comment '租戶字段', 
  `c_desc` varchar(256) COLLATE `utf8_bin` DEFAULT NULL, 
  `c_use` varchar(64) COLLATE `utf8_bin` DEFAULT NULL, 
  `effect` varchar(64) COLLATE `utf8_bin` DEFAULT NULL, 
  `type` varchar(64) COLLATE `utf8_bin` DEFAULT NULL, 
  `c_schema` text COLLATE `utf8_bin` DEFAULT NULL, 
  `encrypted_data_key` text COLLATE `utf8_bin` comment '秘鑰', 
PRIMARY KEY `PRIMARY` (`id`) USING BTREE,
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`(255),`group_id`(255),`tenant_id`(128)) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8, ROW_FORMAT = 5, COMMENT 'config_info';

解決方法:

將ROW_FORMAT 改為COMPACT或DYNAMIC就可以解決

報錯2:導(dǎo)入表空間時,報錯

ERROR 1812 (HY000): Tablespace is missing for table ops.tt7.

解決方法:查看從原庫/data/目錄copy的.ibd文件的屬主和屬組是否是mysql的啟動用戶,不是則修改即可

報錯3:所有步驟執(zhí)行完成后,重啟mysql時啟動失敗,查看mysql日志如下報錯:

[InnoDB] [FATAL] Tablespace id is xx in the data dictionary but in file .\test\config.ibd it is xx!

這個錯誤意思就是庫名表名一致,但是表空間id已經(jīng)不同了,說明上面的執(zhí)行步驟有錯誤,導(dǎo)致表空間id記錄在兩個地方,一個在系統(tǒng)表空間中的字典表,一個記錄在表對應(yīng)的ibd文件里。這個時候,不管出于何種原因,ibd文件使用了舊文件,就會報這個錯誤。并且導(dǎo)致mysqld進程崩潰退出。

解決方法:

將對應(yīng)的庫中的某個表刪除,并重新生成表結(jié)構(gòu)并創(chuàng)建表,然后重新將原表結(jié)構(gòu)和表空間脫離并重新導(dǎo)入表空間,操作上面都有,重新執(zhí)行即可

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL的聯(lián)合索引范圍條件失效問題解決辦法

    MySQL的聯(lián)合索引范圍條件失效問題解決辦法

    在數(shù)據(jù)庫優(yōu)化中,索引是一項至關(guān)重要的技術(shù)手段,可以顯著提升查詢性能,下面這篇文章主要介紹了MySQL的聯(lián)合索引范圍條件失效問題解決的相關(guān)資料,文中介紹的非常非常詳細,需要的朋友可以參考下
    2026-04-04
  • Mysql使用sum()函數(shù)返回null的問題詳解

    Mysql使用sum()函數(shù)返回null的問題詳解

    MySQL的Sum()函數(shù)是用來找出所有記錄的一個字段的總和,下面這篇文章主要給大家介紹了關(guān)于Mysql使用sum()函數(shù)返回null的問題,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • MySQL服務(wù)維護筆記

    MySQL服務(wù)維護筆記

    MySQL服務(wù)維護筆記...
    2006-12-12
  • 小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)

    小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)

    這篇文章主要介紹了安裝登錄mysql-8.0.19-winx64的教程圖解,非常適合新手學(xué)習(xí)參考,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • MySQL中如何重建表

    MySQL中如何重建表

    這篇文章主要介紹了MySQL中如何重建表問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • MySQL數(shù)據(jù)類型全解析

    MySQL數(shù)據(jù)類型全解析

    這篇文章主要介紹了MySQL數(shù)據(jù)類型的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • 利用mycat實現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例

    利用mycat實現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例

    本篇文章主要介紹了利用mycat實現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例,mycat是最近很火的一款國人發(fā)明的分布式數(shù)據(jù)庫中間件,它是基于阿里的cobar的基礎(chǔ)上進行開發(fā)的,有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • mysql中數(shù)據(jù)統(tǒng)計的技巧備忘錄

    mysql中數(shù)據(jù)統(tǒng)計的技巧備忘錄

    mysql是常用數(shù)據(jù)庫,對于數(shù)字操作相關(guān)的東西相當(dāng)方便,這篇文章主要給大家介紹了關(guān)于mysql中數(shù)據(jù)統(tǒng)計技巧的相關(guān)資料,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • mysql server 5.7.20 安裝配置方法圖文教程

    mysql server 5.7.20 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql server 5.7.20 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • MySQL MEM_ROOT詳解及實例代碼

    MySQL MEM_ROOT詳解及實例代碼

    mysql中使用MEM_ROOT來做內(nèi)存分配的部分,這篇文章會詳細解說MySQL中使用非常廣泛的MEM_ROOT的結(jié)構(gòu)體,同時省去debug部分的信息,僅分析正常情況下。需要的朋友可以參考一下
    2016-11-11

最新評論

泰州市| 武安市| 越西县| 建昌县| 保靖县| 漳平市| 宁远县| 孙吴县| 西乌珠穆沁旗| 文成县| 舟山市| 博爱县| 南川市| 鄂州市| 长沙县| 开鲁县| 陆川县| 开鲁县| 昌邑市| 蛟河市| 广宁县| 绥中县| 松滋市| 大荔县| 台湾省| 万载县| 潞西市| 吉林省| 来安县| 台州市| 静安区| 乐陵市| 无棣县| 邵阳县| 南靖县| 华安县| 四子王旗| 广丰县| 当阳市| 敦化市| 建平县|