欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL利用frm文件和ibd文件恢復表結構和表數(shù)據(jù)

 更新時間:2024年05月20日 10:56:21   作者:月巴左耳東  
當MySQL數(shù)據(jù)庫遭遇崩潰或數(shù)據(jù)丟失時,利用備份的 .frm 和 .ibd 文件恢復數(shù)據(jù)是一種有效的解決方案,.frm 文件包含表的結構信息,而 .ibd 文件則存儲表的實際數(shù)據(jù),本文將提供一個詳細的步驟指南,演示如何利用這些文件恢復MySQL表數(shù)據(jù)和表結構,需要的朋友可以參考下

frm文件和ibd文件簡介

  • 在MySQL中,使用默認的存儲引擎innodb創(chuàng)建一張表,那么在庫名文件夾下面就會出現(xiàn)表名.frm表名.ibd兩個文件
    • ibd文件是innodb的表數(shù)據(jù)文件
    • frm文件是innodb的表結構文件
      • 需要注意的是,frm文件ibd文件都是不能直接打開
      • 恢復數(shù)據(jù)之前,需要先恢復表結構
    • 在有建表語句的前提下,可以直接跳到ibd文件恢復表數(shù)據(jù),不需要使用frm文件恢復表結構

frm文件恢復表結構

  • 前提是已經(jīng)備份了對應的frm文件
  • 建議重新啟動一個MySQL實例,待數(shù)據(jù)恢復后,通過mysqldump備份數(shù)據(jù),再重新恢復到需要使用的數(shù)據(jù)庫里
  • 在新啟動的實例上創(chuàng)建一個同名的表,例如study.frm,表示表名稱為study
    • 在不知道表結構的情況下,可以先定義一個字段,稍后可以通過mysql.err日志內(nèi)查看表字段的數(shù)量
create table study (id int);
  • 創(chuàng)建完表后,在對應的數(shù)據(jù)目錄下就會生成study.frmstudy.ibd文件,然后使用之前備份的study.frm來替換現(xiàn)有的study.frm,切記,不要著急替換study.ibd文件,這個文件在恢復表結構后再使用
    • 注意替換文件后的study.frm文件的權限,確保和其他文件的屬主和屬組是一樣的
    • 重啟mysql數(shù)據(jù)庫

查看日志

grep study mysql.err | grep columns

容器啟動的MySQL,直接使用docker restart <容器id>來重啟MySQL服務

如果是容器啟動的MySQL,可以使用下面的命令在容器外查看日志

docker logs <容器id> | grep study | grep columns
  • 通過日志,我們可以看到,study這個表,之前有5個字段,但是我們現(xiàn)在只有1個字段
[Warning] InnoDB: Table hello@002dworld/study contains 1 user defined columns in InnoDB, but 5 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.
  • 這個時候,我們可以把原來的表刪掉
drop table study;
  • 然后重新創(chuàng)建一個和原來的表相同字段的表,切記,表名稱要一樣,字段內(nèi)容不重要,只需要字段數(shù)量一致
create table study (id1 int,id2 int,id3 int,id4 int,id5 int);
  • 現(xiàn)在可以看到我們的建表語句了,當然,這個是上面使用的建表語句,咱們繼續(xù)往下
show create table study\G
*************************** 1. row ***************************
       Table: study
Create Table: CREATE TABLE `study` (
  `id1` int(11) DEFAULT NULL,
  `id2` int(11) DEFAULT NULL,
  `id3` int(11) DEFAULT NULL,
  `id4` int(11) DEFAULT NULL,
  `id5` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
  • 確認是否開啟了innodb_force_recovery參數(shù),正常情況下,如果不是為了恢復數(shù)據(jù)是不會開啟這個參數(shù)的
    • innodb_force_recovery 參數(shù)需要配置到 my.cnf 中的 [mysqld] 模塊下,取值范圍是0-6, 默認是0
    • 1: (SRV_FORCE_IGNORE_CORRUPT): 忽略檢查到的corrupt頁
    • 2: (SRV_FORCE_NO_BACKGROUND): 阻止主線程的運行,如主線程需要執(zhí)行full purge操作,會導致crash
    • 3: (SRV_FORCE_NO_TRX_UNDO): 不執(zhí)行事務回滾操作
    • 4: (SRV_FORCE_NO_IBUF_MERGE): 不執(zhí)行插入緩沖的合并操作
    • 5: (SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日志,InnoDB存儲引擎會將未提交的事務視為已提交
    • 6: (SRV_FORCE_NO_LOG_REDO): 不執(zhí)行前滾的操作
    • 當設置參數(shù)值大于0后,可以對表進行selectcreate、drop操作,但insert、update或者delete這類操作是不允許的
grep 'innodb_force' my.cnf
  • 插入配置到my.cnf配置文件中,然后再次替換study.frm文件,并重啟MySQL服務
    • 注意替換文件后的study.frm文件的權限,確保和其他文件的屬主和屬組是一樣的
sed -i '/\[mysqld\]/a\innodb_force_recovery=6' my.cnf
  • 重啟完成后,再次查看建表語句
show create table study\G
*************************** 1. row ***************************
       Table: study
Create Table: CREATE TABLE `study` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `time` int(11) DEFAULT NULL,
  `lang` varchar(20) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
  • 到這里,我們已經(jīng)成功找回之前的建表語句了,通過這個語句,就可以恢復之前的表了
    • 復制獲取的建表語句,注釋掉之前的innodb_force_recovery參數(shù),并且重啟MySQL服務
sed -i '/innodb_force_recovery/s/^\(.*\)$/#\1/g' my.cnf
  • 再次刪掉study這個表
drop table study;
  • 然后使用上面獲取到的建表語句重新建表,注意最后加上一個分號,這是SQL的語法格式
CREATE TABLE `study` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `time` int(11) DEFAULT NULL,
  `lang` varchar(20) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

ibd文件恢復表數(shù)據(jù)

  • 在有建表語句的情況下,使用idb文件恢復數(shù)據(jù),相比使用frm文件恢復表數(shù)據(jù)要簡單方便很多

  • 刪除當前的ibd文件

alter table study discard tablespace;
  • 將之前備份的study.ibd文件復制到對應的數(shù)據(jù)目錄下,使用下面的命令將數(shù)據(jù)加載到MySQL數(shù)據(jù)庫里
    • 注意替換文件后的study.ibd文件的權限,確保和其他文件的屬主和屬組是一樣的
alter table study import tablespace;
  • 再次查看數(shù)據(jù)表,發(fā)現(xiàn)之前的數(shù)據(jù)也回來了
select * from study;
+------+------+------+----------+---------+
| id   | name | age  | time     | lang    |
+------+------+------+----------+---------+
|    1 | tom  |   26 | 20211024 | chinese |
+------+------+------+----------+---------+
  • 記得備份數(shù)據(jù),數(shù)據(jù)是無價的

通過腳本利用ibd文件恢復數(shù)據(jù)

前提是表結構是存在的
注意自己的數(shù)據(jù)庫是否區(qū)分大小寫,以及表名稱是否有大小寫,如果表名稱有大小寫,新啟動的mysql一定要開啟大小寫[開啟大小寫參數(shù):lower_case_table_names = 0]
mysql_user變量的值為mysql數(shù)據(jù)目錄的屬主和屬組
根據(jù)實際場景修改mysql_cmd變量的值,修改成自己用戶名用戶密碼,主機ip
mysql_data_dir變量的值為mysql數(shù)據(jù)存儲路徑
back_data_dir變量的值為備份下來的ibd文件存儲路徑

#!/bin/bash
base_dir=$(cd `dirname $0`; pwd)
mysql_user='mysql'
mysql_cmd="mysql -N -uroot -proot -h192.168.70.49"
databases_list=($(${mysql_cmd} -e 'SHOW DATABASES;' | egrep -v 'information_schema|mysql|performance_schema|sys'))
mysql_data_dir='/var/lib/mysql'
back_data_dir='/tmp/back-data'

for (( i=0; i<${#databases_list[@]}; i++ ))
do
  tables_list=($(${mysql_cmd} -e "SELECT table_name FROM information_schema.tables WHERE table_schema=\"${databases_list[i]}\";"))
  database_name=${databases_list[i]/-/@002d}

  for (( table=0; table<${#tables_list[@]}; table++ ))
  do
    ${mysql_cmd} -e "alter table \`${databases_list[i]}\`.${tables_list[table]} discard tablespace;"
    rm -f ${mysql_data_dir}/${database_name}/${tables_list[table]}.ibd
    cp ${back_data_dir}/${database_name}/${tables_list[table]}.ibd ${mysql_data_dir}/${database_name}/
    chown -R ${mysql_user}.${mysql_user} ${mysql_data_dir}/${database_name}/
    ${mysql_cmd} -e "alter table \`${databases_list[i]}\`.${tables_list[table]} import tablespace;"
    sleep 5
  done
done

通過shell腳本導出mysql所有庫的所有表的表結構

mysql_cmddump_cmd的變量值根據(jù)實際環(huán)境修改,修改成自己用戶名用戶密碼,主機ip
databases_list只排除了mysql的系統(tǒng)庫,如果需要排除其他庫,可以修改egrep -v后面的值
導出的表結構以庫名來命名,并且加入了CREATE DATABASE IF NOT EXISTS語句

#!/bin/bash
base_dir=$(cd `dirname $0`; pwd)
mysql_cmd="mysql -N -uroot -proot -h192.168.70.49"
dump_cmd="mysqldump -uroot -proot -h192.168.70.49"
databases_list=($(${mysql_cmd} -e 'SHOW DATABASES;' | egrep -v 'information_schema|mysql|performance_schema|sys'))

for (( i=0; i<${#databases_list[@]}; i++ ))
do
  tables_list=($(${mysql_cmd} -e "SELECT table_name FROM information_schema.tables WHERE table_schema=\"${databases_list[i]}\";"))

  [[ ! -f "${base_dir}/${databases_list[i]}.sql" ]] || rm -f ${base_dir}/${databases_list[i]}.sql
  echo "CREATE DATABASE IF NOT EXISTS \`${databases_list[i]}\`;" >> ${base_dir}/${databases_list[i]}.sql
  echo "USE \`${databases_list[i]}\`;" >> ${base_dir}/${databases_list[i]}.sql

  for (( table=0; table<${#tables_list[@]}; table++ ))
  do
    ${dump_cmd} -d ${databases_list[i]} ${tables_list[table]} >> ${base_dir}/${databases_list[i]}.sql
  done
done

以上就是MySQL利用frm文件和ibd文件恢復表結構和表數(shù)據(jù)的詳細內(nèi)容,更多關于MySQL frm ibd恢復表結構和數(shù)據(jù)的資料請關注腳本之家其它相關文章!

相關文章

  • jdbc連接mysq之serverTimezone設定方式

    jdbc連接mysq之serverTimezone設定方式

    這篇文章主要介紹了jdbc連接mysq之serverTimezone設定方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL字符集 GBK、GB2312、UTF8區(qū)別 解決MYSQL中文亂碼問題

    MySQL字符集 GBK、GB2312、UTF8區(qū)別 解決MYSQL中文亂碼問題

    MYSQL中文亂碼問題原因有很多,腳本之家以前發(fā)布過很多相關文章,這篇文章介紹mysql相關的一些知識更詳細
    2012-08-08
  • MySQL隱式類型的轉換陷阱和規(guī)則

    MySQL隱式類型的轉換陷阱和規(guī)則

    這篇文章先是通過一個實例給大家講述在MySQL隱式類型的轉換時遇到的陷阱,而后給大家介紹了MySQL隱式類型的規(guī)則,對大家操作mysql隱式類型的時候具有一定的參考借鑒價值,下面來一起看看吧。
    2016-09-09
  • MySQL中的常用函數(shù)及用法總結

    MySQL中的常用函數(shù)及用法總結

    MySQL是一種常用的關系型數(shù)據(jù)庫管理系統(tǒng),它提供了許多內(nèi)置函數(shù)來處理數(shù)據(jù),本文將介紹MySQL中的各種常用函數(shù),包括字符串函數(shù)、日期函數(shù)、數(shù)學函數(shù)、聚合函數(shù)等,需要的朋友可以參考下
    2023-06-06
  • MySQL中dd::columns表結構轉table過程及應用詳解

    MySQL中dd::columns表結構轉table過程及應用詳解

    MySQL的dd表是用來存放表結構和各種建表信息的,客戶端建的表都存在mysql.table和mysql.columns表里,還有一個表mysql.column_type_elements比較特殊,用來存放SET和ENUM類型的字段集合值信息,對mysql dd::columns表結構相關知識感興趣的朋友一起看看吧
    2022-09-09
  • mysql的innodb和myisam的區(qū)別及說明

    mysql的innodb和myisam的區(qū)別及說明

    這篇文章主要介紹了mysql的innodb和myisam的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • MySql如何使用not in實現(xiàn)優(yōu)化

    MySql如何使用not in實現(xiàn)優(yōu)化

    這篇文章主要介紹了MySql如何使用not in實現(xiàn)優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • MySQL case when使用方法實例解析

    MySQL case when使用方法實例解析

    這篇文章主要介紹了MySQL case when使用方法實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Mysql8.0使用窗口函數(shù)解決排序問題

    Mysql8.0使用窗口函數(shù)解決排序問題

    窗口的概念非常重要,它可以理解為記錄集合,窗口函數(shù)也就是在滿足某種條件的記錄集合上執(zhí)行的特殊函數(shù)。這篇文章主要介紹了Mysql8.0使用窗口函數(shù)解決排序問題,需要的朋友可以參考下
    2020-01-01
  • 淺談一下mysql數(shù)據(jù)庫底層原理

    淺談一下mysql數(shù)據(jù)庫底層原理

    這篇文章主要介紹了淺談一下mysql數(shù)據(jù)庫底層原理,介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論