1.1. 场景

有的时候test人员可能需要在测试库上比较新的数据,这时候只能是从生产库上面去那了。如果是小表还好实用mysqldump/mysqlpump就可以轻松的解决。但是,如果遇到了大表这将是一个很痛苦的过程。这时候最好的选择就是使用Percona公司的MySQL热备工具xtrabackup了。

1.2. 为什么不使用ibd文件拷贝方法

很简单,因为要锁表对生产环境影响比较大。

1.3. 扩展

当然如果他们数据的要求并不是那么高可以使用每天用xtrabackup备份的来做。但是,这往往会比现场直接备份生产库的某张表来的麻烦,因为往往我们使用的是增量备份,还要应用之前的所有日志。而且为了防止破坏备份数据,还需要拷贝一份。

1.4. 先决条件

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

 
1
set global innodb_file_per_table = 1;

由于我使用的是 Percona Server 5.7.10-3 所以需要使用的xtrabackup版本为2.4.1

1.5. 制造大表

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

 
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.6. 表迁移演示

    1、使用xtrabackup备份test.t1表数据

 
1
2
3
4
5
6
7
8
mkdir -p /tmp/backup
/usr/local/percona-xtrabackup/bin/innobackupex \
  --defaults-file=/etc/my.cnf                  \
  --user=root                                  \
  --password=root                              \
  --socket=/u02/tmp/mysql.sock                 \
  --include='test.t1'                          \
  /tmp/backup

2、查看备份集

 
1
2
3
4
5
6
7
8
9
10
11
12
ll /tmp/backup
drwxr-x--- 3 root root      4096 Mar 10 15:43 2016-03-10_15-43-35
ll /tmp/backup/2016-03-10_15-43-35
total 1048600
-rw-r----- 1 root root        412 Mar 10 15:43 backup-my.cnf
-rw-r----- 1 root root        453 Mar 10 15:43 ib_buffer_pool
-rw-r----- 1 root root 1073741824 Mar 10 15:43 ibdata1
drwxr-x--- 2 root root         32 Mar 10 15:43 test
-rw-r----- 1 root root         26 Mar 10 15:43 xtrabackup_binlog_info
-rw-r----- 1 root root        121 Mar 10 15:43 xtrabackup_checkpoints
-rw-r----- 1 root root        553 Mar 10 15:43 xtrabackup_info
-rw-r----- 1 root root       2560 Mar 10 15:43 xtrabackup_logfile

3、应用日志并导出元数据

 
1
2
3
4
5
6
7
8
9
10
/usr/local/percona-xtrabackup/bin/innobackupex \
  --apply-log \
  --export \
  /tmp/backup/2016-03-10_15-43-35
 
ll /tmp/backup/2016-03-10_15-43-35/test
-rw-r--r-- 1 root root        433 Mar 10 16:21 t1.cfg
-rw-r----- 1 root root      16384 Mar 10 16:21 t1.exp
-rw-r----- 1 root root       8604 Mar 10 15:43 t1.frm
-rw-r----- 1 root root 1195376640 Mar 10 15:43 t1.ibd

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

 
1
2
3
CREATE DATABASE test2;
USE test2;
CREATE TABLE t1 LIKE test.t1;

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

 
1
2
USE test2;
ALTER TABLE t1 DISCARD TABLESPACE;

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

 
1
2
3
4
5
6
7
8
9
cp /tmp/backup/2016-03-10_15-43-35/test/t1.cfg /u02/data/test2/
cp /tmp/backup/2016-03-10_15-43-35/test/t1.ibd /u02/data/test2/
cp /tmp/backup/2016-03-10_15-43-35/test/t1.exp /u02/data/test2/
 
ll -h /u02/data/test2/
-rw-r--r-- 1 root  root   433 Mar 10 16:35 t1.cfg
-rw-r----- 1 root  root   16K Mar 10 16:35 t1.exp
-rw-r----- 1 mysql mysql 8.5K Mar 10 14:33 t1.frm
-rw-r----- 1 root  root  1.2G Mar 10 16:35 t1.ibd

7、test2导入t1数据

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

8、查看test2.t1数据

 
1
2
3
4
5
6
7
USE test2;
SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|   999999 |
+----------+

1.7. 总结

xtrabackup这种表迁移算是比较复杂的了,但是他对数据库的影响是比较小的。虽然说影响小,但是还是会有影响的。所以迁移还是避免高峰时期比较妥当。

MySQL-表迁移工具的选型-xtrabackup的使用的更多相关文章

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

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

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

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

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

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

  4. [转载] MySQL高可用方案选型参考

    原文: http://imysql.com/2015/09/14/solutions-of-mysql-ha.shtml?hmsr=toutiao.io&utm_medium=toutiao. ...

  5. mysql备份学习笔记及xtrabackup安装

    (参考书籍:<深入浅出MySQL>) 一.备份恢复策略 a)      确定要备份的表的存储引擎是事务型还是非事务型 b)      确定使用全备份还是增量备份 c)      定期做备份 ...

  6. python 多线程删除MySQL表

    一.需求分析 在<python 统计MySQL表信息>这篇博客中,链接如下: https://www.cnblogs.com/xiao987334176/p/9901692.html 已经 ...

  7. 小型网站MYSQL问题二:Percona Xtrabackup实现数据库备份和恢复

    1.安装软件仓库(不要问我为什么不用源码安装,好吧,其实我懒.) 1 2 3 4 5 6 7 8 wget https://www.percona.com/downloads/percona-rele ...

  8. (转)CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup

    CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup 原文:http://qizhanming.com/blog/2017/05/10/install-percona- ...

  9. MySQL表的四种分区类型

    MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

随机推荐

  1. 什么是jstl表达式,怎么应用

    1.介绍 JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能.jstl出现的目的同el一样也是要代替jsp页面中的脚 ...

  2. odoo12常用的方法

    2019-09-13 今天是中秋节,星期五 #自定义显示名称 def name_get(self): result = [] for order in self: rec_name = "% ...

  3. Spring Cloud Alibaba基础教程:Nacos+Dubbo

    Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案. 它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序.Dubbo是Alib ...

  4. 《深入剖析Tomcat》源码

    <深入剖析Tomcat>翻译自<How Tomcat Works> 可以到官网下载:https://brainysoftware.com/download 官网下载比较慢,我就 ...

  5. 大数据学习(26)—— Spark之RDD

    做大数据一定要有一个概念,需要处理的数据量非常大,少则几十T,多则上百P,全部放内存是不可能的,会OOM,必须要用迭代器一条一条处理. RDD叫做弹性分布式数据集,是早期Spark最核心的概念,是一种 ...

  6. 利用共享内存实现比NCCL更快的集合通信

    作者:曹彬 | 旷视 MegEngine 架构师 简介 从 2080Ti 这一代显卡开始,所有的民用游戏卡都取消了 P2P copy,导致训练速度显著的变慢.针对这种情况下的单机多卡训练,MegEng ...

  7. azure获取vm运行状态

    az vm list -d -o json --query "[?name=='vm-name']" | jq '.[0].powerState' 输出vm信息 az vm lis ...

  8. 遗传算法 TSP(Python代码)

    该代码是本人根据B站up主侯昶曦的代码所修改的. 原代码github地址:https://github.com/Houchangxi/heuristic-algorithm/blob/master/T ...

  9. 在游戏中播放cg视频遇到的问题

    遇到问题 我们线上手游要给港澳台用户增加cg视频,在我之前文章中已经讲到了我们是怎么在unity中播放cg的--><使用AVPro Video在Unity中播放开场视频(CG)笔记> ...

  10. HTML5(十一)——WebSocket 基础教程

    一.为什么要学 WebSocket? websocket 是 HTML5 提供的一种长链接双向通讯协议,使得客户端和服务器之间的数据交换更简单,允许服务端主动向客户端推送数据,并且客户端与服务端只需连 ...