将表从一个数据库复制到另一个数据库的最简单方法?


151

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

我知道我可以用

INSERT INTO database2.table2 SELECT * from database1.table1

但是这里的问题是database1database2都属于不同的MySQL用户。因此user1只能访问database1并且user2只能访问database2。任何想法?


6
您可以将表级授予用户。见:dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
不幸的是,在我的情况下,这是行不通的,因为我使用的是Godaddy共享托管服务器。他们不允许对数据库执行此类操作。
Sparky's

@mmdemirbas数据库中的一个表有近一百万行。数据库转储将是巨大的。另外,当我尝试导出时,仅导出了大约10000行-可能是由于尺寸较大。
Sparky's

我知道您可以使用RENAME来移动表格,而且速度非常快。有复制表的等效技巧吗?
丹丹”

顺便说一句:您需要注意两个表中的字段列表的顺序相同。否则,有必要通过名称从database1的表中选择字段,以便它们映射到database2的表中的正确字段。这个问题对我来说是一个问题,我备份了最初创建后修改了table1的数据库,以及从mysqldump文件创建了新数据库的地方。
史蒂夫·L

Answers:


113

如果您具有外壳程序访问权限,则可以使用mysqldump转储的内容database1.table1并将其通过管道传输mysqldatabase2。这里的问题table1仍然是table1

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

也许您需要使用另一个查询将其重命名table1table2。另一种方法是,您可以使用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-creates。

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

问题是当它自动化时,您必须显示密码。如果不是自动化的,并且由用户从命令行完成,则可以。
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

其中db1是目标,而db2是源


如果两个用户无权互相选择数据,这行得通吗?

1
这将无法跨不同的mysql服务器工作吗?
PUG

8
这不会复制索引
bcoughlan

@铍否,这要求用户同时拥有两个DB的权限。jaminator no,这不能在不同的服务器上运行,但是我不认为这个问题在问。巴克夫兰,你是对的。这是此方法的一个大缺陷:无法正确保留表结构。
thomasrutter 2015年

4
复制的表没有设置主键和自动增量。您必须在ALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

如果您使用的是PHPMyAdmin,则可能非常简单。假设您具有以下数据库:

DB1 & DB2

DB1有您要复制到DB2的表用户

在PHPMyAdmin下,打开DB1,然后转到users表。

在此页面上,单击右上方的“操作”标签。在“操作”下,查找“ 将表复制到(database.table)”部分:

&你完成了!


1
死简单!这是我可以庆祝自己变得懒惰的时候!
Daniel Dut

1
您节省了我的时间。.i我只是天真地做..先导出然后导入。
Hamza Zafeer

1
其他答案均
无效

1
如果表特别大,即超过4 GB,将无法使用。例如,我有一个22GB的表,phpMyAdmin不能使用。
Mark D

1
完美的答案。不了解phpmyadmin的此功能。
zookastos

23

MySql Workbench:强烈推荐

MySql Workbench中的数据库迁移工具

这将轻松解决迁移问题。您可以在MySql和SqlServer之间迁移选定数据库的选定表。您绝对应该尝试一下。


我准备尝试一下,设置好了,但是想知道您是否已将mysql Workbench迁移与SQLYog的数据库副本进行了比较吗?从我的快速浏览看来,它们似乎非常相似,但是mysql workbench是一个较新的功能
Wired00

不,我没有尝试过SQLYog。
mmdemirbas 2014年

尚不清楚如何使用MySql工作台从MySQL迁移到SQL Server。我在Workbench中,找不到来自帮助或UI的任何线索。我确实知道MySQL的SSMA对我有用。
subsci 2014年

2
有趣的是,但是该程序捕获了使用大型数据库进行迁移的功能,命令行效果最佳。
Claudionor Oliveira 2015年

1
@mmdemirbas,“ 您可以在MySql和SqlServer之间迁移选定数据库的选定表。 ” OP的问题与SQL Server无关。
sampablokuper

19

我将Navicat用于MySQL ...

它使所有数据库操作变得容易!

您只需在Navicat中选择两个数据库,然后使用。

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1


11

如果您的表位于同一台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;

那其他索引呢?!问题指出,不仅要复制表的数据
而且

9

使用MySql Workbench的导出和导入功能。步骤:
1.选择所需的值

E.g. select * from table1; 
  1. 单击导出按钮,并将其另存为CSV。
  2. 使用与第一个相似的列创建一个新表

    E.g. create table table2 like table1; 
  3. 从新表中全选

    E.g. select * from table2;  
  4. 单击导入,然后选择在步骤2中导出的CSV文件

MySql Workbench中的“导出”和“导入”按钮的示例


1
我认为它仅适用于少于十亿行的表。
Diogo Paim

9

这是另一种简单的方法:

  1. 使用DB1; 显示创建表TB1;
    • 复制剪贴板中的语法以在DB2中创建TB1
  2. 使用DB2;
    • 在此处粘贴语法以创建表TB1

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


谢谢,这帮助我实现了数据库复制的自动化,而无需使用gui程序。
New2HTML

4

尝试mysqldbcopy文档

或者,您可以在目标主机上创建一个“ 联合表 ”。联合表使您可以从其他数据库服务器查看表,就好像它是本地表一样。(文件

创建联合表之后,可以使用通常的方式复制数据。 insert into TARGET select * from SOURCE


1
我已经读过关于联合表的信息,但是Amazon RDS(现在)不支持联合表... XP
Chococroc 2014年

4

使用MySQL Workbench,您可以使用“数据导出”将表仅转储到本地SQL文件(“仅数据”,“仅结构”或“结构和数据”),然后使用“数据导入”将其加载到另一个数据库中。

您可以同时打开多个连接(不同的主机,数据库,用户)。


3

获取所需查询的一种简单方法是使用information_schema和concat中的数据。

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

然后,您将获得如下结果列表:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

然后,您可以只运行那些查询。

但是,它不适用于MySQL Views。您可以通过AND TABLE_TYPE = 'BASE TABLE'在初始查询中追加来避免它们:


1

这是您需要定期执行的事情,还是只需要一次性完成?

您可以进行导出(例如,使用phpMyAdmin或类似方法),将表及其内容脚本化为文本文件,然后可以将其重新导入到另一个数据库中。


我只需要做一次。但是问题是数据库中的表几乎有100万行。数据库转储将是巨大的。另外,当我尝试导出时,仅导出了大约10000行-可能是由于尺寸较大。
Sparky 2012年

啊,是的,这是一个限制。这篇WordPress Codex文章可能有帮助吗?这是一篇有关wordpress的文章,但可能会为您提供一些见识(关于DB太大而phpMyAdmin无法处理的情况,有一节介绍了如何使用命令行转储表)。
Sepster

mysqldump命令行工具对于100万行或数十亿行没有问题-所影响的仅是花费的时间以及结果占用了多少硬盘(假设将其输出到文件中)。我对phpMyAdmin的export命令的经验是,它比mysqldump受到更多限制。
thomasrutter

1

使用以下步骤将某些列从一个数据库表复制并插入到另一数据库表中-

  1. CREATE TABLE表名(列名数据类型(大小),列名数据类型(大小));

2.INSERT INTO db2.tablename SELECT columnname1,columnname2 FROM db1.tablename;


1

首先创建转储。添加了--no-create-info --no-create-db标志(如果table2已经存在):

mysqldump -u user1 -p database1 table1 > dump.sql

然后输入user1密码。然后:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

然后输入user2密码。

与@helmors答案相同,但这种方法更安全,因为密码不会以原始文本形式显示在控制台中(反向i搜索,密码嗅探器等)。如果从脚本文件中执行了适当的权限限制,则可以采用其他方法。


0

IN xampp只是将所需的表导出为.sql文件,然后将其导入到所需的表中


-1

像sakila.customer(Database_name.tablename)一样创建表destination_customer,这只会复制源表的结构,对于数据也要与该结构复制的操作,请从sakila.customer中选择select *创建表destination_customer


这似乎是对一个完全不同的问题的答案。CREATE TABLE LIKE问题没有了,那为什么要说错呢?而且,没有关于该答案如何解决两个用户都无法访问另一个表的问题的解释。
Toby Speight
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.