Mysql如何实现数据迁移

这篇文章将为大家详细讲解有关MySQL如何实现数据迁移,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的惠农网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

MySQL迁移通常使用的有三种方法:
1、数据库直接导出,拷贝文件到新服务器,在新服务器上导入。
2、使用第三方迁移工具。
3、数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。


第一种方案的优点:会重建数据文件,减少数据文件的占用空间,兼容性最好,导出导入很少发生问题,需求灵活。缺点:使用传统导出导入时间占用长。
第二种方案的优点:设置完成后传输无人值守,自动完成。缺点:不够灵活,设置繁琐,传输时间长,异常后很难从异常的位置继续传输。
第三种方案的优点:时间占用短,文件可断点传输,操作步骤少。缺点:新旧服务器中MySQL版本及配置必须相同,可能引起未知问题。


假如数据库迁移是因为业务瓶颈或项目改造等需要变动数据表结构的(比如分区分表),我们便只能使用第一种方法了。

我一般使用MySQL的 SELECT INTO OUTFILE 、LOAD DATA INFILE 快速导出导入数据
【导出导出工作准备】

导出前关闭日志,避免数据备份过程中频繁记录日志
删除主键,关闭自动增长。在该表中主键其实作用不大,自动增长是需要的(mysql中自动增长的一列一定要为key,所以设置为主键),等待数据转移结束后重新设置回来
删除表中索引。在插入数据时索引的存在会很大程度上影响速度,所以先关闭,转移后重新建立
Mysql系统参数调优,如下:(具体含义后面给出)
innodb_data_file_path           = ibdata1:1G:autoextend
innodb_file_per_table           = 1
innodb_thread_concurrency       = 20
innodb_flush_log_at_trx_commit  = 1
innodb_log_file_size            = 256M
innodb_log_files_in_group       = 3
innodb_max_dirty_pages_pct      = 50
innodb_lock_wait_timeout        = 120
key_buffer_size=400M
innodb_buffer_pool_size=4G
innodb_additional_mem_pool_size=20M
innodb_log_buffer_size=20M
query_cache_size=40M
read_buffer_size=4M
read_rnd_buffer_size=8M
tmp_table_size=16M
max_allowed_packet = 32M

【操作方法及结果】
(1)create table t2 as select * from t1
CREATE TABLE dn_location3   
PARTITION BY RANGE (UNIX_TIMESTAMP(UPLOADTIME)) 
 (   PARTITION p141109 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-09 00:00:00')), 
 PARTITION p141110 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-10 00:00:00')),    
PARTITION p141111 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-11 00:00:00')),    
PARTITION p141112 VALUES LESS THAN (UNIX_TIMESTAMP('2014-11-12 00:00:00'))  
)  
as select * from dn_location  
where uploadtime > '2014-08-04'; 
 
create table t2 as select * from dn_location2; 

as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引。
此方法效率较高,在前面的实验环境下,42min内将一张表内4600W的数据转到一张新的表中,在create新表时我添加了分区的操作,因此新表成功创建为分区表,这样一步到位的既转移了数据又创建了分区表。此方法平均速度:6570W条/h ,至于该方法其他需要注意的地方,暂时没有去了解。
(2)使用MySQL的 SELECT INTO OUTFILE、LOAD DATA INFILE
LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。当用户一前一后地使用SELECT ... INTO OUTFILE 和LOAD DATA INFILE 将数据从一个数据库写到一个文件中,然后再从文件中将它读入数据库中时,两个命令的字段和行处理选项必须匹配。否则,LOAD DATA INFILE 将不能正确地解释文件内容。
假设用户使用SELECT ... INTO OUTFILE 以逗号分隔字段的方式将数据写入到一个文件中:
SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM table2;
为了将由逗号分隔的文件读回时,正确的语句应该是:
LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';
如果用户试图用下面所示的语句读取文件,它将不会工作,因为命令LOAD DATA INFILE 以定位符区分字段值:
LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY '\t';
下面是我用来导入导出的命令:
select * into outfile 'ddd.txt' fields terminated by ',' from dn_location; 
load data infile 'ddd.txt' into table dn_location2  FIELDS TERMINATED BY ',';

通过该方法导出的数据,是将各字段(只有数据,不导出表结构)数据存在一个文件中,中间以逗号分隔,因为文件中并不包含数据库名或者表名,因此需要在导入导出的时候些明确。该方法在18分钟内导出1.6亿条记录,46min内导入6472W条记录,平均速度:8442W条/h。mysql官方文档也说明了,该方法比一次性插入一条数据性能快20倍

关于“Mysql如何实现数据迁移”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


新闻名称:Mysql如何实现数据迁移
本文网址:http://ybzwz.com/article/jspjho.html