当数据库属于不同的用户时,将数据从一个数据库中的表复制到另一个数据库中的表的最佳方法是什么?

我知道我可以用

INSERT INTO database2.table2 SELECT * from database1.table1

但这里的问题是database1和database2都在不同的MySQL用户下。所以user1只能访问database1, user2只能访问database2。任何想法?


当前回答

尝试mysqldbcopy(文档)

或者可以在目标主机上创建“联邦表”。联邦表允许您查看来自不同数据库服务器的表,就像它是本地表一样。(文档)

创建联邦表之后,可以使用通常的insert从SOURCE将数据复制到TARGET select *中

其他回答

像sakila.customer(Database_name.tablename)一样创建表destination_customer,这只会复制源表的结构,对于数据也要复制结构,这样创建表destination_customer作为select * from sakila.customer

尝试mysqldbcopy(文档)

或者可以在目标主机上创建“联邦表”。联邦表允许您查看来自不同数据库服务器的表,就像它是本地表一样。(文档)

创建联邦表之后,可以使用通常的insert从SOURCE将数据复制到TARGET select *中

如果你的表在同一个mysql服务器上,你可以运行下面的命令

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

这是你需要定期做的事情,还是只做一次?

你可以做一个导出(例如使用phpMyAdmin或类似),将脚本出你的表和它的内容到一个文本文件,然后你可以重新导入到另一个数据库。

如果你有shell权限,你可以使用mysqldump来转储database1的内容。Table1,并将其连接到mysql和database2。这里的问题是table1仍然是table1。

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

也许您需要使用另一个查询将table1重命名为table2。另一种方法是使用sed在to管道之间将table1更改为table2。

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

如果table2已经存在,你可以在第一个mysqldump中添加参数,它不允许创建table- created。

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2