如何从 .sql 文件中仅导入特定数据库?
Posted
技术标签:
【中文标题】如何从 .sql 文件中仅导入特定数据库?【英文标题】:How to import only a specific database from a .sql file? 【发布时间】:2022-01-10 12:38:28 【问题描述】:我有一个文件dump.sql
,其中包含许多数据库:mydb1
、mydb2
、mydb3
等。
如何只导入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 这是不创建另一个文件的最方便的答案。如果你也在这样做mydb1
或 mydb2
,并在完成加载 mydb1
或 mydb2
时按 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】:awk
和 perl
也是完成这项任务的好工具。
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
是一种方式,大多数编辑是另一种方式;可能还有其他方法。
注意:小心包含/排除额外的命令,例如DROP
、USE
等。
C 计划:
将整个转储加载到单独的 MySQL 实例中,然后执行计划 A 将数据库复制到最终目的地。
【讨论】:
谢谢。计划 A 是不可能的,原来的服务器现在已经被清除了,我只有一个文件中所有数据库的转储。您能否详细了解如何将sed
用于 B 计划?
@Basj - 30 年前,我可以说出sed
、awk
、ex
以及其他一些的细节;我已经十多年没有使用过 sed 了。让我们希望其他人会加入。建议您尝试您最喜欢的文本编辑器(不是 Word)。以上是关于如何从 .sql 文件中仅导入特定数据库?的主要内容,如果未能解决你的问题,请参考以下文章