用不同的名称恢复mysql数据库

Pra*_*nan 52 mysql mysql-5 mysqldump backup restore

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

Rol*_*DBA 75

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

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

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

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql
Run Code Online (Sandbox Code Playgroud)

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

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
Run Code Online (Sandbox Code Playgroud)

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

选项1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2
Run Code Online (Sandbox Code Playgroud)

选项 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql
Run Code Online (Sandbox Code Playgroud)

选项 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql
Run Code Online (Sandbox Code Playgroud)

选项 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql
Run Code Online (Sandbox Code Playgroud)

试一试 !!!


Sve*_*rre 8

我是转储、编辑和插入的忠实粉丝。但是您不必打开文本文件(转储文件)来更改它(这在几百万行长时特别有用)。如果要转储数据库MYDATABASE

mysqldump MYDATABASE > mydump.sql
Run Code Online (Sandbox Code Playgroud)

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

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql
Run Code Online (Sandbox Code Playgroud)

然后您可以简单地创建新数据库并再次导入它,它将在新数据库中创建所有表 MYNEWDATABASE'

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql
Run Code Online (Sandbox Code Playgroud)

编辑:就像评论部分的一些好人指出的那样,这可能是危险的,如果上面的某些数据也被更改了,那么,要具体地避免这种情况。

1) 在你改变它之前,在转储中为这个 grep,就像这样。

cat mydump.sql | grep "MYDATABASE"
Run Code Online (Sandbox Code Playgroud)

2) 我们可以添加一些 ` 以使其更安全,如下所示:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql
Run Code Online (Sandbox Code Playgroud)

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


Neo*_*Neo 8

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

  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
Run Code Online (Sandbox Code Playgroud)


小智 6

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

替换与 Create Database、Create Table、Use 和 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
Run Code Online (Sandbox Code Playgroud)


当然,就像这里提到的许多答案一样,如果 mysqldump 备份不包含 CREATE DATABASE 和 USE 行,那就更容易了。意味着选项--all-databases或其--databases简短版本-A-B未使用。