重命名MySQL数据库

我创build了一个名为hrms的数据库。 现在我需要将数据库名称更改为sunhrm 。 但是,它在MySQL工作台中被禁用。 我可以在Linux服务器上做到这一点吗?

我不认为你可以做到这一点。 我想你需要转储该数据库,创build新命名的,然后导入转储。

如果这是一个实时系统,你需要把它关掉。 如果你不能,那么你将需要设置从这个数据库复制到新的。

如果你想看到命令来做到这一点, @jan有详细信息 。

如果您需要从命令行执行该操作,只需复制,修改并粘贴以下代码片段即可:

 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\`;" 

您可以像以前的数据库一样创build一个新的数据库,然后在完成时删除旧的数据库。 使用mysqldump工具通过mysqldump orig_db > orig_db.sql创build数据库的.sql备份,或者如果您需要使用用户名和密码,请运行mysqldump -u root -p orig_db > orig_db.sql 。 orig_db是要“重命名”的数据库的名称,root将是您login的用户,orig_db.sql是创build的包含备份的文件。 现在用数据库名称创build一个新的空数据库。 例如, mysql -u root -p -e "create database new_db" 。 完成后,运行mysql -u root -p new_db < orig_db.sql 。 new_db现在作为orig_db的完美副本而存在。 然后您可以删除原来的数据库,因为您现在已经在新数据库中存在了所需的数据库名称。

没有所有上述解释的简短而快速的步骤是:

  1. mysqldump -u root -p originl_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

希望这有帮助,这是一个可靠的手段来完成它,而不使用一些特别的方法,将破坏您的数据和造成不一致。

可以通过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"

在创build新模式“other_db”之后,您可以通过RENAME语句为“current_db”中的每个表执行此操作

 RENAME TABLE current_db.tbl_name TO other_db.tbl_name 

源重命名表语法

那么有两种方法:

方法1 :众所周知的重命名数据库模式的方法是使用Mysqldump转储模式并将其还原到另一个模式,然后删除旧的模式(如果需要)。

Shell

  mysqldump emp > emp.out mysql -e "CREATE DATABASE employees;" mysql employees < emp.out mysql -e "DROP DATABASE emp;" 

虽然上述方法简单,但是耗时耗力。 如果模式超过100GB呢? 有一些方法可以将上面的命令集中在一起以节省空间,但是不会节省时间。

为了弥补这种情况,还有另一种重新命名模式的快速方法,但是,在执行模式时必须小心。

方法2 :MySQL具有非常好的重命名表的function,甚至可以在不同的模式下工作。 这个重命名操作是primefaces的,没有其他人在重命名的时候可以访问这个表。 这需要很短时间才能完成,因为更改表名或模式只是元数据更改。 这里是做重命名的程序方法:

  1. 用所需的名称创build新的数据库模式。
  2. 使用MySQL的“RENAME TABLE”命令将表从旧模式重命名为新模式。
  3. 删除旧的数据库模式。

如果存在views, triggers, functions, stored procedures架构中的views, triggers, functions, stored procedures ,那么也需要重新创build这些views, triggers, functions, stored procedures 。 如果表中存在触发器,则MySQL的“RENAME TABLE”失败。 为了弥补这一点,我们可以做以下事情:

1) Dump the triggers, events and stored routines in a separate file. 这样做使用-E,-R标志(除了转储触发器的-t -d之外)到mysqldump命令。 一旦触发器被转储,我们将需要从模式中删除它们,以使RENAME TABLE命令起作用。

  $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out 

2)生成只有“BASE”表的列表。 这些可以通过在information_schema.TABLES表上查询来find。

  mysql> select TABLE_NAME from information_schema.tables where table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE'; 

3)转储出文件中的意见。 在相同的information_schema.TABLES表上使用查询可以find视图。

 mysql> select TABLE_NAME from information_schema.tables where table_schema='<old_schema_name>' and TABLE_TYPE='VIEW'; $ mysqldump <database> <view1> <view2> … > views.out 

4)删除old_schema中的当前表上的触发器。

 mysql> DROP TRIGGER <trigger_name>; ... 

5)在步骤#2中find的所有“基本”表被重命名后,恢复上述转储文件。

 mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name; ... $ mysql <new_schema> < views.out $ mysql <new_schema> < stored_routines_triggers_events.out 

上述方法错综复杂:我们可能需要为用户更新GRANTS ,以便它们匹配正确的schema_name。 这些可以通过mysql.columns_privmysql.procs_privmysql.tables_priv ,mysql.db表更新old_schema name new_schema并调用“刷新权限”的简单UPDATE来解决。 虽然“ method 2 ”似乎比“ method 1 ”复杂一点,但这完全是脚本化的。 一个简单的bash脚本以正确的顺序执行上述步骤,可以帮助您在下次重命名数据库模式时节省空间和时间。

Percona Remote DBA团队编写了一个名为“rename_db”的脚本,其工作原理如下:

 [root@dba~]# /tmp/rename_db rename_db <server> <database> <new_database> 

为了演示这个脚本的使用,使用了一个示例模式“emp”,创build了testing触发器,在该模式上存储了例程。 将尝试使用脚本来重命名数据库模式,与耗时的转储/恢复方法相比,这需要几秒钟的时间才能完成。

 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | emp | | mysql | | performance_schema | | test | +--------------------+ [root@dba ~]# time /tmp/rename_db localhost emp emp_test create database emp_test DEFAULT CHARACTER SET latin1 drop trigger salary_trigger rename table emp.__emp_new to emp_test.__emp_new rename table emp._emp_new to emp_test._emp_new rename table emp.departments to emp_test.departments rename table emp.dept to emp_test.dept rename table emp.dept_emp to emp_test.dept_emp rename table emp.dept_manager to emp_test.dept_manager rename table emp.emp to emp_test.emp rename table emp.employees to emp_test.employees rename table emp.salaries_temp to emp_test.salaries_temp rename table emp.titles to emp_test.titles loading views loading triggers, routines and events Dropping database emp real 0m0.643s user 0m0.053s sys 0m0.131s mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | emp_test | | mysql | | performance_schema | | test | +--------------------+ 

正如你在上面的输出中看到的那样,数据库模式“emp”在不到一秒的时间内被重命名为“emp_test”。 最后,这是上面用于“ method 2 ”的Percona的脚本。

 #!/bin/bash # Copyright 2013 Percona LLC and/or its affiliates set -e if [ -z "$3" ]; then echo "rename_db <server> <database> <new_database>" exit 1 fi db_exists=`mysql -h $1 -e "show databases like '$3'" -sss` if [ -n "$db_exists" ]; then echo "ERROR: New database already exists $3" exit 1 fi TIMESTAMP=`date +%s` character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'` TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss` STATUS=$? if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then echo "Error retrieving tables from $2" exit 1 fi echo "create database $3 DEFAULT CHARACTER SET $character_set" mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set" TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'` VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss` if [ -n "$VIEWS" ]; then mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump fi mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump for TRIGGER in $TRIGGERS; do echo "drop trigger $TRIGGER" mysql -h $1 $2 -e "drop trigger $TRIGGER" done for TABLE in $TABLES; do echo "rename table $2.$TABLE to $3.$TABLE" mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE" done if [ -n "$VIEWS" ]; then echo "loading views" mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump fi echo "loading triggers, routines and events" mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss` if [ -z "$TABLES" ]; then echo "Dropping database $2" mysql -h $1 $2 -e "drop database $2" fi if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then COLUMNS_PRIV=" UPDATE mysql.columns_priv set db='$3' WHERE db='$2';" fi if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then PROCS_PRIV=" UPDATE mysql.procs_priv set db='$3' WHERE db='$2';" fi if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then TABLES_PRIV=" UPDATE mysql.tables_priv set db='$3' WHERE db='$2';" fi if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then DB_PRIV=" UPDATE mysql.db set db='$3' WHERE db='$2';" fi if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:" if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi echo " flush privileges;" fi 

总之没有。 通常认为重命名数据库是非常危险的。 MySQL有一点function,但它被删除。 在运行/导入之前,最好使用工作台将模式和数据导出到SQL,然后在其中更改CREATE DATABASE名称。

对于不耐烦的mysql用户(像我),解决scheme是:

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

我用下面的方法来重命名数据库

  1. 采用mysqldump或任何数据库工具,如heidiSQL,MySQLpipe理员等备份文件

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

  3. search并replace数据库名称并保存文件。

  4. 还原编辑的SQL文件

如果您的数据库仅包含MyISAM表(如果您有InnoDB表,则不要使用此方法):

  1. closuresMySQL服务器
  2. 进入mysql data目录并重命名数据库目录(注意:非alpha字符需要以特殊的方式进行编码)
  3. 重新启动服务器
  4. 根据需要调整权限(授予对新数据库名称的访问权限)

您可以使用一个命令编写所有脚本,以便停机时间仅为一秒钟或两秒钟。

首先备份名为HRMS的旧数据库,并用HRHreplace为SUNHRM编辑脚本文件。 在这一步之后,将数据库文件导入到mysql

重命名数据库或拍摄数据库图像的另一种方法是使用数据库选项卡中的“反向工程”选项。 它将为数据库创build一个ERR图。 在那里重命名模式。

之后进入文件菜单,然后导出并正向devise数据库。

然后你可以导入数据库。