我们如何从mysqldump文件中恢复具有不同名称的mysql数据库。我不想打开转储文件并对其进行编辑。还有其他更好的方法吗?
我们如何从mysqldump文件中恢复具有不同名称的mysql数据库。我不想打开转储文件并对其进行编辑。还有其他更好的方法吗?
Answers:
您可以让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
试试看 !!!
我非常喜欢转储,编辑和插入。但是您不必打开文本文件(转储文件)来更改它(当它长几百万行时,这尤其有用)。如果要转储数据库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年修改答案。
sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql
)之前,请检查MYDATABASE的所有出现情况,cat mydump.sql | grep "MYDATABASE"
以确保仅更改了数据库名称,而其他数据保持不变。
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql
#可能更安全的Steam编辑。我的数据库转储不包含任何USE或CREATE DATABASE语句,但是数据库名称在sql注释,视图和触发器中(MySQL 5.7)。这不会替换注释中的数据库名称,但是它们对结果数据库没有影响。这对我来说很好。
如果该文件是你手头有和你从一个shell /控制台操纵的话,我会用sed
做字符串替换上线开始CREATE DABATASE
,CREATE TABLE
,USE
和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
使用。
--no-create-db
或没有--database
或也没有--databases
。
如果使用以下两个规则进行转储:
--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
--no-create-db
或没有--database
或也没有--databases
。
-Ddb2
感到困扰,则不要在其前面加上连字符。至少,包含它时,我遇到了MySQL语法错误。