问答中心分类: DATABASE如何快速重命名 MySQL 数据库(更改架构名称)?
0
Csa77 提问 1月 前

MySQL 手册位于MySQL涵盖了这一点。
通常我只是转储数据库并用新名称重新导入它。对于非常大的数据库,这不是一个选项。显然RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 做坏事,只存在于少数几个版本中,总体上是个坏主意.
这需要与InnoDB,它存储的东西与MyISAM.

Yves Martin 回复 1月 前

这个语句 RENAME DATABASE 语法是在 MySQL 5.1.7 中添加的,但被发现是危险的,并在 MySQL 5.1.23 中被删除。

Yves Martin 回复 1月 前

希望 MySQL 将实现一个新的、有效的RENAME DATABASE没有任何危险的声明,因为目前没有简单的方法来完成这项任务。没有明显的理由说明它是危险的文件所以他们应该能够进行更换。至少人们在他们的网站上放置了功能请求错误。例如,bugs.mysql.com/bug.php?id=58593bugs.mysql.com/bug.php?id=1698.

Yves Martin 回复 1月 前

链接现在断开了…

29 Answers
0
hendrasaputra 回答 1月 前

使用这几个简单的命令:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

或者按照@Pablo Marin-Garcia 的建议来减少 I/O:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
pilcrow 回复 1月 前

正如 OP 所说,“[t] 这不是非常大的数据库的选择。”

Pavel Radzivilovsky 回复 1月 前

不要忘记删除原始数据库

Steve Chambers 回复 1月 前

绝妙的答案!一些进一步改进的建议,因为这可能正在被所有能力所搜索:(1)将 Pablo Marin-Garcia 的代码片段移到顶部,因为它似乎是最好的答案(2)放-p<password>代替-p无处不在,因此语句运行时不会出现提示。

Ryan 回复 1月 前

使用管道版本,我得到两个“输入密码:”提示,如下所示:Enter password: Enter password:它似乎需要一个密码,但不能同时使用。我错过了一个细节吗?

Carlos P 回复 1月 前

我很惊讶没有人提到这一点,但你真的应该添加--routines标记到 mysqldump 命令,以确保复制存储过程。

user7161651 回复 1月 前

我倾向于使用SQLyog图形用户界面。 1) 创建一个具有所需名称的新数据库,然后使用“复制到不同的主机/数据库”功能复制旧数据库。 2) 将数据库导出为 sqldump,然后使用“工具”菜单中的“执行 SQL 脚本”选项导入

Tom Wilson 回复 1月 前

首选此解决方案,因为不必遍历所有表非常方便。虽然有人说这不是“大型”数据库的最佳选择,但没有人从数量上描述这意味着什么。我的建议是先尝试这种方式。您的数据库可能不是您认为的庞然大物。最坏的情况可能是磁盘满的问题,所以你应该准备好处理它。

Björn 回复 1月 前

从 Windows 命令 (cmd.exe) 启动 mysqldump 时,您需要以管理员身份运行它(否则会显示“访问被拒绝”)。

0
raphie 回答 1月 前

我认为解决方案更简单,并且是一些开发人员建议的。 phpMyAdmin 对此有一个操作。
从 phpMyAdmin 中,选择您要选择的数据库。在选项卡中有一个称为操作,转到重命名部分。就这样。
正如许多人建议的那样,它确实使用新名称创建了一个新数据库,将旧数据库的所有表转储到新数据库中并删除旧数据库。
在此处输入图像描述

Chris 回复 1月 前

假设您甚至在您的环境中有 php 或使用 phpmyadmin。

mozboz 回复 1月 前

即使你有 phpMyAdmin 也很危险 – 后端可能会在进程中失败,使两个数据库处于未知状态,或者可能需要很长时间,导致前端挂起或 PHP 超时。

raphie 回复 1月 前

这是真的@mozboz,但我已经这样做了 10 年,从来没有遇到过这个问题。如果您通过外壳运行命令并且您的计算机崩溃,则相同。有可能,但什么? 1 到 1 万亿?

Greg 回复 1月 前

通过控制台的脚本也是一个可以挂起相同问题的前端。

Teodor Sandu 回复 1月 前

然而,控制台操作比 PhpMyAdmin 可靠得多,尤其是在涉及大型数据库的情况下,这是 OP 的情况。如果你有一个相当大的数据库,我个人强烈建议使用任何控制台方法而不是 PMA。不用说,在小型数据库上 PMA 也同样出色。

Danny Staple 回复 1月 前

控制台操作也可以通过使用 gnu screen 运行它们来防止网络挂断和丢失。

Andrew Magill 回复 1月 前

关于这些不同的问题,似乎有两个明显的解决方案。 1 – 始终首先在您的开发环境中进行测试。 2 – 您可以复制到新名称,而不是重命名。您始终可以回滚到原始数据库。

raphie 回复 1月 前

@AyexeM 这是完全正确的,无论您打算执行什么过程,您使用它的环境或工具总是需要备份或复制数据。根据数据量恢复数据通常很快。同意。

ihightower 回复 1月 前

这个答案是一个很好的答案.. 特别是当我所做的只是在 php 和 phpmyadmin 中测试一些书本练习时。我错误地命名了我的数据库……并创建了一些表……现在我所要做的就是重命名数据库……瞧……工作完成了。

Domi 回复 1月 前

phpmyadmin 是一个严谨的工具。我希望他们将这个功能实现为适当的酸交易,通过使用日志记录和遇到错误时重新滚动?我实际上并没有检查过。

TheSatinKnight 回复 1月 前

我已经使用 phpMyAdmin 对许多不同大小的数据库进行了此操作。迄今为止,我从未失败过。警告:我们只使用 MyISAM,在我们的任何系统中都没有 InnoDB 表(好吧,有一些小例外)。

Paul Chris Jones 回复 1月 前

我收到错误“./libraries/operations.lib.php#361 中的通知。未定义的变量:sql_query。回溯 ./db_operations.php#69:PMA_createDbBeforeCopy()”

Sazzad 回复 1月 前

我的天啊!我的数据库被删除了,新的数据库还没有创建,一切都消失了:)

0
ErichBSchulz 回答 1月 前

您可以使用 SQL 生成 SQL 脚本,以将源数据库中的每个表传输到目标数据库。
您必须在运行从该命令生成的脚本之前创建目标数据库。
您可以使用这两个脚本中的任何一个(我最初建议使用前者,而有人“改进”了我使用的答案GROUP_CONCAT.随你选,但我更喜欢原版):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

或者

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

($1 和 $2 分别是源和目标)
这将生成一个您必须运行的 SQL 命令。
注意GROUP_CONCAT具有大量表的数据库可能会超过默认长度限制。您可以通过运行更改该限制SET SESSION group_concat_max_len = 100000000;(或其他一些大数字)。

tuxayo 回复 1月 前

@BlakeFrederick 它不使用 RENAME DATABASE 那么有什么问题?

dolmen 回复 1月 前

如果表有引用约束,这是否有效?我希望不会。

0
Marciano 回答 1月 前

模仿失踪者RENAME DATABASEMySQL中的命令:

  1. 创建一个新数据库
  2. 使用以下命令创建重命名查询:
    SELECT CONCAT('RENAME TABLE ',table_schema,'.`',table_name,
         '` TO ','new_schema.`',table_name,'`;')
     FROM information_schema.TABLES
     WHERE table_schema LIKE 'old_schema';
  3. 运行该输出
  4. 删除旧数据库

它取自模拟 MySQL 中缺少的 RENAME DATABASE 命令.

Philipp 回复 1月 前

完美的!我用 InnoDB 和 MyISAM 表对此进行了测试。我测试过的最快的解决方案(重命名表几乎是即时的,没有延迟)!

Navidot 回复 1月 前

伟大的!请记住事后修复权限。

Navidot 回复 1月 前

附言。如果您正在使用实时数据库,最好在运行重命名查询之前执行此操作。

dolmen 回复 1月 前

如果表有引用约束,这是否有效?我希望不会。

dankilev 回复 1月 前

这是一个很好的解决方案,尤其是当您不必移动存储过程、触发器和事件时。

0
Grijesh Chauhan 回答 1月 前

你可以使用这个 shell 脚本:
参考:如何重命名 MySQL 数据库?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

它正在工作:

$ sh rename_database.sh oldname newname
Lex 回复 1月 前

小心这个。如果您没有使用 root 用户登录,您的权限可能有限。导致重命名失败但删除成功导致数据库删除。否则很好的脚本。

Mikkel 回复 1月 前

我添加了set -e到脚本的开头,这将导致执行在失败时终止,并应缓解该问题。

pymen 回复 1月 前

在中间的某个地方,我在第 1 行收到错误 ERROR 1435 (HY000): Trigger in wrong schema

Grijesh Chauhan 回复 1月 前

@pymen 你可以分享相同的屏幕截图吗?