表迁移

在做报表的时候,通常需要把额外几张服务器中的表导入到一个数据库中,这时候就需要表迁移!

  • 利用mysqldump方式导入表
  • 使用INNODB表空间的方式迁移表
  • 使用select ...into file的方式迁移表

mysqldump方式导入表

这种方式适合用于表数据不是太大时候,这是一种逻辑导入与导出,导出的文件时sql语句,然后把导出的sql语句在另一台服务器上执行即可!

1:先备份要导出的那个表

#备份出需要迁移的表 mysqldump -utest -p123456 --single-transaction fi_repayplan fi_tdaymoney > `date +%F`.sql

[[email protected] ~]# ll -h 2018-12-04.sql         #这个文件总共103M-rw-r--r-- 1 root root 103M Dec  4 15:58 2018-12-04.sq

2:把备份文件考到另一台服务器上恢复

[[email protected] ~]# mysql -utest -p123456 mytest < 2018-12-04.sql

如果这里没有报错就可以恢复了,可以进入数据库中,查看一行表的行数,对比确认一下!

使用INNODB表空间的方式迁移表

这种方式的迁移数据,属于物理迁移,适合数据量比较大的表!

第一种:锁表迁移

首先创建一个表,插入一些数据!

CREATE TABLE `tb1` (
  `id` int(10) DEFAULT NULL,
  `content` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

##写一个存储过程向表中插入数据
CREATE PROCEDURE insert_data(count int UNSIGNED)
BEGIN
declare s int UNSIGNED DEFAULT 1;
DECLARE c char(90) DEFAULT REPEAT("a",90);
START TRANSACTION;
WHILE s <= count DO
INSERT INTO tb1 SELECT s,c;
set s = s +1;
END WHILE;
COMMIT;
END;

##调用存储过程
call insert_data(10000000);

#表空间大小[[email protected] mydb]# ll -h tb1.*-rw-rw---- 1 mysql mysql  760 Dec  5 08:00 tb1.frm-rw-rw---- 1 mysql mysql 884M Dec  5 08:01 tb1.ibd[[email protected] mydb]#

我们把test3上的tb1表迁移到test2上面!

首先在test3上做如下操作:

MariaDB [mydb]> flush table tb1 for export;
Query OK, 0 rows affected (0.00 sec)#这条语句会强制进行fsync操作,会把当前的表加上一个read lock!这时候表不能写入数据,只能读数据,在对应目录下面生成.cfg文件!#需要注意当前的会话不能关闭,否则.cfg文件会自动消失!.cfg文件存储的是表的一些元信息

[[email protected] mydb]# ll tb1.*-rw-rw---- 1 mysql mysql       417 Dec  5 08:05 tb1.cfg-rw-rw---- 1 mysql mysql       760 Dec  5 08:00 tb1.frm-rw-rw---- 1 mysql mysql 926941184 Dec  5 08:01 tb1.ibd[[email protected] mydb]# strings tb1.cfg          #.cfg文件的内容test3    mydb/tb1contentDB_ROW_IDDB_TRX_IDDB_ROLL_PTRGEN_CLUST_INDEXDB_ROW_IDDB_TRX_IDDB_ROLL_PTRcontent

在test2上操作:

第一步:把test3上tb1的建表语句在test2上面执行,【建表语句一定不要错,否则会报1808 schema 不匹配错误】
MariaDB [mytest]>  CREATE TABLE `tb1` (
 `id` int(10) DEFAULT NULL,
 `content` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

第二步:删除新建表tb1的表空间
MariaDB [mytest]> alter table tb1 discard tablespace;
Query OK, 0 rows affected (0.02 sec)

这条语句会删除表的ibd文件,慎重执行
第三:拷贝表数据文件
把test3上的tb1.ibd文化和tb1.cfg文件拷贝到test2的对应表文件目录下面
[[email protected] mydb]# scp tb1.cfg tb1.ibd 10.0.102.204:/data/mariadb/mytest
tb1.cfg                                                                                                                                                   100%  417   698.3KB/s   00:00
tb1.ibd                                                                                                                                                   100%  884MB  50.6MB/s   00:17
#第四步,修改文件属主和属组
[[email protected] mytest]# chown -R mysql:mysql tb1.*
#第五步:导入表空间文件
MariaDB [mytest]> alter table tb1 import tablespace;
Query OK, 0 rows affected (10.49 sec)

最后解除test3上对表tb1加的读锁!

MariaDB [mydb]> unlock tables;
Query OK, 0 rows affected (0.00 sec)

第二种:不锁表迁移

上面的方法我们对tb1加上了读锁,在线上环境中,对一整张表加上读锁的代价是有点大的,因此我们取巧,使用不锁表迁移!

我们知道innobackupex可以在线备份,因此我们可以先把要迁移的表,备份出来,然后再导入表结构文件和元数据文件!

首先备份要迁移的表:

[[email protected] ~]# innobackupex --user=test --password=123456 --include="mydb.tb1" --no-timestamp tb1.sql

#执行apply-log 操作
[[email protected] ~]# innobackupex --apply-log --export tb1.sql/         【这一步操作可以不执行的,直接拷贝对应表的ibd文件和frm文件也是可以的】
[[email protected] ~]# cd tb1.sql/mydb/
[[email protected] mydb]# ll                   #这里的文件多了两个,
total 905244
-rw-r--r-- 1 root root       428 Dec  5 08:25 tb1.cfg
-rw-r----- 1 root root     16384 Dec  5 08:25 tb1.exp
-rw-r----- 1 root root       760 Dec  5 08:25 tb1.frm
-rw-r----- 1 root root 926941184 Dec  5 08:25 tb1.ibd

在test2上执行tb1的建表语句,然后discard掉表空间文件:过程和上面的是一样的,我们直接执行拷贝文件这一步!

[[email protected] mydb]# pwd
/root/tb1.sql/mydb
[[email protected] mydb]# scp tb1.cfg tb1.ibd 10.0.102.204:/data/mariadb/mytest/#若是在上面没有执行--apply-log哪一步,就不会出现.cfg文化和.exp文件;再拷贝时,可以直接拷贝tb1.frm文化和tb1.ibd文件,后面的操作是一样的!
#文件拷贝成功之后,修改属主,属组,然后导入表空间!
MariaDB [mytest]> alter table tb1 import tablespace;Query OK, 0 rows affected (10.57 sec)             #这个时间是10.57秒

这两种方法的本质是一样的,只不过不锁表迁移,只是把要迁移的数据备份了出来,然后对备份的数据进行操作而已!

第三种:使用select ...into file的方式

这种方式属于逻辑迁移的方式,本质和第一种mydump是一样的,只是这样操作会相对于mydump会快点!

把数据导入到文件中:

MariaDB [mydb]> system mkdir /data/tb1;
MariaDB [mydb]> system chown -R mysql:mysql /data/tb1;
#文件的属主与属组需要改为mysql,否则没有写入权限
MariaDB [mydb]> select * from tb1 into outfile "/data/tb1/tb.txt";
Query OK, 6100000 rows affected (8.83 sec)

导入建表语句:

[[email protected] mydb]# mysqldump -utest -p123456 -d mydb tb1 | mysql -utest -p123456 -h10.0.102.204 mytest

-d: 只导出表结构不导表数据#当数据量少的时候,我们可以直接使用这条命令完成表的迁移

然后拷贝上面导出的表文件,并且导入!

[[email protected] mydb]# scp /data/tb1/tb.txt 10.0.102.204:/data
tb.txt                                                                                                                                                    100%  573MB  40.8MB/s   00:14
[[email protected] mydb]# 

#在test2上面导入表数据文件
MariaDB [mytest]> load data infile "/data/tb.txt" into table tb1;
Query OK, 6100000 rows affected (1 min 2.29 sec)              #这里的时候是62秒,物理迁移导入时10秒钟,时间相差6倍
Records: 6100000  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [mytest]>

原文地址:https://www.cnblogs.com/wxzhe/p/10065692.html

时间: 2024-09-30 10:32:05

表迁移的相关文章

vertica从其他表迁移数据到新表(insert into 语句用法实例)

前面一篇开始学习solr的时候,做了个入门的示例http://blog.csdn.net/zjc/article/details/24414271 .虽然可以检索出内容,但总和想象的结果有差异--比如,检索"天龙"两个字,按常规理解,就应该只出来<天龙八部>才对,可是竟然也会把<倚天屠龙记>检出来.后来研究了一下,发现系统是这样处理的:无论是抽索引时还是分析检索词时,都把所有文字按单字拆开.这样,刚好<倚天屠龙记>里包含"天"和&

零基础mysql数据库表迁移

@ 把老数据库中的某个表倒出成sql文件 $mysql -uroot -p my_db > my_db.sql (输入密码) @ 在新环境中导入 $sudo apt-get install mysql-server -y (期间要初始化root用户的密码) $mysql -uroot -p (输入密码) mysql> show databases;(注意分号) mysql> create database my_db; mysql> show databases; mysql>

面试官:如何做到不停机分库分表迁移?

需求说明 类似订单表,用户表这种未来规模上亿甚至上十亿百亿的海量数据表,在项目初期为了快速上线,一般只是单表设计,不需要考虑分库分表.随着业务的发展,单表容量超过千万甚至达到亿级别以上,这时候就需要考虑分库分表这个问题了,而不停机分库分表迁移,这应该是分库分表最基本的需求,毕竟互联网项目不可能挂个广告牌"今晚10:00~次日10:00系统停机维护",这得多low呀,以后跳槽面试,你跟面试官说这个迁移方案,面试官怎么想呀? 借鉴codis 笔者正好曾经碰到过这个问题,并借鉴了codis一

oracle 表迁移方法 (一)

在生产系统中,因业务需求,56张表中清空54张表数据,另外两张表数据保留,数据量大约10G左右:1.大部分人想法就是expdp/impdp,的确是这样,哈哈 2.rman 3.以下方法,move 虚拟机单表模拟如下:[[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Mon Nov 3 18:40:16 2014 Copyright (c) 1982, 2011, Oracle

数据表迁移数据一致性验证

在迁移数据库的时候做一些必要的验证还是很有用的,比如说迁移前后的数据条数是否一致,数据是否一致,这个时候怎么办呢,验证条数还好说,要是验证数据是否一致呢,对于重要的数据当然要每条都不会有差错,随机抽样验证肯定是不行的,万一遗漏了就麻烦了,而且两张表不再同一台服务器上.这个时候该怎么办呢,有一种方法: 从表中选取几个重要字段,比如说A.B.C,用这几个字段作为比对的标尺. 从原表中导出每条数据的这三个字段到一个文件f1中. 从目的表中到处每条数据的这三个字段到文件f2中. 比对文件f1.f2文件中

审计信息清理及审计表迁移时遇到的坑

晚上十点三十五分左右,客户的业务无法访问数据库,至于报错是什么,忘记询问了.这是个坏习惯,应该一开始就询问,这样子可以最快找到解决问题的方案. 一开始客户联系我,让我帮忙检查一下数据库的状态,我首先查询了监听服务(lsnctl status),因为我所接触的大部分故障都是由于监听问题导致的.此处,监听服务正常. 查看alert日志,发现system表空间无法扩展,一般而言,system表空间会自动管理,不会需要太多空间(此处尚需要进行研究).首先将system表空间数据文件的扩展方式修改可自动的

MySQL 大表迁移

一.需求分析 线上100G 大表 table1 迁移,从DB1 迁移到DB2. 二.环境要求: 1.MySQL 使用InnoDB 存储引擎,且开启独立表空间: 2.两个库的MySQL版本一致(未做不同版本测试). 三.操作详情: 1.导出DB1 中table1 的表结构SQL到DB2中: 2.卸载DB2 中table1 的表空间: alter table table1 discard tablespace; 如果是卸载DB1整个库可以这样操作: SELECT CONCAT('ALTER TABL

HBase 表迁移中对丢失的表检查使用的语句

在进行表检查时报错: org.apache.hadoop.hbase.TableNotFoundException: ods_matchinfo 改表丢失了 将报错的表删除,执行hbase hbck -fixMeta hbase hbck –fixAssignments 直到都没有报错. 解决命令如下: hdfs dfs –rmr /hbases/data/default/Tabel hbase hbck -fixMeta hbase hbck -fixAssignments

针对数据量较大的表,需要进行跨库复制,采用navcat 实现sqlite数据库跨数据库的数据表迁移 [转载]

2014年12月13日 14:36 新浪博客 (转自http://www.cnblogs.com/nmj1986/archive/2012/09/17/2688827.html) 需求: 有两个不同的SQLite数据库 A.B,需要将B数据库中的表复制到A数据库中去,数据量较小的时候,可以在数据库可视化工具Navicat中直接将表导成.sql文件,然后将sql文件在另一个数据库运行即可.但是当数据量较大时,这样操作会丢失一部分数据.因此针对这种情况可采用下述方法: 解决办法: (1)使用软件:S