我们如何从mysqldump文件中恢复具有不同名称的mysql数据库。
我不想打开转储文件并对其进行编辑。还有其他更好的方法吗?

#1 楼

您可以让mysqldump以不创建或选择数据库的方式创建转储。

示例:您正在转储数据库db1并将其加载到数据库db2

这会将CREATE DATABASE和USE命令放入转储中。

 mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql
 


此不会在转储中放入CREATE DATABASE和USE命令(这就是您想要的)。

 mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
 


可以通过以下四种方式之一将其加载到另一个数据库(例如db2)中:

选项1

 $ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2
 


选项2

 $ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql
 


选项3

 $ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql
 


选项4

 $ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql
 


尝试一下! br />

#2 楼

我非常喜欢转储,编辑和插入。但是您不必打开文本文件(转储文件)来更改它(当它长几百万行时,这尤其有用)。如果要转储数据库MYDATABASE

mysqldump MYDATABASE > mydump.sql


,则使用sed将新的旧数据库名称替换为这样的新名称

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql


,那么您可以简单地创建新数据库并再次导入它,它将在新的数据库MYNEWDATABASE中创建所有表,并具有新的数据库名称。

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql


编辑:就像评论部分中的一些好人指出的那样,如果某些数据也被上面的内容更改了,那么这很危险,因此,为避免这种情况提供一种具体的方法。

1 )像这样在更改之前在转储中使用Grep。

cat mydump.sql | grep "MYDATABASE"




2)我们可以添加一些`使其更安全:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql


如果其他人有具体建议,我很乐意再过4年修改答案。

#3 楼

很久以前,我已经做过一次。

导出所有数据时,有一个选项可以在文件开头设置数据库名称,例如:“ use database x”

因此,您可以更改此声明。

#4 楼

如果文件是您手头的文件,并且是从shell /控制台操作的文件,我将使用sed在以CREATE DABATASECREATE TABLEUSE和可选的--开头的行上进行字符串替换(mysqldump注释)

在与“创建数据库”,“创建表”,“使用”和“ mysqldump”注释匹配的行上替换数据库名称。

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile



当然,这里提到的许多答案,如果mysqldump备份不包含CREATE DATABASE和USE行,则会更容易。表示未使用选项--all-databases--databases或它们的短版本-A-B

评论


在MySQL 5.7中,mysqldump甚至在具有--no-create-db且不具有--database或--databases的情况下,都在触发器和视图中包含数据库名称。

–乔纳森
19-10-7的2:10

#5 楼

如果使用以下两个规则进行转储:不要使用诸如--databases--database之类的选项,只需将数据库名称放在命令末尾而不使用这些选项。
包括选项--no-create-db

如果执行以下操作,则mysqldump将在不引用数据库的情况下创建SQL,然后可以在导入过程中在mysql命令末尾使用新的数据库名称!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name


评论


在MySQL 5.7中,mysqldump甚至在具有--no-create-db且不具有--database或--databases的情况下,都在触发器和视图中包含数据库名称。

–乔纳森
19-10-7的2:09

#6 楼

这是Shell脚本,可让您随时为所有架构名称添加后缀/词缀。

http://snippets.dzone.com/posts/show/13749

评论


代码的可用链接已失效。

– Michael Minter
17年5月11日在0:35

@shantanuo-如果您可以找到丢失代码的替代物,请更新您的答案。谢谢!

– Max Vernon♦
20 Dec 15'在11:57

#7 楼

如果您使用macOS和MySQLWorkbench。首先将数据库导出到单个.sql文件中。然后使用“数据导入”实用程序。由于新的数据库名称与导出的数据库名称不匹配,因此将显示错误。您必须在日志上复制整个执行命令,然后:

替换--database标志
删除--defaults-file标志

示例:sudo /Applications/MySQLWorkbench.app/Contents/MacOS/mysql --protocol = tcp --host = localhost --user = root --port = 3306 --default-character-set = utf8 --comments --database = ion_development < “ /Users/2359media/dumps/Dump20201110.sql”