MySQL innodb表使用表空间物理文件复制或迁移表
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表使用表空间物理文件复制或迁移表的更多相关文章
- mysql分区功能(三个文件储存一张表)(分区作用)(分区方式)
mysql分区功能(三个文件储存一张表)(分区作用)(分区方式) 一.总结 1.mysql数据表的存储方式(三个文件储存一张表): 一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放 ...
- oracle查看表空间物理文件的名称,路径及大小
select tablespace_name, file_id,file_name,round(bytes/(1024*1024),0) total_space from dba_data_files ...
- 误删mysql表物理文件的解决方法(不涉及恢复数据)
该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 并且是适用于平时没有全备的情况下 如果有全备 直接那全备的frm和idb文件放 ...
- MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是 ...
- MySQL InnoDB与MyISAM存储引擎差异
言: 之前简单介绍过 MySQL 常用的存储引擎,今天对两个主流的存储简单分析下差异,书上没有参考的笔试题解答注解: 差异: MyISAM 只支持表锁,不支持事务,表损坏率较高.较老的存储引擎. ...
- MySql InnoDb还原工具
通过任意文件下载找到了mysql的备份,表类型是独享式innodb,由一个frm文件和一个ibd文件组成. 本以为直接复制到本地的mysql数据目录中即可恢复数据,但在查询时却发现并不如所愿: mys ...
- mysql innodb 数据打捞(一)innodb 页面结构特征
如果文件系统损坏或意外删除了数据库文件,只要磁盘空间没有被覆盖,其实数据都还在磁盘的扇区中,还是可以恢复出来的,有些通用的文件恢复工具好象也可以恢复文件 ,但这里要研究的是在通用文件 恢复工具失效的时 ...
- mysql innodb数据库损坏导致无法启动
生产环境中的mysql突然启动不了,查了原因是innodb库错误,以前就遇到过这个问题,稀里糊涂的没解决,结果导致大量数据丢失.这些又遇到这个问题,果断把那个有问题的数据库移动了别的地方,启动了mys ...
- 利用拷贝data目录文件的方式迁移mysql数据库
其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库, 但是这次数据文件过大,大约有40个G,使用命令行导入,效果不是很好,经常在执行过程中报错.卡死 ...
随机推荐
- 使用react context实现一个支持组件组合和嵌套的React Tab组件
纵观react的tab组件中,即使是github上star数多的tab组件,实现原理都非常冗余. 例如Github上star数超四百星的react-tab,其在render的时候都会动态计算哪个tab ...
- 转:如何在ArcMap下将栅格图象矢量化的基本步骤 (对影像的校准和配准、栅格图象矢量化)
矢量对象是以矢量的形式,即用方向和大小来综合表示目标的形式描述的对象.例如画面上的一段直线,一个矩形,一个点,一个圆,一个填充的封闭区域--等等. 矢量图形文件就是由这些矢量对象组合而成的描述性文件. ...
- css 字体样式设置大全
css样式大全(整理版) 字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 { ...
- Windows7建立无线热点
很实用的技巧,加以记录. 最初我是想使用connectify的,不过安装这个软件之后,发现有线账号登不上了,所以就选择使用Windows7自带的工具了. 首先以管理员身份运行cmd. 进入之后cd到c ...
- TP5.0:访问不同模块方法,跳转视图页面
我们在开发项目时,都会给每个项目加上基本的后台管理页面,并命名为admin 那么,我们在添加admin后台模块后,怎么通过url访问admin后台模块文件代码呢? 1.访问admin模块默认文件的UR ...
- 关于GitHubGit
一.Github项目地址:https://github.com/gyguyt/Helloworld123 二.什么是Github? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或 ...
- 初识Scrum
团队作业起步 一.团队 队名:想吃蛋炒饭 成员: 许俊杰 肖豪雄 王重和 罗艺璇 曾舒妮 也许是我们队长的人的博客:许俊杰的博客 二.Scrum学习心得 Scrum是迭代式增量软件开发过程,通常用于敏 ...
- NO.007-2018.02.12《白头吟》两汉:卓文君
白头吟_古诗文网_解析_鉴赏_赏析 白头吟 两汉:卓文君 白头吟:乐府<楚调曲>调名.据<西京杂记>卷三载,蜀地巨商卓王孙的女儿卓文君,聪明美丽,有文采,通音乐.孀居在家时,与 ...
- note04-计算机网络
4.WLAN无线局域网(wareless local area network) IEEE802.11无线以太网协议标准 基础服务集合BSS 基站AP 服务服务集合标识SSID 即wifi名 分配系统 ...
- Android(java)学习笔记20:UDP协议发送数据
1. UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: package cn.itcast_02; import java.io.IOException; import java.net ...