1.1. 场景

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

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

1.2. 使用方法

使用拷贝*.ibd的方法。

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

1.3. 先决条件

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

set global innodb_file_per_table = 1;
 

1.4. 制造大表

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

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;

 

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

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
 

查看真实的大小情况

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相同的表结构

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

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

USE test2;
ALTER TABLE t1 DISCARD TABLESPACE;
   

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

USE test;
FLUSH TABLES t1 FOR EXPORT;
 

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

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锁

USE test;
UNLOCK TABLES;
 

6、test2导入t1数据

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

7、查看test2.t1数据

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

1.6. 总结

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

表迁移工具的选型-复制ibd的方法的更多相关文章

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

    1.1. 场景 有的时候开放人员自己的库需要帮忙导一些数据,但是表的数据量又很大.虽然说使用mysqldump或mysqlpump也可以导.但是这耗时需要比较久. 记得之前建议开放人员可以直接使用na ...

  2. 表迁移工具的选型-xtrabackup的使用

    1.1. 场景 有的时候test人员可能需要在测试库上比较新的数据,这时候只能是从生产库上面去那了.如果是小表还好实用mysqldump/mysqlpump就可以轻松的解决.但是,如果遇到了大表这将是 ...

  3. SQL数据库中把一个表中的数据复制到另一个表中

    1.如果是整个表复制表达如下: insert into table1 select  * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colu ...

  4. SSH框架的多表查询和增删查改 (方法一)中

    原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html   这边文章是接的刚刚前一遍的基础上敲的  ...

  5. MYSQL数据表损坏的原因分析和修复方法小结

    MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...

  6. mysql表单输入数据出现中文乱码解决方法

    MySQL会出现中文乱码的原因在于1.server本身设定问题,一般来说是latin1 2.建库建表时没有制定编码格式. 解决方法: 1.建库的时候 CREATE DATABASE test CHAR ...

  7. 【SQLServer】“无法对数据库’XXX’ 执行删除,因为它正用于复制”的解决方法

    警告: 一个或多个现有列的 ANSI_PADDING 设置为 "off",将以 ANSI_PADDING 为 "on" 的设置重新创建 [SQLServer]& ...

  8. asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

    MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交

  9. jQuery Validate 表单验证插件----自定义一个验证方法

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

随机推荐

  1. mvc 中Range中max和min值晚绑定

    对于Attribute : Range(min,max)的min和max必须在用的时候给,但是需求有时须要把这两个值存db.动态取出的.这时就须要razor帮忙了: @Html.TextBoxFor( ...

  2. 迪杰斯特拉/dijkstra 算法模板(具体凝视)

    #include <iostream> #include <malloc.h> #include <cstring> #include <stack> ...

  3. sharepoint 2013 使用SharePoint powershell 2013更改搜索server方法

    $hostA = Get-SPEnterpriseSearchServiceInstance -Identity "DevSearch2013" Start-SPEnterpris ...

  4. IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)

    在IIS中  依次运行例如以下操作: 站点--编辑权限--共享(为了方便能够直接将分享对象设置为everyone)--安全(直接勾选 everyone )--应用--确定.

  5. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  6. myeclipse无法导入项目

    MyEclipse无法导入Java项目时常遇到的两种情况: 1.Some projects cannot be imported because they already exist in the w ...

  7. 【java】实现一个简单的正则:判断一个字符串是否全由数字组成

    package 正则; public class TestIsNum { public static void main(String[] args) { String s1="abc&qu ...

  8. 【二十四】使用mysqli扩展类批量执行多条sql语句

    批量处理多个sql语句 <?php //批量执行多个dml语句 // $mysqli=new mysqli("localhost","root",&quo ...

  9. win10 下 学习 xe10 误以为调试失效

    1. XE里面运行的有两个按扭,你点后面一个,就是debug 的了,前面一个是直接运行,不一样的!,被delphi7老思维导向错了  1)绿色箭头是直接运行,快捷键:ctrl+shfit+F9  2) ...

  10. Java之线程安全中的三种同步方式

    一个程序在运行起来时,会转换为进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如,现实生活中,银行取钱问题.火车 ...