Docker MySQL從.frm和.ibd文件恢復數據

啓動MYSQL Docker容器

docker run -d -e REPLICATION_MASTER=true -e REPLICATION_PASS=admin -e MYSQL_PASS=USER_PASS -e MYSQL_USER=USER_NAME -p 3306:3306 -v /root/mysql/sock/master:/var/run/mysqld -v /root/mysql/data/master:/var/lib/mysql --name mysql wxsc/mysql:5.6

鏈接MYSQL容器

mysql -h MYSQL_IP -u USER_NAME -p

創建同名數據庫

MySQL [(none)]> create database DATABASE_NAME;

創建同名表

MySQL [(none)]> use DATABASE_NAME;
MySQL [(DATABASE_NAME)]> CREATE TABLE TABLE_NAME(a int)ENGINE=InnoDB;

恢復表結構

1、關閉容器

docker kill CONTAINER_ID

2、替換FRM文件

rm -rf  /root/mysql/data/master/DATABASE_NAME/TABLE_NAME.frm
cp ORIG_TABLE_NAME.frm /root/workspace/mysql/data/master/DATABASE_NAME
chown -R [用戶]:[組] ORIG_TABLE_NAME.frm

3、重啓容器

docker start CONTAINER_ID

4、獲取表結構

mysql -h MYSQL_IP -u USER_NAME -p
MySQL [(DATABASE_NAME)]> desc TABLE_NAME;

5、查看容器日誌

docker logs CONTAINER_ID
錯誤信息:
InnoDB: table DATABASE_NAME/TABLE_NAME contains 1 user defined columns in InnoDB, but 20 columns in MySQL. 

發現原表擁有20個字段

6、刪除當前表,新建一張擁有20個字段的同名表

MySQL [(DATABASE_NAME)]> drop table TABLE_NAME;

CREATE TABLE TABLE_NAME (a1 int,a2 int,a3 int,a4 int,a5 int,a6 int,a7 int,a8 int,a9 int,a10 int,a11 int,a12 int,a13 int,a14 int,a15 int,a16 int,a17 int,a18 int,a19 int,a20 int)ENGINE=InnoDB;

7、修改my.cnf

docker exec -ti CONTAINER_ID /bin/bash
root@CONTAINER_ID:/# vi /etc/mysql/my.cnf
在[mysqld]下添加
innodb_force_recovery=6

8、重新替換FRM文件

rm -rf  /root/mysql/data/master/DATABASE_NAME/TABLE_NAME.frm
cp ORIG_TABLE_NAME.frm /root/workspace/mysql/data/master/DATABASE_NAME
chown -R [用戶]:[組] ORIG_TABLE_NAME.frm

9、重啓容器,備份表結構

docker restart CONTAINER_ID
MySQL [(DATABASE_NAME)]> desc TABLE_NAME;
mysqldump -hMYSQL_IP -uUSER_NAME -pUSER_PASS DATABASE_NAME TABLE_NAME> /root/DATABASE_NAME/TABLE_NAME_table.sql

恢復表數據

1、修改my.cnf

docker exec -ti CONTAINER_ID /bin/bash
root@CONTAINER_ID:/# vi /etc/mysql/my.cnf
在[mysqld]下注釋
# innodb_force_recovery=6

2、重啓容器,導入表結構

docker restart CONTAINER_ID
MySQL [(DATABASE_NAME)]> source /root/DATABASE_NAME/TABLE_NAME_table.sql;

3、分離表空間

MySQL [(DATABASE_NAME)]> ALTER TABLE TABLE_NAME DISCARD TABLESPACE;

4、替換IBD文件

cp ORIG_TABLE_NAME.ibd /root/workspace/mysql/data/master/DATABASE_NAME
chown -R [用戶]:[組] ORIG_TABLE_NAME.ibd

5、建立新的連接

MySQL [(DATABASE_NAME)]> ALTER TABLE TABLE_NAME IMPORT TABLESPACE;

6、備份表

mysqldump -hMYSQL_IP -uUSER_NAME -pUSER_PASS DATABASE_NAME TABLE_NAME> /root/DATABASE_NAME/TABLE_NAME.sql
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章