Praveen Prasannan Asked: 2011-12-07 23:33:46 +0800 CST2011-12-07 23:33:46 +0800 CST 2011-12-07 23:33:46 +0800 CST 用不同的名称恢复mysql数据库 772 我们如何从 mysqldump 文件中恢复具有不同名称的 mysql 数据库。我不想打开转储文件并对其进行编辑。还有其他更好的方法吗? mysql backup restore 8 个回答 Voted Best Answer RolandoMySQLDBA 2011-12-08T08:10:01+08:002011-12-08T08:10:01+08:00 您可以让 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 您可以通过以下四 (4) 种方式之一将其加载到另一个数据库(例如 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 试试看 !!! Sverre 2014-07-04T02:32:18+08:002014-07-04T02:32:18+08:00 我是转储、编辑和插入的忠实粉丝。但是您不必打开文本文件(转储文件)来更改它(这在它有几百万行长时特别有用)。如果你想转储数据库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 年内编辑我的答案。 Neo 2014-12-28T13:45:14+08:002014-12-28T13:45:14+08:00 如果您使用以下两条规则进行转储: 不要使用 , 和 等选项--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 Victor 2011-12-08T03:44:36+08:002011-12-08T03:44:36+08:00 我做过一次,很久以前。 当您导出所有数据时,可以选择在文件开头设置数据库名称,例如:“使用数据库 x” 因此,您可以更改此声明。 bksunday 2015-07-21T15:29:51+08:002015-07-21T15:29:51+08:00 如果该文件是您手头的文件,并且您正在从 shell / 控制台操作它,我将使用sed以 , 和 optionnally 开头的行进行字符串替换CREATE DABATASE(CREATE TABLEmysqldumpUSE注释--) 替换与 Create Database、Create Table、Use 和 mysqldump 注释匹配的行上的 db 名称 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 行,那就更容易了。意思是 options --all-databases,--databases或者它们的简短版本,-A或者-B没有被使用。 Anthony O. 2021-09-29T10:39:43+08:002021-09-29T10:39:43+08:00 这是仅恢复$DB_FROM从$BACKUP_FILE备份文件命名的数据库的命令,恢复后的数据库名称$DB_TO(而不是$DB_FROM): (sed '/^-- Current Database: `/q' "$BACKUP_FILE"; sed -n "/^-- Current Database: \`$DB_FROM\`/,/^-- Current Database: \`/p" "$BACKUP_FILE") | sed "s/\`$DB_FROM\`/\`$DB_TO\`/g" | mysql -u root -p 我的回答受到了这个以及这个和这个网页的启发。 我在这里回答了一个类似的问题 Quốc Việt Nguyễn 2020-11-10T23:50:11+08:002020-11-10T23:50:11+08:00 如果您使用 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" user226671 2021-07-30T02:05:59+08:002021-07-30T02:05:59+08:00 您问是否可以“从 mysqldump 文件中恢复具有不同名称的 mysql 数据库”。 答案是,如果您定义了具有显式模式名称的触发器,则不应恢复到另一个数据库,这是由于 mysqldump 错误,至少在不转换转储的情况下(见下文)。 (这是简短的答案。您可能不喜欢它,您可以投反对票,但您没有理由像删除它一样删除它,因为它确实回答了这个问题,尽管是否定的,但需要了解一个关键事实)。 当触发器定义为 (CREATE TRIGGER mydbname.mytriggername ...) 时,mysqldump 将在转储中包含此“mydbname”,而不管任何转储选项。 如果您想先修复,则无法从 information_schema.triggers 中检测到触发器名称中的细微差别。 这使得转储无法在 altername db name 上恢复,或者更糟糕的是,如果存在此类模式,则可能会在错误的位置恢复触发器。 要继续回答,如果您没有触发器,或者它们在定义时没有使用架构名称,那么您可以恢复没有 --databases 的转储。(就像上面提到的答案)。 否则,有一种方法可以在导入之前清理转储。您必须“sed”它才能删除架构名称: sed 's/\/\*!50003 TRIGGER `mydbname`\./\/\*!50003 TRIGGER /g' 由于实际上没有人会针对这个问题检查转储,因此不建议盲目地按照此处给出的说明导入转储;您可能会损坏产品环境。
您可以让 mysqldump 以不创建或选择数据库的方式创建转储。
示例:您正在转储数据库 db1 并将其加载到数据库 db2
这会将 CREATE DATABASE 和 USE 命令放入转储中
这不会放入 CREATE DATABASE 和转储中的 USE 命令(这是你想要的)
您可以通过以下四 (4) 种方式之一将其加载到另一个数据库(例如 db2)中:
选项1
选项 2
选项 3
选项 4
试试看 !!!
我是转储、编辑和插入的忠实粉丝。但是您不必打开文本文件(转储文件)来更改它(这在它有几百万行长时特别有用)。如果你想转储数据库
MYDATABASE
。然后使用 sed 用这样的新名称替换旧的数据库名称
然后您可以简单地创建新数据库并再次导入它,它将在新数据库中创建所有表 MYNEWDATABASE'
编辑:就像评论部分的一些好人指出的那样,这可能很危险,如果某些数据也被上面的这个改变了,那么,要避免这种情况的具体方法是。
1)在转储中为这个grep,在你改变它之前,像这样。
和
2)我们可以添加一些`以使其更安全,如下所示:
如果其他人有具体建议,我很乐意在 4 年内编辑我的答案。
如果您使用以下两条规则进行转储:
--databases
,--database
只需将数据库名称放在命令末尾而不使用这些选项。--no-create-db
如果您执行以下操作,那么 mysqldump 将在不引用数据库的情况下创建 SQL,那么您可以在导入期间在 mysql 命令末尾使用新的数据库名称!
我做过一次,很久以前。
当您导出所有数据时,可以选择在文件开头设置数据库名称,例如:“使用数据库 x”
因此,您可以更改此声明。
如果该文件是您手头的文件,并且您正在从 shell / 控制台操作它,我将使用
sed
以 , 和 optionnally 开头的行进行字符串替换CREATE DABATASE
(CREATE TABLE
mysqldumpUSE
注释--
)替换与 Create Database、Create Table、Use 和 mysqldump 注释匹配的行上的 db 名称
当然,就像这里提到的许多答案一样,如果 mysqldump 备份不包含 CREATE DATABASE 和 USE 行,那就更容易了。意思是 options
--all-databases
,--databases
或者它们的简短版本,-A
或者-B
没有被使用。这是仅恢复
$DB_FROM
从$BACKUP_FILE
备份文件命名的数据库的命令,恢复后的数据库名称$DB_TO
(而不是$DB_FROM
):我的回答受到了这个以及这个和这个网页的启发。
我在这里回答了一个类似的问题
如果您使用 macOS 和 MySQLWorkbench。首先将数据库导出到单个 .sql 文件中。然后使用“数据导入”工具。它将显示错误,因为新的数据库名称与导出的名称不匹配。您必须在日志上复制整个执行命令,并且:
示例: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"
您问是否可以“从 mysqldump 文件中恢复具有不同名称的 mysql 数据库”。
答案是,如果您定义了具有显式模式名称的触发器,则不应恢复到另一个数据库,这是由于 mysqldump 错误,至少在不转换转储的情况下(见下文)。
(这是简短的答案。您可能不喜欢它,您可以投反对票,但您没有理由像删除它一样删除它,因为它确实回答了这个问题,尽管是否定的,但需要了解一个关键事实)。
当触发器定义为 (CREATE TRIGGER mydbname.mytriggername ...) 时,mysqldump 将在转储中包含此“mydbname”,而不管任何转储选项。
如果您想先修复,则无法从 information_schema.triggers 中检测到触发器名称中的细微差别。
这使得转储无法在 altername db name 上恢复,或者更糟糕的是,如果存在此类模式,则可能会在错误的位置恢复触发器。
要继续回答,如果您没有触发器,或者它们在定义时没有使用架构名称,那么您可以恢复没有 --databases 的转储。(就像上面提到的答案)。
否则,有一种方法可以在导入之前清理转储。您必须“sed”它才能删除架构名称:
由于实际上没有人会针对这个问题检查转储,因此不建议盲目地按照此处给出的说明导入转储;您可能会损坏产品环境。