重命名MySQL数据库

117

我创建了一个名为hrms的数据库。现在我需要将数据库名称更改为sunhrm。但是,在MySQL workbench中该功能已禁用。我能否在Linux服务器上进行此操作?


你使用的是哪个版本的 MySQL? - Joachim Isaksson
@Joachim Isaksson 我正在使用mysql 5.5版本。 - Dhileepan
也可以在Serverfault上查看:http://serverfault.com/questions/195221/how-to-rename-a-mysql-database - Yves Martin
希望MySQL能够实现一个新的、可靠的“RENAME DATABASE”语句,不会有任何危险,因为当前没有简单的方法来执行此任务。在文档中并没有明显的危险原因,所以他们应该能够进行替换。至少人们已经在他们的网站上发布了功能请求错误。例如,http://bugs.mysql.com/bug.php?id=58593 和 http://bugs.mysql.com/bug.php?id=1698。 - Edward
11个回答

71

如果您需要从命令行执行此操作,只需复制、修改并粘贴此片段:

mysql -e "CREATE DATABASE \`new_database\`;"
for table in `mysql -B -N -e "SHOW TABLES;" old_database`
do 
  mysql -e "RENAME TABLE \`old_database\`.\`$table\` to \`new_database\`.\`$table\`"
done
mysql -e "DROP DATABASE \`old_database\`;"

21
请注意,这仅涉及表格。视图和存储过程必须单独处理。 - Greg
6
这是一个更易于使用的脚本版本:https://gist.github.com/tadas-s/5411299 - Tadas Sasnauskas
1
这里有一种在MySQL直接中创建重命名表命令的替代方法:http://blog.marceloaltmann.com/how-to-rename-a-database-in-mysql/ - Yves Martin
gist.github.com/tadas-s/5411299 上的要点对我很有效。然而,如果它能处理视图并接受一些命令行参数,那就更好了。 - bean5
1
首先删除触发器(如果有的话)!!!! - TVNshack
显示剩余2条评论

65

我认为您无法这样做。基本答案在许多情况下可以使用,但在其他情况下可能会导致数据损坏。需要根据对数据库的启发式分析选择一种策略。

这就是为什么此功能被实现,然后又被移除的原因。 [文档]

您需要转储该数据库中的所有对象类型,创建新命名的数据库,然后导入转储文件。如果这是一个在线系统,您需要将其关闭。如果无法关闭,则需要设置从此数据库到新数据库的复制。

如果想要查看能够执行此操作的命令,@satishD提供了详细信息,其中传达了一些围绕着您需要构建与目标数据库相匹配的策略而存在的挑战。


13
有意义吗?为什么MySQL开发者省略了如此重要的选项? - Milad Rahimi
这可能是营销的原因。许多MySQL托管提供商为您提供免费但随机和平凡命名的数据库名称,但如果您希望将其重命名为简单易读的名称,则几乎必须为此付费。 - knoxgon

37
您可以创建一个与先前数据库完全相同的新数据库,然后在完成后删除旧数据库。使用mysqldump工具通过“mysqldump orig_db> orig_db.sql”创建数据库的.sql备份文件,如果需要使用用户名和密码,则运行“mysqldump -u root -p orig_db> orig_db.sql”。orig_db是您想要“重命名”的数据库名称,root是您登录的用户,orig_db.sql是包含备份的文件。现在,使用您想要的数据库名称创建一个新的空数据库。例如,“mysql -u root -p -e 'create database new_db'”。完成后,运行“mysql -u root -p new_db
以下是简短的步骤:
1. "mysqldump -u root -p original_database> original_database.sql" 2. "mysql -u root -p -e 'create database my_new_database'" 3. "mysql -u root -p my_new_database < original_database.sql" 4. "mysql -u root -p -e drop database originl_database"
希望这可以帮助您,这是一种可靠的方法,不会使用某些特使方法损坏您的数据并创建不一致性。

简洁、安全,在没有触发器的简单数据库上效果最佳。 - foo
2
只需创建数据库并将结果从一个直接传输到另一个:mysqldump -u root -p old_db|mysql -u root -p new_db - Pacerier
您可能需要编辑 original_database.sql 文件,并在顶部注释掉 CREATE DATABASE …USE … 语句,以避免创建/使用原始数据库。 - Jens

36

可以使用mysqldump命令在不将转储存储到文件的情况下复制数据库:

  1. mysql -u root -p -e "create database my_new_database"
  2. mysqldump -u root -p original_database | mysql -u root -p my_new_database
  3. mysql -u root -p -e "drop database original_database"

23

创建名为"other_db"的新模式后,对于您的"current_db"中的每个表格,可以通过RENAME语句来完成。

RENAME TABLE current_db.tbl_name TO other_db.tbl_name

源自 重命名表格语法


5
这个声明在MySQL 5.1.7版本中被添加,但后来发现它存在危险性,并在MySQL 5.1.23版本中被删除。参考链接:http://dev.mysql.com/doc/refman/5.1/en/rename-database.html - mikeslattery
14
嗨,mikeslattery,我的意思是 RENAME TABLE 而不是 RENAME DATABASE 或 SCHEMA。 - Cristian Porta
呃,糟糕。抱歉。 :) - mikeslattery

4

我使用以下方法重命名数据库:

  1. 使用mysqldump或任何DB工具(例如heidiSQL,mysql administrator等)备份文件。

  2. 在某个文本编辑器中打开备份文件(例如backupfile.sql)。

  3. 搜索并替换数据库名称,并保存文件。

  4. 恢复编辑后的SQL文件。


不要忘记创建你想要导入数据的新数据库。换句话说,就是“重命名”的数据库。 - Stévillis

4

简而言之,不行。通常认为重新命名数据库太危险了。MySQL曾经有这个功能,但现在已经被删除了。你最好使用工作台将架构和数据导出到SQL,然后在运行/导入之前更改CREATE DATABASE的名称。


2
如果您的数据库只包含MyISAM表(如果您有InnoDB表,请勿使用此方法):
  1. 关闭MySQL服务器
  2. 进入mysql data目录并重命名数据库目录(注意:非字母字符需要以特殊方式编码)
  3. 重新启动服务器
  4. 根据需要调整权限(授予新的DB名称访问权限)
您可以将所有内容脚本化为一个命令,使停机时间只有一两秒钟。

1

对于像我这样不耐烦的 MySQL 用户,解决方案是:

/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database 
/etc/init.d/mysql start

我尝试过这个。我将my_project移动到my_project_bak,然后创建了一个名为my_project的新空数据库。当新的空数据库与my_project_bak中的表同名时,我无法在其中创建表。 - Greg
1
虽然这很容易且快速完成,而且似乎也起作用了,但它确实导致了一些不一致性,可能是由于InnoDB引起的。 - tobixen
你需要在系统表(db mysql)中替换所有权限,这个是针对数据库权限的:use mysql; update db set Db=newdbname where Db=olddbname - Felipe Buccioni
4
如果你的数据库中有 InnoDB 表,请不要使用此方法。只有在所有表都是 MyISAM 表的情况下才可以使用此方法。 - rustyx

0

首先备份名为HRMS的旧数据库,并编辑脚本文件,将单词HRMS替换为SUNHRM。完成此步骤后,将数据库文件导入到mysql中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接