文章目录
一、说明
将 *.frm
、*.ibd
文件恢复到Mysql中,主要过程可以分两步:
(1):恢复表结构
- 不知道表构结构的(如果不知道create table,则需要一些复杂操作得到create table 的SQL )
- 知道表结构的(如果知道的create table,则操作步骤简单)
(2):恢复表数据 (首先需要解除当前创建的表与 .ibd文件间的关系,接着将要恢复数据表的.ibd文件与当前创建的表关联起来)
二、恢复表结构
2.1、创建数据库
此步骤省略。
2.2、示例说明
待恢复的数据在目录 /mnt/mariadb/data/xxx_pc
mysql 的数据目录在 /var/lib/mysql/xxx_pc
说明: xxx_pc
是数据库的名字。
2.3 、得到表结构的SQL(如果不知道create table)
mysql 从 frm 文件恢复 table 表结构的3种方法: https://blog.csdn.net/xiaojin21cen/article/details/103971628
通过此文,可以得到 create table 的SQL。
2.4 、创建表结构(已经知道create table)
以 pms_product
表为例,
DROP TABLE IF EXISTS `pms_product`;
CREATE TABLE `pms_product` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`product_category_id` bigint(20) DEFAULT NULL COMMENT '产品分类',
`product_attribute_refer_id` varchar(100) DEFAULT '' COMMENT '与pms_product_attrbute表的关联',
`pname` varchar(100) NOT NULL DEFAULT '' COMMENT '产品名称',
`price` decimal(10,2) DEFAULT NULL COMMENT '价格(单价)',
`total_count` int(11) DEFAULT NULL COMMENT '总数量',
`sales_count` int(11) DEFAULT NULL COMMENT '已销售数量',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) engine=InnoDB row_format=COMPACT;
说明:
- 此处的列名 中是一个
占位符
, 只要有列数对应上即可,不要求列名一致。 - 表结构的
engine=InnoDB row_format=COMPACT;
是固定的。其他的不需要添加。
比如说表的主键是自增的,是否要加上auto_increment=1
? 答是完全不需要的。
三、恢复表数据
3.1、删除新建表的表空间
alter table pms_product discard tablespace;
此SQL的作用是 删除 /var/lib/mysql/xxx_pc
目录下的 pms_product.ibd
文件。
3.2、将待恢复的 *.ibd
文件复制到Mysql 数据目录下
复制 pms_product.ibd
文件到Mysql 数据目录下。 sh 命令:
cp /mnt/mariadb/data/_pc/pms_product.ibd /var/lib/mysql/xxx_pc/
修改 pms_product.ibd
文件的所有者为 mysql。sh 命令 :
chown -R mysql.mysql pms_product.ibd
3.3、将新的表空间与表结构进行绑定
sql 脚本:
alter table pms_product import tablespace;
四、测试
查询导入的数据
select * from pms_product;
五、总结
DROP TABLE IF EXISTS `pms_product`;
CREATE TABLE `pms_product` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`product_category_id` bigint(20) DEFAULT NULL COMMENT '产品分类',
`product_attribute_refer_id` varchar(100) DEFAULT '' COMMENT '与pms_product_attrbute表的关联',
`pname` varchar(100) NOT NULL DEFAULT '' COMMENT '产品名称',
`price` decimal(10,2) DEFAULT NULL COMMENT '价格(单价)',
`total_count` int(11) DEFAULT NULL COMMENT '总数量',
`sales_count` int(11) DEFAULT NULL COMMENT '已销售数量',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) engine=InnoDB row_format=COMPACT;
alter table pms_product discard tablespace ;
# sh 命令
cp /mnt/mariadb/data/xxx_pc/pms_product.ibd /var/lib/mysql/xxx_pc/
chown -R mysql.mysql pms_product.ibd
alter table pms_product import tablespace;;
select * from pms_product;
上面是恢复数据所涉及到所有的sql、sh命令。
如果在恢复同一个数据库的数据,只需要修改 表名 和 列名,上面的脚本可以重复使用了。