我不想打开转储文件并对其进行编辑。还有其他更好的方法吗?
#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 DABATASE
,CREATE TABLE
,USE
和可选的--
开头的行上进行字符串替换(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
。#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”
评论
在MySQL 5.7中,mysqldump甚至在具有--no-create-db且不具有--database或--databases的情况下,都在触发器和视图中包含数据库名称。
–乔纳森
19-10-7的2:10