【问题标题】:Easiest way to copy a table from one database to another?将表从一个数据库复制到另一个数据库的最简单方法?
【发布时间】:2012-08-27 21:22:25
【问题描述】:

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

我知道我可以使用

INSERT INTO database2.table2 SELECT * from database1.table1

但这里的问题是database1database2 都在不同的MySQL 用户下。所以user1 只能访问database1user2 只能访问database2。有什么想法吗?

【问题讨论】:

  • 您可以向用户授予表级授权。见:dev.mysql.com/doc/refman/5.5/en/grant.html
  • 不幸的是,这在我的情况下不起作用,因为我使用的是 Godaddy 共享托管服务器。他们不允许对数据库做这样的事情。
  • @mmdemirbas 数据库中的一个表有近 100 万行。数据库转储将是巨大的。此外,当我尝试导出时,仅导出了大约 10000 行 - 可能是由于尺寸过大。
  • 我知道您可以使用 RENAME 来移动表格,而且速度非常快。复制表格是否有等效的技巧?
  • 顺便说一句:您需要注意两个表中的字段列表的顺序相同。否则,必须按名称从 database1 中的表中选择字段,以便它们映射到 database2 中表中的正确字段。这个问题出现在我备份的数据库中,其中 table1 在初始创建后被修改,以及从 mysqldump 文件创建的新数据库。

标签: mysql database


【解决方案1】:

对我来说,我需要为“information_schema.TABLES”指定特定的架构

例如。

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

【讨论】:

  • 嗨 poomcyber,您能否确认您的帖子是试图通过解决方案回答页面顶部的问题?对我来说,它给人的印象是请求帮助解决您自己的类似但略有不同的问题。
【解决方案2】:

对我来说效果很好

CREATE TABLE dbto.table_name like dbfrom.table_name;
insert into  dbto.table_name select * from dbfrom.table_name;

【讨论】:

    【解决方案3】:

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

    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 回答相同,但该方法更安全,因为密码不会以原始文本形式暴露给控制台(反向搜索、密码嗅探器等)。如果它是从一个脚本文件执行的,并且对其权限施加了适当的限制,那么其他方法也可以。

    【讨论】:

      【解决方案4】:

      create tabledestination_customer like sakila.customer(Database_name.tablename),这只会复制源表的结构,对于数据也要复制到结构中这样做create table destination_customer as select * from sakila.customer

      【讨论】:

      • 这似乎是对一个完全不同的问题的回答。问题中没有CREATE TABLE LIKE,那么为什么要提到它是错误的呢?并且没有解释如何这个答案解决了两个用户都无法访问另一个用户的表的问题。
      【解决方案5】:

      获取所需的所有查询的一种简单方法是使用 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 视图。您可以通过在初始查询中附加 AND TABLE_TYPE = 'BASE TABLE' 来避免它们:

      【讨论】:

        【解决方案6】:

        这是另一种简单的方法:

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

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

        【讨论】:

        • 这帮助我自动复制数据库,而无需使用 gui 程序,谢谢。
        【解决方案7】:

        我知道这是个老问题,只是回答一下,以便任何登陆这里的人都能获得更好的方法。

        从 5.6.10 开始,您可以这样做

        CREATE TABLE new_tbl LIKE orig_tbl;
        

        请参阅此处的文档:https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

        【讨论】:

        • 它不会复制数据!阅读您引用的文档: > **CREATE TABLE ... LIKE 不保留任何数据 **
        【解决方案8】:

        如果您的表在同一个 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】:

        IN xampp只是将需要的表导出为.sql文件,然后导入到需要的地方

        【讨论】:

          【解决方案10】:

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

          DB1 & DB2
          

          DB1 有一个表 users,您想将其复制到 DB2

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

          在此页面上,点击右上角的“操作”标签。 在 Operations 下,查找 Copy table to (database.table) 部分:

          &你完成了!

          【讨论】:

          • 太简单了!这是我可以庆祝懒惰的时候!
          • 你节省了我的时间..我在做幼稚的方法..先导出然后导入。
          • 其他答案都不起作用,只有你的也能复制索引
          • 如果表特别大,即超过 4 GB,这将不起作用。例如,我有一个 22GB 的表,phpMyAdmin 无法使用。
          • 完美答案。不知道phpmyadmin的这个功能。
          【解决方案11】:

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

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

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

          【讨论】:

            【解决方案12】:

            使用 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 文件

            【讨论】:

            • 它只适用于我认为少于十亿行的表。
            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

              试试mysqldbcopy (documentation)

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

              创建联邦表后,就可以用常用的insert into TARGET select * from SOURCE复制数据了

              【讨论】:

              • 我读过有关联合表的信息,但 Amazon RDS(现在)不支持它... XP
              【解决方案15】:

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

              您可以执行导出(例如使用 phpMyAdmin 或类似方法),将您的表格及其内容编写到文本文件中,然后您可以将其重新导入其他数据库。

              【讨论】:

              • 我只需要做一次。但问题是数据库中的表有近 100 万行。数据库转储将是巨大的。此外,当我尝试导出时,仅导出了大约 10000 行 - 可能是由于尺寸过大。
              • 啊,是的,这是一个限制。 This WordPress Codex article 可能有帮助吗?这是一篇 wordpress 文章,但可能会为您提供一些见解(有一节介绍如何使用命令行转储表,以防数据库太大而 phpMyAdmin 无法处理)。
              • mysqldump 命令行工具在处理 100 万行或数十亿行时没有问题 - 所影响的只是它花费了多少时间以及结果占用了多少硬盘驱动器(假设您输出它到一个文件)。我对 phpMyAdmin 的导出命令的经验是,它比 mysqldump 受限得多。
              【解决方案16】:

              我使用 Navicat for MySQL...

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

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

               INSERT INTO Database2.Table1 SELECT * from Database1.Table1
              

              【讨论】:

              • 在 SequelPro 上使用并完美运行。谢谢。
              【解决方案17】:

              CREATE TABLE db1.table1 SELECT * FROM db2.table1

              其中 db1 是目标,db2 是源

              【讨论】:

              • 如果两个用户没有相互选择数据的权限,这是否有效?
              • 这不会在不同的mysql服务器上工作吗?
              • 这不会复制索引
              • @Beryllium 不,这要求用户拥有两个数据库的权限。 jaminator 不,这不适用于不同的服务器,但我认为问题不是在问这个问题。 bcoughlan 你是对的。这是这种方法的一个大缺陷:它没有正确地保留表结构。
              • 复制的表没有设置主键和自增。你必须在ALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT; 之后运行它
              【解决方案18】:

              MySql Workbench:强烈推荐

              这将轻松处理迁移问题。您可以在 MySql 和 SqlServer 之间迁移选定数据库的选定表。你一定要试一试。

              【讨论】:

              • 我要试一试,我已经设置好了,但想知道您是否将mysql Workbench 迁移与SQLYog 的数据库副本进行了比较?从我的快速浏览来看,它们似乎非常相似,但 mysql 工作台是一个较新的功能
              • 不,我没有尝试 SQLYog。
              • 很有趣,但是程序在使用大型数据库进行迁移时遇到了问题,命令行效果最好。
              • @mmdemirbas,“您可以在 MySql 和 SqlServer 之间迁移选定数据库的选定表。”不过,OP 的问题与 SQL Server 无关。
              • 我的意思是这个工具支持 OP 要求的 MySQL 到 MySQL 的迁移,并且还支持 MySQL 到 SQLServer、SQLServer 到 MySQL、SQLServer 到 SQLServer 的迁移。我想让其他搜索类似解决方案以其他方式使用的人明确说明。
              【解决方案19】:

              如果您有 shell 访问权限,您可以使用mysqldump 转储database1.table1 的内容并将其通过管道传送到mysqldatabase2。这里的问题是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 已经存在,您可以将参数添加到第一个不允许创建 table-creates 的 mysqldump。

              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 您可以使用任何级联用户选项文件,通常是您的本地~/.my.cnf 文件,来存储用户和密码信息,而不必在命令本身中显示这些值。见dev.mysql.com/doc/refman/8.0/en/option-files.html
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多