AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 8869
Accepted
Praveen Prasannan
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 8 个回答
  • 120586 Views

8 个回答

  • Voted
  1. 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
    

    试试看 !!!

    • 80
  2. 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 年内编辑我的答案。

    • 11
  3. Neo
    2014-12-28T13:45:14+08:002014-12-28T13:45:14+08:00

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

    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
    
    • 5
  4. Victor
    2011-12-08T03:44:36+08:002011-12-08T03:44:36+08:00

    我做过一次,很久以前。

    当您导出所有数据时,可以选择在文件开头设置数据库名称,例如:“使用数据库 x”

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

    • 3
  5. 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没有被使用。

    • 3
  6. 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
    

    我的回答受到了这个以及这个和这个网页的启发。

    我在这里回答了一个类似的问题

    • 0
  7. 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"

    • -1
  8. 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'
    

    由于实际上没有人会针对这个问题检查转储,因此不建议盲目地按照此处给出的说明导入转储;您可能会损坏产品环境。

    • -1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve