用不同的名称还原mysql数据库


Answers:


58

您可以让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

试试看 !!!


万一其他人为此-Ddb2感到困扰,则不要在其前面加上连字符。至少,包含它时,我遇到了MySQL语法错误。
gwg

这似乎不起作用。我的转储没有CREATE或USE数据库,但其中仍然有数据库,ALTER DATABASE ... CHARACTER SET ...这破坏了我的导入。编辑:Oracle基本上忽略了该错误
mpen

5

我非常喜欢转储,编辑和插入。但是您不必打开文本文件(转储文件)来更改它(当它长几百万行时,这尤其有用)。如果要转储数据库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年修改答案。


我认为问题是关于还原一个高级数据库,但名称不同,而不仅仅是在现有数据库中复制一个表。
Michael Green

3
需要sed部分
Steve Buzonas 2015年

10
此命令是一个坏主意,如果可以的话,我将投弃权票。如果要替换字符串,请至少将CREATE TABLE和USE行匹配,这样就不会替换任何其他数据。
bksunday

1
在运行sed命令(sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql)之前,请检查MYDATABASE的所有出现情况,cat mydump.sql | grep "MYDATABASE"以确保仅更改了数据库名称,而其他数据保持不变。
拉法夫·塔辛

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql #可能更安全的Steam编辑。我的数据库转储不包含任何USE或CREATE DATABASE语句,但是数据库名称在sql注释,视图和触发器中(MySQL 5.7)。这不会替换注释中的数据库名称,但是它们对结果数据库没有影响。这对我来说很好。
乔纳森

3

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

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

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


3

如果该文件是你手头有和你从一个shell /控制台操纵的话,我会用sed做字符串替换上线开始CREATE DABATASECREATE TABLEUSE和optionnally --(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
乔纳森

2

如果使用以下两个规则进行转储:

  1. 不要使用诸如--databases,等选项--database,而只需将数据库名称放在命令末尾而不使用这些选项。
  2. 包括选项 --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
乔纳森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.