MySQL InnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种:

  • 将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件
  • 直接拷贝innodb的表空间文件(前提是独立表空间(默认,通过show variables like 'innodb_file_per_table' 查看))进行复制

一、修改引擎

1.创建一张innodb引擎的表,并插入测试数据;

create table test_tb(id int primary key,c1 varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test_tb select 1,'c1';
insert into test_tb select 2,'c2';

2. 修改引擎

alter table test_tb engine=myisam;
show create table test_tb\G

3. 将物理文件拷贝至目标库

cd /data/mysql/mysql3307/data/
cd testdb
ll
cd ../testdb2/
pwd
ll
cp ../testdb/test_tb.* .
ll

4.修改权限

chown -R mysql:mysql .

5. 查看结果

记录和源库一致。

6. 将源库及目标库的表引擎修改为innodb

alter table testdb.test_tb engine=innodb;
alter table testdb2.test_tb engine=innodb;

二、拷贝.idb物理表空间文件

1.  创建一张innodb的表,为了测试大表的情况,我创建了一张800W记录的表,占用940M空间

/*先创建快速生成连续数的表及存储过程*/

-- 建表
CREATE TABLE `test_tb2` (
`id` int(11) DEFAULT NULL,
`aa` varchar(20) DEFAULT NULL,
`bb` varchar(20) DEFAULT NULL,
`cc` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --创建过程
DELIMITER $$
CREATE PROCEDURE `sp_test_tb2`(cnt INT )
BEGIN
DECLARE i INT DEFAULT 1;
TRUNCATE TABLE test_tb2;
INSERT INTO test_tb2 SELECT concat(i,'a'),concat(i,'b'),concat(i,'c') ;
WHILE i < cnt DO
BEGIN
INSERT INTO test_tb2 SELECT id + i,concat(id+i,'a'),concat(id+i,'b'),concat(id+i,'c') FROM test_tb2 WHERE id + i<=cnt;
SET i = i*2;
END;
END WHILE;
END$$ DELIMITER ;
-- 生成8000000条记录
call sp_test_tb2(8000000); select count(*) from test_tb2;

2. 在目标库创建相同的表名

mysql> use testdb2;

 CREATE TABLE `test_tb2` (
`id` int(11) DEFAULT NULL,
`aa` varchar(20) DEFAULT NULL,
`bb` varchar(20) DEFAULT NULL,
`cc` varchar(20) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 删除目标表的表空间

alter table test_tb2 discard tablespace;

此时目标库的test_tb2表近剩下数据定义文件,表空间文件已删除

4. 拷贝源库的idb文件

/**  需先flush table */
flush table test_tb2 for export ;

之后拷贝(会生成一个cfg文件 也一并拷贝过去)

拷贝完成后需解锁test_tb2表

unlock tables;

5. 修改表空间文件权限

6. 目标表导入表空间数据(记录较多的时候需要一点时间)

alter table test_tb2 import tablespace;

7. 查看导入结果

结果与源表一致

Tips:

以上2种处理方式都需要源表无写入更新等操作下进行,且需要flush tables 将数据刷新到物理磁盘的文件上。所以建议先锁表或停止业务,待拷贝文件后再恢复写入等操作。

耿小厨已开通个人微信公众号,想进一步沟通或想了解其他文章的同学可以关注我

MySQL innodb表使用表空间物理文件复制或迁移表的更多相关文章

  1. mysql分区功能(三个文件储存一张表)(分区作用)(分区方式)

    mysql分区功能(三个文件储存一张表)(分区作用)(分区方式) 一.总结 1.mysql数据表的存储方式(三个文件储存一张表): 一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放 ...

  2. oracle查看表空间物理文件的名称,路径及大小

    select tablespace_name, file_id,file_name,round(bytes/(1024*1024),0) total_space from dba_data_files ...

  3. 误删mysql表物理文件的解决方法(不涉及恢复数据)

    该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm和idb文件放 ...

  4. MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)

    网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...

  5. MySQL InnoDB与MyISAM存储引擎差异

    言: 之前简单介绍过 MySQL 常用的存储引擎,今天对两个主流的存储简单分析下差异,书上没有参考的笔试题解答注解: 差异: MyISAM 只支持表锁,不支持事务,表损坏率较高.较老的存储引擎.   ...

  6. MySql InnoDb还原工具

    通过任意文件下载找到了mysql的备份,表类型是独享式innodb,由一个frm文件和一个ibd文件组成. 本以为直接复制到本地的mysql数据目录中即可恢复数据,但在查询时却发现并不如所愿: mys ...

  7. mysql innodb 数据打捞(一)innodb 页面结构特征

    如果文件系统损坏或意外删除了数据库文件,只要磁盘空间没有被覆盖,其实数据都还在磁盘的扇区中,还是可以恢复出来的,有些通用的文件恢复工具好象也可以恢复文件 ,但这里要研究的是在通用文件 恢复工具失效的时 ...

  8. mysql innodb数据库损坏导致无法启动

    生产环境中的mysql突然启动不了,查了原因是innodb库错误,以前就遇到过这个问题,稀里糊涂的没解决,结果导致大量数据丢失.这些又遇到这个问题,果断把那个有问题的数据库移动了别的地方,启动了mys ...

  9. 利用拷贝data目录文件的方式迁移mysql数据库

    其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库, 但是这次数据文件过大,大约有40个G,使用命令行导入,效果不是很好,经常在执行过程中报错.卡死 ...

随机推荐

  1. matlab练习程序(随机游走图像)

    随机游走类似布朗运动,就是随机的向各个方向走吧. 虽然代码没什么技术含量,不过产生的图像实在太漂亮了,所以还是贴上来吧. 产生的图像: matlab代码如下: clear all;close all; ...

  2. 关于Visio的vba操作,遍历目录,对所有vsd文件操作,导入excel文件

    1.vba遍历要添加引用,runtime 2.不能打开单独的application,因为在获取到shape的picture属性时候,新打开的application不能够获取到.提示自动化错误. 3.定 ...

  3. Selenium2学习(九)-- 多窗口,句柄(handle)

    前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 一.认识多窗 ...

  4. how reset smartphone data.

    question:how  reset  meizu smartphone solution one:hard step 1. power off your MEIZU smartphone. ste ...

  5. 查看锁定的session信息脚本

    查看当前被阻塞的对象和锁信息SELECT DISTINCT       s1.inst_id BlockingInst,       s1.sid BlockingSid,       s1.seri ...

  6. wmware共享磁盘redhat 5.8挂载问题

    需要修改参数vi /etc/sysconfig/selinux将SELINUX=enforcing改为SELINUX=disabled,这样重启服务器则不会启动selinux服务 不然重启虚拟机后共享 ...

  7. 简单的PHP算法题

    简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...

  8. PIL 一秒切九图 朋友圈发图神器

    注意图片像素返回值是(宽度,高度),pil填像素点坐标原点左上角. 判断像素点是否在圆方程中. import numpy as np from PIL import Image file = inpu ...

  9. Python语言程序设计基础(2)—— Python程序实例解析

    温度转换 def tempConvert(ValueStr): if ValueStr[-1] in ['F','f']: ans = (eval(ValueStr[0:-1]) - 32)/1.8 ...

  10. ASP.NET整体运行机制+asp.net请求管道+页面生命周期+MVC整体运行机制原理图

    在网上找的,个人感觉很好的