如何快速重命名MySQL数据库(更改模式名称)?

MySQL的MySQL手册涵盖了这一点。

通常我只是转储数据库并重新导入一个新的名字。 对于非常大的数据库,这不是一个选项。 显然RENAME {DATABASE | SCHEMA} db_name TO new_db_name; RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 做坏事,只存在于less数几个版本中,总体上是一个坏主意 。

这需要与InnoDB协同工作,它存储的内容与MyISAM非常不同。

对于InnoDB,下面的工作似乎是工作的:创build新的空数据库,然后依次将每个表重新命名为新的数据库:

 RENAME TABLE old_db.table TO new_db.table; 

之后您将需要调整权限。

对于在shell中编写脚本,可以使用以下任一方法:

 mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done 

要么

 for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done; 

注意:选项-p和密码之间没有空格。 如果您的数据库没有密码,请删除-u username -ppassword部分。

另外,如果您有存储过程,则可以在之后复制它们:

 mysqldump -R old_db | mysql new_db 

使用这几个简单的命令:

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

或者按照@Pablo Marin-Garcia的build议减lessI / O使用:

 mysqladmin -u username -p create newdatabase mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase 

我认为解决scheme比较简单,有些开发者提出了这个build议。 phpMyAdmin有这个操作。

从phpMyAdmin,select你想要select的数据库。 在标签中有一个叫做操作,去重命名部分。 就这样。

它的确如许多人所build议的那样,使用新名称创build一个新数据库,将旧数据库的所有表转储到新数据库中,并删除旧数据库。

在这里输入图像说明

生成一个SQL脚本将源数据库中的每个表传输到目标数据库。

在运行由该命令生成的脚本之前,必须先创build目标数据库。

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

($ 1和$ 2分别是来源和目标)

这将生成一个SQL命令,您将不得不运行。

三个选项:

  1. 创build新的数据库,closures服务器,将文件从一个数据库文件夹移动到另一个,然后重新启动服务器。 请注意,这只有在你的所有表都是MyISAM的情况下才有效。

  2. 创build新的数据库,使用CREATE TABLE … LIKE语句,然后使用INSERT … SELECT * FROM语句。

  3. 使用mysqldump并用该文件重新加载。

简单的方法

切换到数据库目录:

 cd /var/lib/mysql/ 

closuresMySQL …这很重要!

 /etc/init.d/mysql stop 

好的,这种方式不适用于InnoDB或BDB数据库。

重命名数据库:

 mv old-name new-name 

…或桌子…

 cd database/ mv old-name.frm new-name.frm mv old-name.MYD new-name.MYD mv old-name.MYI new-name.MYI 

重新启动MySQL

 /etc/init.d/mysql start 

完成…

好吧,这种方式不适用于InnoDB或BDB数据库。 在这种情况下,您必须转储数据库并重新导入它。

我只是最近遇到了一个很好的方式来做到这一点,与MyISAM和InnoDB合作,速度非常快:

 RENAME TABLE old_db.table TO new_db.table; 

我不记得我在哪里阅读,但信用不是在别人身上。

在MySQL中模拟缺less的RENAME DATABASE命令:

  1. 创build一个新的数据库
  2. 创build重命名查询:

     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命令中获取的

这是我使用的:

 $ mysqldump -u root -p olddb >~/olddb.sql $ mysql -u root -p mysql> create database newdb; mysql> use newdb mysql> source ~/olddb.sql mysql> drop database olddb; 

MySQL目前不支持通过其命令接口重命名数据库,但如果您有权访问MySQL存储数据库的目录,则可以重命名数据库。 对于默认的MySQL安装,通常在安装MySQL的目录下的Data目录下。 在“数据”目录下find要重命名的数据库的名称并对其进行重命名。 重命名目录可能会导致一些权限问题。 意识到。

注意:您必须先停止MySQL,然后才能重命名数据库

我会build议创build一个新的数据库(使用你想要的名称),并导出/导入你需要的数据从旧到新。 很简单。

当您在PHPMyAdmin中重命名数据库时,它将创build一个转储,然后使用新名称删除并重新创build数据库。

做一个完整的重命名最简单的bullet-and-fool-proof方法(包括在最后删除旧的数据库,所以它是一个重命名而不是副本)

 mysqladmin -uroot -pmypassword create newdbname mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname mysqladmin -uroot -pmypassword drop olddbname 

脚步:

  1. 将行复制到记事本中。
  2. 将所有对“olddbname”,“newdbname”,“mypassword”(+可选“root”)的引用replace为您的等效项。
  3. 在命令行上逐个执行(出现提示时input“y”)。

对于Mac用户,Sequel Pro在数据库菜单中有一个重命名数据库选项。 http://www.sequelpro.com/

你可以使用这个shell脚本:

参考: 如何重命名一个MySQL数据库?

 #!/bin/bash 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 

可以将数据库中的所有表重命名为另一个数据库,而无需执行完整的转储和恢复。

 DROP PROCEDURE如果存在mysql.rename_db;
 DELIMITER ||
 CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100),IN new_db VARCHAR(100))
开始
 SELECT CONCAT('CREATE DATABASE',new_db,';')`#create new database`;
 SELECT CONCAT('RENAME TABLE`',old_db,``.`',table_name,'TO',new_db,```,table_name,';')`#alter table` FROM information_schema.tables WHERE table_schema = old_db;
 SELECT CONCAT('DROP DATABASE`',old_db,'`;')`#drop old database`;
 END ||
 DELIMITER;

 $ time mysql -uroot -e“call mysql.rename_db('db1','db2');”  |  mysql -uroot

但是目标数据库中的任何触发器都不会很快乐。 您需要首先放下它们,然后在重命名后重新创build它们。

 mysql -uroot -e“call mysql.rename_db('test','blah2');”  |  mysql -uroot
错误1435(HY000)在行4:触发错误的模式

那么有两种方法:

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

从壳牌

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

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

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

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

用所需的名称创build新的数据库模式。 使用MySQL的“RENAME TABLE”命令将表从旧模式重命名为新模式。 删除旧的数据库模式。 If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too 。 如果表中存在触发器,则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_priv,mysql.procs_priv,mysql.tables_priv,mysql.db表更新old_schema名称为new_schema并调用“Flush privileges;”的简单更新来解决。 虽然“方法2”似乎比“方法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”。 最后,这是上面用于“方法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 

这里是我写的一个batch file,用于从命令行自动执行,但是它是针对Windows / MS-DOS的。

语法是rename_mysqldb数据库newdatabase -u [用户] -p [密码]

 :: *************************************************************************** :: FILE: RENAME_MYSQLDB.BAT :: *************************************************************************** :: DESCRIPTION :: This is a Windows /MS-DOS batch file that automates renaming a MySQL database :: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks. :: The MySQL\bin folder needs to be in your environment path or the working directory. :: :: WARNING: The script will delete the original database, but only if it successfully :: created the new copy. However, read the disclaimer below before using. :: :: DISCLAIMER :: This script is provided without any express or implied warranties whatsoever. :: The user must assume the risk of using the script. :: :: You are free to use, modify, and distribute this script without exception. :: *************************************************************************** :INITIALIZE @ECHO OFF IF [%2]==[] GOTO HELP IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9) SET RDB_OLDDB=%1 SET RDB_NEWDB=%2 SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql GOTO START :START SET RDB_STEP=1 ECHO Dumping "%RDB_OLDDB%"... mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE% IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT SET RDB_STEP=2 ECHO Creating database "%RDB_NEWDB%"... mysqladmin %RDB_ARGS% create %RDB_NEWDB% IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT SET RDB_STEP=3 ECHO Loading dump into "%RDB_NEWDB%"... mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE% IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT SET RDB_STEP=4 ECHO Dropping database "%RDB_OLDDB%"... mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT SET RDB_STEP=5 ECHO Deleting dump... DEL %RDB_DUMPFILE% IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%". GOTO END :ERROR_ABORT IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE% ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%". GOTO END :HELP ECHO Renames a MySQL database. ECHO Usage: %0 database new_database [OPTIONS] ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump. ECHO --user=root is used if no options are specified. GOTO END :END SET RDB_OLDDB= SET RDB_NEWDB= SET RDB_ARGS= SET RDB_DUMP= SET RDB_STEP= 

TodoInTX的存储过程并不适合我。 这是我的刺伤:

 - 存储过程rename_db:重命名数据库我的表复制的手段。
 - 注意事项: 
 - 将打开与“新”数据库名称相同名称的任何现有数据库。
 - 只能复制表格; 存储过程和其他数据库对象不会被复制。
 -  Tomer Altman(taltman@ai.sri.com)

定界符
 DROP PROCEDURE如果存在rename_db;
 CREATE PROCEDURE rename_db(IN old_db VARCHAR(100),IN new_db VARCHAR(100))
开始
     DECLARE current_table VARCHAR(100);
     DECLARE done INT DEFAULT 0;
     DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

     SET @output = CONCAT('DROP SCHEMA IF EXISTS',new_db,';'); 
    准备从@output;
     EXECUTE stmt;

     SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS',new_db,';');
    准备从@output;
     EXECUTE stmt;

    打开old_tables;
    重复
         FETCH old_tables INTO current_table;
        如果没有完成
         SET @output = CONCAT('alter table',old_db,'。',current_table,'rename',new_db,'。',current_table,';');
        准备从@output;
         EXECUTE stmt;

        万一;
    直到完成END REPEAT;

    closuresold_tables;

结束//
定界符

我提出了一个关于服务器故障的问题,试图通过使用MySQL代理恢复非常大的数据库来解决停机问题 。 我没有任何成功,但我最终意识到我想要的是RENAME DATABASEfunction,因为由于数据库的大小,dump / import不是一个选项。

MySQL内置了RENAME TABLEfunction,所以我最终编写了一个简单的Python脚本来为我完成这项工作。 我已经把它贴在GitHub上 ,以防其他人使用它。

为了方便起见,下面是一个小的shell脚本,必须用两个参数来执行:db-name和新的db-name。

如果不在主目录中使用.my.cnf文件,则可能需要将login参数添加到mysql-lines。 请在执行此脚本之前进行备份。


 #!/usr/bin/env bash mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" for i in $(mysql -Ns $1 -e "show tables");do echo "$1.$i -> $2.$i" mysql -e "rename TABLE $1.$i to $2.$i" done mysql -e "DROP DATABASE $1" 

如果你有很多的表格可以移动的话,这是一个生成重命名sql脚本的快速方法。

 SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ', t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL FROM information_schema.tables t WHERE table_schema='your_db_name' ; 

最简单的方法是使用HeidiSQL软件。 它是免费的,开源的。 它运行在Windows和Wine上的任何Linux上(在Linux,BSD,Solaris和Mac OS X上运行Windows应用程序)。

要下载HeidiSQL,请转到http://www.heidisql.com/download.php

要下载Wine,转到http://www.winehq.org/

要在HeidiSQL中重命名数据库,只需右键单击数据库名称并select“编辑”。 然后input一个新的名字,然后按'确定'。

这是如此简单。

ALTER DATABASE是MySQL提出的解决方法, RENAME DATABASE被删除。

13.1.32 RENAME DATABASE语法

 RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 

这个语句是在MySQL 5.1.7中添加的,但是它被发现是危险的,在MySQL 5.1.23中被删除了。

Most of the answers here are wrong for one of two reasons:

  1. You cannot just use RENAME TABLE, because there might be views and triggers. If there are triggers, RENAME TABLE fails
  2. You cannot use mysqldump if you want to "quickly" (as requested in the question) rename a big database

Percona has a blog post about how to do this well: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

and script posted (made?) by Simon R Jones that does what is suggested in that post. I fixed a bug I found in the script. You can see it here:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

Here is a copy of it:

 #!/bin/bash # Copyright 2013 Percona LLC and/or its affiliates # @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/ 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 "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss` 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 

Save it to a file called rename_db and make the script executable with chmod +x rename_db then use it like ./rename_db localhost old_db new_db

I did it this way: Take backup of your existing database. It will give you a db.zip.tmp and then in command prompt write following

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[password] [new db name] < "C:\Backups\db.zip.tmp"

In MySQL Administrator do the following:

  1. Under Catalogs, create a new database schema.
  2. Go to Backup and create a backup of the old schema.
  3. Execute backup.
  4. Go to Restore and open the file created in step 3.
  5. Select 'Another Schema' under Target Schema and select the new database schema.
  6. Start Restore.
  7. Verify new schema and, if it looks good, delete the old one.

This works for all databases and works by renaming each table with maatkit mysql toolkit

Use mk-find to print and rename each table. The man page has many more options and examples

 mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N" 

If you have maatkit installed ( which is very easy ), then this is the simplest way to do it.

You can do it in two ways.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. Goto operations-> there you can see Table options tab. you can edit table name there.

in phpmyadmin you can easily rename the database

 select database goto operations tab in that rename Database to : type your new database name and click go 

ask to drop old table and reload table data click OK in both

Your database is renamed

If you are using phpMyAdmin you can go to the "operations" tab once you have selected the database you want to rename. Then go to the last section "copy database to" (or something like that), give a name, and select the options below. In this case, I guess you must select "structure and data" and "create database before copying" checkboxes and, finally, press the "go" button in that section.

By the way, I'm using phpMyAdmin in Spanish so I'm not sure what the names of the sections are in English.