如何在2个MySQL数据库之间传输数据?

问题描述:

我想使用代码而不是使用像“MySQL Migration Toolkit”这样的工具。我知道的最简单的方法是打开连接(使用MySQL连接器)到DB1并读取其数据。打开与DB2的连接并将数据写入其中。有更好/最简单的方法吗?如何在2个MySQL数据库之间传输数据?

+1

两个数据库或不同服务器上的两个数据库? – 2010-07-14 00:33:12

+0

@Itay:我不确定天气他们是否在同一台服务器上?我知道这有所作为,但我并没有想到要问他们。我明天会做。 – Morano88 2010-07-14 00:38:17

首先我要假设你是不是在把刚才复制的位置数据/目录,因为如果你正在使用你现有的快照/备份/恢复可能就足够了(并且测试你的备份/恢复程序进行讨价还价)。

在这种情况下,如果两个表的结构通常最快,而讽刺的是,最简单的方法是在一端使用SELECT ... INTO OUTFILE ...,并且LOAD DATA INFILE ... on另一个。

有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/load-data.html和.../select.html。

对于琐碎表下面的工作:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

我们也使用FIFO的有很大的影响,以避免实际写入磁盘的开销,或者如果我们确实需要写入到磁盘由于某种原因,通过gzip管道。

即。

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

基本上,一个你直接表数据的FIFO可以压缩它,它Munge时间或隧道它通过网络你的心内容。

+0

谢谢,尽管它在dev.mysql手册中,但它不能正常工作。它给我这个错误: 你的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以在第1行'\ n''附近使用正确的语法) 它不接受'\ n'..为什么? – Morano88 2010-07-16 22:06:06

+0

堆栈溢出损坏了示例查询。在源代码中,ESCAPED BY子句中的斜杠被转义,但转换为html时转义丢失。对不起,我没有注意到腐败 - 我已经解决了上述问题。 – Recurse 2010-07-19 23:57:24

+0

这正是我需要用来加快备份相当大的数据库,但我无法让你的例子工作。我可以创建FIFO,如果我使用mysqldump转储到管道,它的工作原理很好。但是,如果我尝试使用SELECT ... INTO OUTFILE转储到管道,则会出现“myfifo已存在”错误。 – 2011-10-06 09:09:36

FEDERATED存储引擎?不是这一群人中速度最快的人,而是一次,偶然或少量的数据。假设你在谈论2个服务器。随着2个数据库在同一个服务器,它会仅仅是:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

非常感谢,我还不确定如果2个数据库在同一台服务器上或不在。 – Morano88 2010-07-14 00:34:41

+0

这对我的情况来说太棒了。干杯:) – Nick 2013-05-10 07:24:40

+0

在Amazon RDS中工作良好,您无法访问运行MySQL实例的底层机器,排除涉及INFILE/OUTFILE的解决方案。 – Andz 2015-09-27 07:35:37

您可以使用mysqldumpmysql(命令行客户端)。这些是命令行工具,在你写的问题中,你不想使用它们,但仍然使用它们(即使通过在代码中运行它们)是最简单的方法; mysqldump解决了很多问题。

您可以使select从一个数据库和insert到另一个,这很容易。但是,如果您还需要传输数据库模式(create table s等),它会稍微复杂一些,这是我推荐mysqldump的原因。但很多PHP-MySQL-admin工具也可以做到这一点,所以你可以使用它们或查看他们的代码。

也许你可以使用MySQL复制。

+0

如果两个数据库位于两台不同的服务器上,这会(选择,插入)工作吗? 不,我只是想迁移数据,而不是表创建..等 – Morano88 2010-07-14 00:34:15

+0

是的,你将有tvo连接 - 对于每个服务器一个 - 在一个连接中运行SELECT,然后在另一个INSERT中从该SELECT返回的数据。 – Messa 2010-07-14 09:11:23

如果启用了当前服务器上的二进制日志(并拥有所有的bin日志),你可以在第二个服务器设置复制

http://dev.mysql.com/doc/refman/5.0/en/rename-table.html

只要两个数据库是相同的文件系统上,你可以用重命名表,从一个数据库移动表到另一个问题:在同一台服务器上

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;