24

我想使用代码而不是使用“MySQL Migration Toolkit”之类的工具来做到这一点。我知道的最简单的方法是打开一个到 DB1 的连接(使用 MySQL 连接器)并读取它的数据。打开与 DB2 的连接并将数据写入其中。有没有更好/最简单的方法?

4

5 回答 5

22

首先,我假设您不能只复制 data/ 目录,因为如果您使用现有的快照/备份/恢复可能就足够了(并测试您的备份/恢复过程以讨价还价) .

在这种情况下,如果两个表具有相同的结构,通常是最快的,具有讽刺意味的是,最简单的方法是在一端使用 SELECT...INTO OUTFILE...,在另一端使用 LOAD DATA INFILE...。

有关详细信息,请参阅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 管道传输它。

IE。

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,您可以对其进行压缩、处理或通过网络将其通过隧道传输到您心中的内容。

于 2010-07-14T07:33:34.453 回答
13

联邦存储引擎?不是最快的,但有一次,偶然的或少量的数据它会做。那是假设您正在谈论 2 个服务器。在一台服务器上使用 2 个数据库,它只是:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
于 2010-07-14T00:20:04.020 回答
1

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

您可以select从一个数据库制作 s 并复制到另一个数据库insert,这非常容易。但是如果您还需要传输数据库模式(create tables 等),它会变得有点复杂,这就是我推荐的原因mysqldump。但是很多 PHP-MySQL-admin 工具也可以做到这一点,因此您可以使用它们或查看它们的代码。

或者,也许您可​​以使用 MySQL 复制。

于 2010-07-14T00:30:26.727 回答
1

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

只要两个数据库位于同一个文件系统上,就可以使用 RENAME TABLE 将表从一个数据库移动到另一个数据库:

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
于 2013-09-02T02:49:42.483 回答
0

If you enabled binary logging on your current server (and have all the bin logs) you can setup replication for the second server

于 2010-07-14T02:30:32.573 回答