如何从 .sql 文件中仅导入特定数据库?

Posted

技术标签:

【中文标题】如何从 .sql 文件中仅导入特定数据库?【英文标题】:How to import only a specific database from a .sql file? 【发布时间】: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 是一个简单的通用命令行编辑器;它可以追溯到 几十年,早在“适配器”一词被发明之前。 【参考方案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”。

见:

https://www.shellhacks.com/sed-awk-print-lines-between-two-patterns/ https://***.com/questions/38972736/how-to-print-lines-between-two-patterns-inclusive-or-exclusive-in-sed-awk-or

【讨论】:

【参考方案4】:

A 计划:

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

mysqldump ... mydb3 > db3.sql

mysql ... < db3.sql

B计划:

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

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

C 计划:

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

【讨论】:

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

以上是关于如何从 .sql 文件中仅导入特定数据库?的主要内容,如果未能解决你的问题,请参考以下文章

使用 `importlib` 从 Python 模块中仅导入特定类

如何从 UWP 类中仅访问一种特定方法?

我如何从特定的多数组中仅获取八月的数据[重复]

SQL - 在特定条件下从多行中仅选择一个值

在 SQL 中仅选择特定字符之后的数字字符

如何使用 VBA 从混乱的 CSV 导入数据