mysql通过表空间来恢复或者传递数据
mysql的备份工具通常有 mysqldump ,mysqlpump(5.7后新特性)等备份工具,这里我们可以尝试使用表空间进行传递
方式是:拷贝数据文件+拷贝表空间 对应innodb引擎就是 ibd文件和cfg文件
.cfg: 该文件存储了表的数据字典信息
执行此种方式的要求
(1)需要使用独立表空间,开启innodb_file_per_table参数;
(2)在做表导出时,该表只允许读不允许写;
(3)导入导出的数据data page size必须一样;
(4)在 MySQL 5.7.4 之前的版本是不能对分区表做分区迁移;
(5)使用外键的表,需要使用 set foreign_key_check=0强制忽略外键,否则不支持表空间的导入导出,分布表不支持外键表空间的导入导出;
使用这种的方式的几个限制
源库和目标库版本一致
只适用于 innodb 引擎表
源库执行 flush tables t for export 时,该表会不可写
对于移动一个大表我们来思考一下
使用mysqldump+source的方式:考虑逻辑备份的语句是不是很多,对于一个大表,如果用了很长时间的话,操作频繁,耗时也长 使用select into outfile + load infile 会快一点,但是在生产上主从的环境,要知道主库会将所有的数据当作一个事务执行,只有把数据全部成功插入后,才会将 binlog 复制到从库,
这样会造成从库严重延迟,而且生成的单个 binlog 大小严重超标,在磁盘空间不足时可能会把磁盘占满。
使用xtraback增量备份的话,如何之前一直有备份最好,合并就行,临时使用的话,io消耗比较大,备份的文件大小也比mysqldump的大 使用移动表空间,消耗的时间较短,但是要考虑锁表的问题,并且目标数据库需要提前建库建表
下面举个例子进行说明
1 普通表空间的传递
准备两个mysql,源+目标,同时进行建表命令,一个我们称呼为源mysql,一个称呼为目标mysql
create table first(id int,name char(16));
在源mysql中插入数据
insert into first values(1,'ni'),(2,'wo'),(3,'ta');
在目标mysql上面释放表空间
alter table first discard tablespace; #相当于删除了first.ibd文件,留下了 first.frm
此时你可以对 frm 文件操作,例如:rename table,drop table ,但是不能对 ibd 文件操作,比如:dml
验证结果:
select * from first;
ERROR 1814 (HY000): Tablespace has been discarded for table 'first'
在源mysql上面创建.cfg元数据文件,注意,不要关闭当前窗口,否则消失
flush tables first for export; #此时,源MySQL有了first.cfg文件,
验证情况:
insert into first values(10,'hehe'); DML 操作是阻塞的ERROR 1099 (HY000): Table 'first' was locked with a READ lock and can't be updated
复制first.cfg文件和first.ibd文件到目标mysql
cp 源mysql路径/first.{cfg,ibd} 目标mysql/
修改权限
chown mysql.mysql *
源mysql释放锁
UNLOCK TABLES;
目标mysql导入表空间
alter table first import tablespace;
目标mysql查看结果
select * from first;
注意:如果是加密的表空间,传递的文件就是 .cfp .cfg .ibd三个文件
2 分区表空间传递(mysql5.7.4之后的版本)
接替上一篇博客建立的分区表 test_range_partition 我们来做分区表的迁移
在目标服务器上面建立database和表test_range_partition
mysql> CREATE TABLE test_range_partition(
-> id INT auto_increment,
-> createdate DATETIME,
-> primary key (id,createdate)
-> )
-> PARTITION BY RANGE (TO_DAYS(createdate) ) (
-> PARTITION p201801 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201802 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201803 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201804 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201805 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201806 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201807 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201808 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201809 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201810 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201811 VALUES LESS THAN ( TO_DAYS('') ),
-> PARTITION p201812 VALUES LESS THAN ( TO_DAYS('') )
-> );
Query OK, 0 rows affected (0.06 sec)
在目标服务器上面删除表的指定分区表空间
alter table test_range_partition discard partition p201802 tablespace;
查看
[root@localhost target]# ls
db.opt test_range_partition#P#p201805.ibd test_range_partition#P#p201810.ibd
test_range_partition.frm test_range_partition#P#p201806.ibd test_range_partition#P#p201811.ibd
test_range_partition#P#p201801.ibd test_range_partition#P#p201807.ibd test_range_partition#P#p201812.ibd
test_range_partition#P#p201803.ibd test_range_partition#P#p201808.ibd
test_range_partition#P#p201804.ibd test_range_partition#P#p201809.ibd
源服务器上面导出表空间,并复制到目标服务器上面
mysql> flush tables test_range_partition for export;
Query OK, 0 rows affected (0.00 sec) scp 源服务器ip/test_range_partition#P#p201802.{cfg,ibd} 目标服务器/
查看目标服务器的内容,并修改权限,否则导入的时候报错
[root@localhost target]# ls
db.opt test_range_partition#P#p201803.ibd test_range_partition#P#p201808.ibd
test_range_partition.frm test_range_partition#P#p201804.ibd test_range_partition#P#p201809.ibd
test_range_partition#P#p201801.ibd test_range_partition#P#p201805.ibd test_range_partition#P#p201810.ibd
test_range_partition#P#p201802.cfg test_range_partition#P#p201806.ibd test_range_partition#P#p201811.ibd
test_range_partition#P#p201802.ibd test_range_partition#P#p201807.ibd test_range_partition#P#p201812.ibd chown mysql.mysql *
源服务器释放锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
目标服务器导入表空间
mysql> alter table test_range_partition import partition p201802 tablespace; #这里报错是因为没有修改属主
ERROR 1812 (HY000): Tablespace is missing for table `target`.`test_range_partition`.
mysql> alter table test_range_partition import partition p201802 tablespace;
Query OK, 0 rows affected (0.02 sec) mysql> select * from test_range_partition; #只有两个数据,是因为导入了一个分区表空间,可以尝试导入所有的表空间
+----+---------------------+
| id | createdate |
+----+---------------------+
| 2 | 2018-02-05 00:00:00 |
| 3 | 2018-02-06 00:00:00 |
+----+---------------------+
2 rows in set (0.00 sec)
mysql通过表空间来恢复或者传递数据的更多相关文章
- mysql 案例 ~ 表空间迁移数据与数据导入
一 简介:mysql5.6+的表空间传输二 目的:复制数据到另一个表三 步骤 1 create table b like a ->创建一个空表 2 alter table b disc ...
- Oracle误删除表空间的恢复
对于误删除表空间的恢复,本文通过基于数据库的时间点恢复和基于表空间的时间点恢复分别加以讨论 一 通过基于数据库的时间点恢复被误删除的表空间 1 需要注意的事项 a 基于数据库的时间点恢复将会回退整个数 ...
- MySQL的表空间管理
表空间: MySQL没有真正意义上的表空间管理. MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间. 一般来说,当数据量很小的时候建议使用共享表空间的管理方式. ...
- ORACLE表空间offline谈起,表空间备份恢复
从ORACLE表空间offline谈起,表空间备份恢复将表空间置为offline,可能的原因包括维护.备份恢复等目的:表空间处于offline状态,那么Oracle不会允许任何对该表空间中对象的SQL ...
- 谈谈什么是MySQL的表空间?
今天我要跟你分享的话题是:"大家常说的表空间到底是什么?究竟什么又是数据表?" 这其实是一个概念性的知识点,当作拓展知识.涉及到的概念大家了解一下就好,涉及的参数,留个印象就好. ...
- WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...
- MySQL 独立表空间恢复案例
创建表的时候就会得到元数据.可以通过定义的方式对表的元数据进行生成 这个地方要注意的是 独立表空间当中 ibd & frm分别存储的是什么数据? 表空间:文件系统,为了更好的扩容数据库的存 ...
- mysql共享表空间转独立表空间
使用innodb_export_import.py脚本: https://github.com/thecpaneladmin/innodb-tools 安装MySQL-python模块: shell ...
- mysql之 表空间传输
说明:MySQL(5.6.6及以上),innodb_file_per_table开启. 1.1. 操作步骤: 0. 目标服务器创建相同表结构1. 目的服务器: ALTER TABLE t DISCAR ...
随机推荐
- 由hbase.client.scanner.caching参数引发的血案(转)
转自:http://blog.csdn.net/rzhzhz/article/details/7536285 环境描述 Hadoop 0.20.203.0Hbase 0.90.3Hive 0.80.1 ...
- #2560异或和问题 jdfz集训—秦岳
题目描述 N个数字,要求选择M次,每次从N个数中选出两个数(Ai,Aj)(但不能和之前某次选择相同),此次选择的得分为Ai xor Aj. 求最大得分. 输入格式 第一行包含两个整数N,M 接下来一行 ...
- webpack 学习2 入口(entry)和输入管理(output)
在开始上代码之前,先让我们盘一盘什么是webpack中的入口和输入 入口 假设你现在手里有一个水龙头,然后十个人用水管从你这里拿水.你这个龙头就是水的入口,水管就是你和这些人的依赖联系.现在供水局的要 ...
- 练手项目之image caption问题记录
小白一个,刚刚费了老大的劲完成一个练手项目--image caption,虽然跑通了,但是评估结果却惨不忍睹.于是贴上大神的作品,留待日后慢慢消化.顺便记录下自己踩坑的一些问题. 先膜拜下大神的作品. ...
- UVA1411 Ants
想出的一道题竟然是原题QAQ 非常有趣的一个题 根据三角形两边之和大于第三边 所以相交的线段一定是比不相交的线段要长的 所以直接二分图构图 最小费用最大流即可 (我不管我不管我要把这个出到NOIP膜你 ...
- python--MySql(外键约束、多表查询(*****))
两张表之间的关系: 一对一(两张表可以合并成一张表) 一对一用的比较少,多对一对外键设置unique约束可以实现一对一 一对多(例如:每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任) 多 ...
- The Second Scrum Meeting!
第七周会议 情况简述 会议概要:汇报已完成的任务,讨论并解决遇到的问题 参与人员:詹晓宇 谢赛金 熊紫仁 徐翠萍 周娟 孙尚煜 会议地点:六区研讨性教室 具体内容 小组成员 已完成任务 计划 ...
- BZOJ 4421: [Cerc2015] Digit Division(思路)
传送门 解题思路 差点写树套树...可以发现如果几个数都能被\(m\)整除,那么这几个数拼起来也能被\(m\)整除.同理,如果一个数不能被\(m\)整除,那么它无论如何拆,都无法拆成若干个可以被\(m ...
- [CSP-S模拟测试]:简单的区间(分治)
题目描述 给定一个长度为$n$的序列$a$以及常数$k$,序列从$1$开始编号.记$$f(l,t)=\sum \limits_{i=l}^ra_i-\max \limits_{i=l}^r\{a_i\ ...
- LeetCode刷题笔记-递归-反转二叉树
题目描述: 翻转一棵二叉树. 解题思路: 1.对于二叉树,立马递归 2.先处理 根节点,不需改动 3.处根的左子树和右子树需要交换位置 4.递归处理左子树和右子树.步骤见1-3步 Java代码实现: ...