【问题标题】:How to import only a specific database from a .sql file?如何从 .sql 文件中仅导入特定数据库?
【发布时间】:2022-01-10 12:38:28
【问题描述】:

我有一个文件dump.sql,其中包含许多数据库:mydb1mydb2mydb3 等。

如何只导入mydb3而不导入其他数据库?

不会:

mysql> create database mydb3;
mysql> use mydb3;
mysql> source /path/to/dump.sql;

导入所有数据库?

【问题讨论】:

  • 您需要使用sed将mydb3从您的转储文件中提取到另一个文件中
  • source 无法识别您只需要文件的一个子集。
  • @RickJames 您如何轻松做到这一点?
  • @ErgestBasha 谢谢!出于好奇,sed 是此类任务的适配器吗?您将如何在这里使用它?
  • @Basj - sed 是一个简单的通用命令行编辑器;它可以追溯到 几十年,早在“适配器”一词被发明之前。

标签: mysql dump


【解决方案1】:

您可以使用--one-database 选项或简称-o

mysql ... -o mysb3 < /path/to/dump.sql

请注意,上面链接中的文档页面指出:

此选项是初级的,应谨慎使用。

不过,我认为 mysqldump 创建的转储文件应该足够安全。

注意:这不会运行实际的 CREATE DATABASE ... 语句,因此您必须在导入之前执行此操作。

【讨论】:

  • IHMO 这是不创建另一个文件的最方便的答案。如果你也在这样做 mydb1mydb2 ,并在完成加载 mydb1mydb2 时按 Ctrl-C。
  • 谢谢!如果dump.sql 还包含mydb1,您认为这是安全的,并且不会在当前的mysql 安装中覆盖mydb1
  • @Basj 是的,只要转储是由mysqldump 创建的,或者转储文件的组织方式使得与数据库x 相关的所有内容都以USE x; 开头,它就应该是安全的。跨度>
【解决方案2】:

试试这个:

sed -n '/^-- Current Database: `mydb1`/,/^-- Current Database: `/p' dump.sql > mydb1.sql

其他使用sed获取特定表的方式:

sed -n -e '/CREATE TABLE.*`table_name`/,/CREATE TABLE/p' "dump_file" > table_name.sql

如果您有 .gz.bz2 转储:

gunzip < fulldump.sql.gz | sed -n -e '/DROP TABLE.*`table_name`/,/UNLOCK TABLES/p' | gzip -c > table_name.gz 

sudo bzip2 -d < fulldump.bz2 | sed -n -e '/DROP TABLE.*`table_name`/,/UNLOCK TABLES/p' | bzip2 -z > table_name.gz 

【讨论】:

    【解决方案3】:

    awkperl 也是完成这项任务的好工具。

    awk '/^-- Current Database: `mydb1`/,/^-- Current Database: `/' dump.sql > mydb1.sql
    
    perl -ne 'print if /^-- Current Database: `mydb1`/../^-- Current Database: `/' dump.sql > mydb1.sql
    

    用您的架构名称替换上述示例中的“mydb1”。

    见:

    【讨论】:

      【解决方案4】:

      A 计划:

      回到原来的服务器,只转储mydb3:

      mysqldump ... mydb3 > db3.sql
      
      mysql ... < db3.sql
      

      B计划:

      编辑转储以仅提取所需的语句,然后加载该子集。 sed 是一种方式,大多数编辑是另一种方式;可能还有其他方法。

      注意:小心包含/排除额外的命令,例如DROPUSE等。

      C 计划:

      将整个转储加载到单独的 MySQL 实例中,然后执行计划 A 将数据库复制到最终目的地。

      【讨论】:

      • 谢谢。计划 A 是不可能的,原来的服务器现在已经被清除了,我只有一个文件中所有数据库的转储。您能否详细了解如何将sed 用于 B 计划?
      • @Basj - 30 年前,我可以说出sedawkex 以及其他一些的细节;我已经十多年没有使用过 sed 了。让我们希望其他人会加入。建议您尝试您最喜欢的文本编辑器(不是 Word)。
      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多