1.1. 场景

有的时候开放人员自己的库需要帮忙导一些数据,但是表的数据量又很大。虽然说使用mysqldump或mysqlpump也可以导。但是这耗时需要比较久。

记得之前建议开放人员可以直接使用navicat去抽取测试库的数据。但是发现但遇到大表的时候,发现navicat会卡死。

1.2. 使用方法

使用拷贝*.ibd的方法。

注意:使用这种方法会锁表。因为是测试库,对服务器有一些影响还是可以接受的。

1.3. 先决条件

前提必须开启innodb_file_per_table选项,并且使用InnoDB存储引擎:

1
set global innodb_file_per_table = 1;

1.4. 制造大表

下面我们制造表数据,下面模拟的数据比较小,主要是为了节省时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

USE test;
-- 创建表t1
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(
  id BIGINT unsigned NOT NULL AUTO_INCREMENT,
  x VARCHAR(500) NOT NULL,
  y VARCHAR(500) NOT NULL,
  PRIMARY KEY(id)
);
-- 创建添加数据存储过程
DROP PROCEDURE insert_batch;
DELIMITER //
CREATE PROCEDURE insert_batch()
begin
  DECLARE num INT;
  SET num=1;
  WHILE num < 1000000 DO
    IF (num%10000=0) THEN
      COMMIT;
    END IF;
    INSERT INTO t1 VALUES(NULL, REPEAT('X', 500), REPEAT('Y', 500));
    SET num=num+1;
  END WHILE;
  COMMIT;
END //
DELIMITER ;
-- 添加数据
CALL insert_batch();
DROP PROCEDURE insert_batch;

查看数据大小情况(磁盘上的数据大小)

1
2
3

ls -lh /u02/data/test/t1.*
-rw-r----- 1 mysql mysql 8.5K Mar 10 13:54 /u02/data/test/t1.frm
-rw-r----- 1 mysql mysql 1.2G Mar 10 14:20 /u02/data/test/t1.ibd

查看真实的大小情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

select count(*) from t1;
+----------+
| count(*) |
+----------+
|   999999 |
+----------+
SELECT table_name,
  data_length/1024/1024 AS 'data_length(MB)',
  index_length/1024/1024 AS 'index_length(MB)',
  (data_length + index_length)/1024/1024 AS 'total(MB)'
FROM information_schema.tables
WHERE table_schema='test'
  AND table_name = 't1';
+------------+-----------------+------------------+---------------+
| table_name | data_length(MB) | index_length(MB) | total(MB)     |
+------------+-----------------+------------------+---------------+
| t1         |   1048.00000000 |       0.00000000 | 1048.00000000 |
+------------+-----------------+------------------+---------------+

从上面可以看出在磁盘上的数据大小是1.2G,而实际的大小才1048MB(估计值),实际情况会比上面的数据大很多。

1.5. 将test.t1迁移到test2.t1中

1、test2库中创建和test.t1相同的表结构

1
2
3

CREATE DATABASE test2;
USE test2;
CREATE TABLE t1 LIKE test.t1;

2、废弃test2.t1表空间,等待新表空间导入

1
2

USE test2;
ALTER TABLE t1 DISCARD TABLESPACE;

3、锁表导出test.t1表元数据

1
2

USE test;
FLUSH TABLES t1 FOR EXPORT;

4、将test.t1表*.ibd和*.cfg文件拷贝到test2库中

1
2
3
4
5
6

cp t1.cfg /u02/data/test2/
cp t1.ibd /u02/data/test2/
ll -h /u02/data/test2/
-rw-r----- 1 root  root   424 Mar 10 14:41 t1.cfg
-rw-r----- 1 mysql mysql 8.5K Mar 10 14:33 t1.frm
-rw-r----- 1 root  root  1.2G Mar 10 14:41 t1.ibd

5、释放test.t1锁

1
2

USE test;
UNLOCK TABLES;

6、test2导入t1数据

1
2
3

chown -R mysql:mysql /u02/data/test2
USE test2;
ALTER TABLE t1 IMPORT TABLESPACE;

7、查看test2.t1数据

1
2
3
4
5
6
7

USE test2;
SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|   999999 |
+----------+

1.6. 总结

如果是数据量比较大,并且可以忍受对服务器有一点影响的,就可以考虑使用这种方法来处理。并且需要注意的是最好迁移的数据库版本是相同的。

转载于:https://www.cnblogs.com/DataArt/p/10231920.html

表迁移工具的选型-复制ibd的方法-传输表空间相关推荐

  1. 表迁移工具的选型-复制ibd的方法

    http://www.ttlsa.com/mysql/migration_tools_selected_3/ 转载于:https://www.cnblogs.com/littlehb/p/653011 ...

  2. revit2018注册表删除_Revit软件的彻底卸载方法 注册表卸载

    Revit软件的彻底卸载方法 注册表卸载 Revit 软件的彻底卸载方法 注册表卸载由于卸载不当导致 Revit 软件无法再次安装的事件已经发生了太多了,在这里小 Z 将完全卸载Revit 软件的方法 ...

  3. revit2018注册表删除_Revit软件的彻底卸载方法 注册表卸载 定稿.docx

    PAGE PAGE 2 Revit软件的彻底卸载方法 注册表卸载 由于卸载不当导致Revit软件无法再次安装的事件已经发生了太多了,在这里小Z将完全卸载Revit软件的方法分享给大家,希望对那些由于卸 ...

  4. mysql把一行保存到另一个表_MYSQL:如何复制整个行从一个表到另一个在MySQL与第二个表有一个额外的列?...

    为了完善Zed的答案,并回答你的评论: INSERT INTO dues_storage SELECT d.*, CURRENT_DATE() FROM dues d WHERE id = 5; 见T ...

  5. html表单input file,最简单的方法美化表单中input type=file元素

    今天2019-10-8日,国庆后第一天上班. 恩,早上列了下要做的东西,不至于长假后,啥都忘了,该走的路得继续走,该做的继续做. 回归正题,昨天做验证码识别表单时,发现 file 表单真是奇丑无比,琢 ...

  6. mysql 把一个字段的值_mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法...

    需求:把一个表某个字段内容复制到另一张表的某个字段. 实现sql语句1: UPDATE file_manager_folder f1 LEFT OUTER JOIN file_manager_fold ...

  7. eltable刷新整个表格方法_多个子表内容合并到总表,不用每次复制粘贴,全自动刷新...

    在我们工作中,经常会有多个表格分别录入数据,然后需要汇总到一块的情况 举一个例子,下面是模拟的数据,公司不同类目的3张销售表,分别是水果,3C,电器类目下的表格 我们需要汇总得到的结果是: 如果只是处 ...

  8. mysql frm ibd 创建表_MySQL数据库实现从.frm文件和.ibd文件恢复数据表方法

    MySQL中.frm文件:保存了每个表的元数据,包括表结构的定义等,该文件与数据库引擎无关. MySQL中.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_pe ...

  9. mysql表文件被删_mysql表物理文件被误删的解决方法

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

最新文章

  1. Android 使用adb 命令截图 的方法
  2. 解决sublime3不能编辑插件default settings的问题
  3. linux init配置文件说明
  4. 当数据处理做不到实时,应该怎么办?
  5. Android 手动解析JSON数据
  6. spring cloud微服务分布式云架构 - Spring Cloud集成项目简介( java ssm spring boot b2b2c o2o 多租户电子...
  7. Linux Unix shell 编程指南学习笔记(第二部分)
  8. 清零软件解决连供打印机喷嘴断墨和堵塞
  9. 为什么密度泛函理论 (DFT) 会低估带隙?
  10. Wpa_supplicant 调试故障原因分析
  11. 《天下强汉》6、西汉历史的最后一抹辉煌——绝域名将陈汤
  12. 启动Hadoop集群,出现Cannot set priority of nodemanager(resourcemanager) process xxx问题
  13. php英文星期中文星期,英文星期到星期天【星期一到星期天的英文用中文怎么说。发音标准的来。】...
  14. Java生成二维码带LOGO底部标题竖版字体
  15. 计算机组成原理alu_b什么意思,计算机组成原理实验三多功能ALU设计实验(5页)-原创力文档...
  16. 【软件测试及质量保证】小结
  17. 宝塔绑定域名访问不了_建站系列教程(二)--本地局域网访问和域名解析
  18. Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
  19. 英语语法笔记by英语兔
  20. android 九宫格转盘,vue组件实现移动端九宫格转盘抽奖

热门文章

  1. Ubuntu Linux 安装后,建立嵌入式开发环境
  2. Android:动态加载布局
  3. 叶明回归IBM 负责大中华区合作伙伴业务
  4. Eclipse(properties)插件:PropertyEditor在线安装
  5. Log4j 2使用教程转
  6. 引用借以记录借鉴 实现记住密码和自动登录功能
  7. [更正]谈获取当前系统类型(SP OR PPC)
  8. vscode 免费视频教程
  9. 吴恩达:现在很多所谓的AI公司,其实都不是AI公司
  10. Update语句:使用case when按条件批量更新