MySQL上的MySQL手册涵盖了这一点。
通常我只是转储数据库并使用新名称重新导入它。对于非常大的数据库,这不是一个选项。显然是RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
does bad things, exist only in a handful of versions, and is a bad idea overall。
答案 0 :(得分:764)
对于InnoDB,以下似乎有效:创建新的空数据库,然后依次将每个表重命名为新数据库:
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
部分。如果某个表有触发器,则无法使用上述方法将其移动到另一个数据库(将导致Trigger in wrong schema
错误)。如果是这种情况,请使用传统方法克隆数据库,然后删除旧数据库:
mysqldump old_db | mysql new_db
如果您有存储过程,则可以在以后复制它们:
mysqldump -R old_db | mysql new_db
答案 1 :(得分:417)
使用以下几个简单的命令:
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
答案 2 :(得分:195)
我认为解决方案更简单,并且是由一些开发人员提出的。 phpMyAdmin有一个操作。
从phpMyAdmin中,选择要选择的数据库。在选项卡中有一个名为Operations的操作,请转到重命名部分。就是这样。
正如许多人所建议的那样,它使用新名称创建一个新数据库,将旧数据库的所有表转储到新数据库中并删除旧数据库。
答案 3 :(得分:100)
您可以使用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;
(或其他一些大数字)来更改该限制。
答案 4 :(得分:34)
在MySQL中模拟丢失的RENAME DATABASE
命令:
使用以下命令创建重命名查询:
SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
' TO ','new_schema.',table_name,';')
FROM information_schema.TABLES
WHERE table_schema LIKE 'old_schema';
运行该输出
答案 5 :(得分:24)
三个选项:
创建新数据库,关闭服务器,将文件从一个数据库文件夹移动到另一个数据库文件夹,然后重新启动服务器。请注意,这仅适用于所有表格均为MyISAM的情况。
创建新数据库,使用CREATE TABLE ... LIKE语句,然后使用INSERT ... SELECT * FROM语句。
使用mysqldump并使用该文件重新加载。
答案 6 :(得分:23)
转到数据库目录:
cd /var/lib/mysql/
关闭MySQL ......这很重要!
/etc/init.d/mysql stop
好的,这种方式不适用于InnoDB或BDB-Databases。
重命名数据库:
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数据库。在这种情况下,您必须转储数据库并重新导入它。
答案 7 :(得分:19)
我最近才遇到一种非常好的方式,与MyISAM和InnoDB配合使用非常快:
RENAME TABLE old_db.table TO new_db.table;
我不记得我在哪里阅读它但是归功于别人而不是我。
答案 8 :(得分:18)
您可以使用此shell脚本:
参考:How to rename a MySQL database?
#!/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
答案 9 :(得分:16)
这就是我使用的:
$ 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;
答案 10 :(得分:15)
执行完整重命名的最简单的防弹傻瓜方式(包括在最后删除旧数据库,因此它是重命名而不是副本):
mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname
<强>步骤:强>
答案 11 :(得分:14)
MySQL目前不支持通过命令界面重命名数据库,但如果您可以访问MySQL存储其数据库的目录,则可以重命名数据库。对于默认的MySQL安装,这通常位于安装MySQL的目录下的Data目录中。在Data目录下找到要重命名的数据库的名称,然后重命名它。重命名目录可能会导致一些权限问题。请注意。
注意:您必须先停止MySQL,然后才能重命名数据库
我建议您创建一个新数据库(使用您想要的名称),然后将您需要的数据从旧数据导出/导入到新数据库。很简单。
答案 12 :(得分:13)
在PHPMyAdmin中重命名数据库时,它会创建转储,然后删除并使用新名称重新创建数据库。
答案 13 :(得分:12)
对于Mac用户,Sequel Pro在数据库菜单中有一个重命名数据库选项。 http://www.sequelpro.com/
答案 14 :(得分:12)
有两种方法:
方法1:一种众所周知的重命名数据库模式的方法是使用Mysqldump转储模式并在另一个模式中恢复,然后删除旧模式(如果需要)。
来自Shell
mysqldump emp > emp.out
mysql -e "CREATE DATABASE employees;"
mysql employees < emp.out
mysql -e "DROP DATABASE emp;"
虽然上述方法很容易,但是耗费时间和空间。如果架构超过 100GB会怎么样?有些方法可以将上述命令一起管道以节省空间,但不会节省时间。
为了解决这种情况,还有另一种快速重命名模式的方法,但是,这样做时必须要小心。
方法2: MySQL具有非常好的功能,可以重命名甚至适用于不同模式的表。此重命名操作是原子操作,在重命名时,没有其他人可以访问该表。这需要很短的时间才能完成,因为更改表的名称或其架构只是元数据更改。以下是重命名的程序方法:
使用所需名称创建新数据库架构。
使用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
表格上的查询找到这些内容。
mysql> select TABLE_NAME from information_schema.tables where
table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';
3)将视图转储到out文件中。可以使用同一information_schema.TABLES
表上的查询找到视图。
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中找到的所有“基础”表后,恢复上述转储文件。
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表上的简单UPDATE修复,将old_schema名称更新为new_schema并调用“Flush privileges;”。虽然“方法2”似乎比“方法1”复杂一点,但这完全可以编写脚本。一个简单的bash脚本以正确的顺序执行上述步骤,可以帮助您在下次重命名数据库模式时节省空间和时间。
Percona远程DBA团队编写了一个名为“rename_db”的脚本,其工作方式如下:
[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>
为了演示此脚本的使用,使用了示例模式“emp”,创建了测试触发器,在该模式上存储了例程。将尝试使用脚本重命名数据库模式,这需要几秒钟才能完成,而不是耗时的转储/恢复方法。
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”。最后,这是来自Percona的脚本,上面用于“方法2”。
#!/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
答案 15 :(得分:9)
可以将数据库中的所有表重命名为另一个数据库,而无需进行完全转储和还原。
DROP PROCEDURE IF EXISTS mysql.rename_db; DELIMITER || CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) BEGIN 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
然而,目标数据库中的任何触发器都不会满意。您需要先删除它们,然后在重命名后重新创建它们。
mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot ERROR 1435 (HY000) at line 4: Trigger in wrong schema
答案 16 :(得分:8)
出于以下两个原因之一,大多数答案都是错误的:
Percona有一篇关于如何做到这一点的博客文章: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
和Simon R Jones发布的脚本(由?制作?)完成了该帖子的建议。我修复了我在脚本中发现的错误。你可以在这里看到它:
https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d
以下是它的副本:
#!/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
将其保存到名为rename_db
的文件中,并使用chmod +x rename_db
使脚本可执行,然后像./rename_db localhost old_db new_db
一样使用
答案 17 :(得分:7)
TodoInTX的存储过程并不适合我。这是我的抨击:
-- stored procedure rename_db: Rename a database my means of table copying. -- Caveats: -- Will clobber any existing database with the same name as the 'new' database name. -- ONLY copies tables; stored procedures and other database objects are not copied. -- Tomer Altman (taltman@ai.sri.com) delimiter // DROP PROCEDURE IF EXISTS rename_db; CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) BEGIN 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, ';'); PREPARE stmt FROM @output; EXECUTE stmt; SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';'); PREPARE stmt FROM @output; EXECUTE stmt; OPEN old_tables; REPEAT FETCH old_tables INTO current_table; IF NOT done THEN SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';'); PREPARE stmt FROM @output; EXECUTE stmt; END IF; UNTIL done END REPEAT; CLOSE old_tables; END// delimiter ;
答案 18 :(得分:7)
这是我编写的一个批处理文件,用于从命令行自动执行它,但它适用于Windows / MS-DOS。
语法是rename_mysqldb数据库newdatabase -u [user] -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=
答案 19 :(得分:6)
步骤:
答案 20 :(得分:6)
为方便起见,下面是一个小shellcript,必须使用两个参数执行:db-name和new db-name。
如果您不在主目录中使用.my.cnf文件,则可能需要将登录参数添加到mysql行。请在执行此脚本之前进行备份。
#!/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"
答案 21 :(得分:6)
我posed a question on Server Fault试图通过使用MySQL代理恢复非常大的数据库来避免停机。我没有取得任何成功,但我最终意识到我想要的是RENAME DATABASE功能,因为由于数据库的大小,dump / import不是一个选项。
MySQL内置了一个RENAME TABLE功能,所以我最终编写了一个简单的Python脚本来为我完成这项工作。我posted it on GitHub以防它可能对其他人有用。
答案 22 :(得分:5)
最简单的方法是使用HeidiSQL软件。它是免费和开源的。它在Windows和任何具有Wine的Linux上运行(在Linux,BSD,Solaris和Mac OS X上运行Windows应用程序)。
要下载HeidiSQL,请转到http://www.heidisql.com/download.php。
要下载Wine,请转到http://www.winehq.org/。
要在HeidiSQL中重命名数据库,只需右键单击数据库名称并选择“编辑”即可。然后输入新名称并按“确定”。
这很简单。
答案 23 :(得分:4)
似乎没有人提到这一点,但这是另一种方式:
create database NewDatabaseName like OldDatabaseName;
然后为每个表做:
create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;
然后,如果你愿意,
drop database OldDatabaseName;
这种方法的优点是可以在几乎没有网络流量的服务器上进行整个传输,因此它比转储/恢复要快得多。
如果你有存储过程/视图/等,你可能也想传输它们。
答案 24 :(得分:4)
对于mac用户,您可以使用Sequel Pro
(免费),它只提供重命名数据库的选项。虽然它不会删除旧数据库。
打开相关数据库后,只需点击:Database
- &gt; Rename database...
答案 25 :(得分:4)
如果要移动许多表,这是生成重命名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' ;
答案 26 :(得分:3)
在 phpmyadmin 中,您可以轻松地重命名数据库
select database
goto operations tab
in that rename Database to :
type your new database name and click go
要求删除旧表并重新加载表数据,然后单击“确定”
您的数据库已重命名
答案 27 :(得分:3)
这是一个单行Bash片段,用于将所有表从一个模式移动到另一个模式:
history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema
开始时的history命令只是确保包含密码的MySQL命令不会保存到shell历史记录中。
确保db_user
对旧架构具有读/写/删除权限,并对新架构具有读/写/创建权限。
答案 28 :(得分:3)
我是这样做的: 备份现有数据库。它将为您提供db.zip.tmp,然后在命令提示符下写下
“C:\ Program Files(x86)\ MySQL \ MySQL Server 5.6 \ bin \ mysql.exe”-h localhost -u root -p [密码] [新数据库名称]&lt; “C:\备份\ db.zip.tmp”
答案 29 :(得分:3)
如果您使用的是phpMyAdmin,则在选择了要重命名的数据库后,可以转到“操作”选项卡。然后转到最后一节“将数据库复制到”(或类似的东西),给出一个名称,然后选择下面的选项。在这种情况下,我猜你必须选择“结构和数据”和“复制前创建数据库”复选框,最后按下该部分的“开始”按钮。
顺便说一句,我在西班牙语中使用phpMyAdmin,所以我不确定这些部分的名称是英文的。
答案 30 :(得分:3)
在MySQL Administrator中执行以下操作:
答案 31 :(得分:2)
ALTER DATABASE
是由MySQL提出的方法,RENAME DATABASE
被删除。
来自 13.1.32 RENAME DATABASE Syntax :
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
此声明已在MySQL 5.1.7中添加,但发现它很危险,已在MySQL 5.1.23中删除。
答案 32 :(得分:2)
你可以用两种方式做到这一点。
答案 33 :(得分:2)
这适用于所有数据库,并通过使用maatkit mysql toolkit
重命名每个表来工作使用mk-find打印并重命名每个表。 man page还有更多选项和示例
mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"
如果您安装了maatkit(which is very easy),那么这是最简单的方法。
答案 34 :(得分:2)
这是我为在Windows上重命名数据库而编写的批处理脚本:
@echo off
set olddb=olddbname
set newdb=newdbname
SET count=1
SET act=mysql -uroot -e "select table_name from information_schema.tables where table_schema='%olddb%'"
mysql -uroot -e "create database %newdb%"
echo %act%
FOR /f "tokens=*" %%G IN ('%act%') DO (
REM echo %count%:%%G
echo mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
set /a count+=1
)
mysql -uroot -e "drop database %olddb%"
答案 35 :(得分:1)
我使用以下方法重命名数据库
使用mysqldump或任何数据库工具备份文件,例如heidiSQL,mysql管理员等
在某些文本编辑器中打开备份(例如backupfile.sql)文件。
搜索并替换数据库名称并保存文件。
4.恢复已编辑的sql文件
答案 36 :(得分:1)
TodoInTx的解决方案和user757945改编的解决方案都不适用于MySQL 5.5.16,所以这是我的改编版本:
DELIMITER //
DROP PROCEDURE IF EXISTS `rename_database`;
CREATE PROCEDURE `rename_database` (IN `old_name` VARCHAR(20), IN `new_name` VARCHAR(20))
BEGIN
DECLARE `current_table_name` VARCHAR(20);
DECLARE `done` INT DEFAULT 0;
DECLARE `table_name_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE (`table_schema` = `old_name`);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = 1;
SET @sql_string = CONCAT('CREATE DATABASE IF NOT EXISTS `', `new_name` , '`;');
PREPARE `statement` FROM @sql_string;
EXECUTE `statement`;
DEALLOCATE PREPARE `statement`;
OPEN `table_name_cursor`;
REPEAT
FETCH `table_name_cursor` INTO `current_table_name`;
IF NOT `done` THEN
SET @sql_string = CONCAT('RENAME TABLE `', `old_name`, '`.`', `current_table_name`, '` TO `', `new_name`, '`.`', `current_table_name`, '`;');
PREPARE `statement` FROM @sql_string;
EXECUTE `statement`;
DEALLOCATE PREPARE `statement`;
END IF;
UNTIL `done` END REPEAT;
CLOSE `table_name_cursor`;
SET @sql_string = CONCAT('DROP DATABASE `', `old_name`, '`;');
PREPARE `statement` FROM @sql_string;
EXECUTE `statement`;
DEALLOCATE PREPARE `statement`;
END//
DELIMITER ;
希望它可以帮助那些在我身边的人!注意:@sql_string
之后会留在会话中。我没有使用它就无法编写这个功能。
答案 37 :(得分:1)
如果使用分层视图(从其他视图中提取数据的视图),从mysqldump导入原始输出可能不起作用,因为mysqldump不关心视图的正确顺序。因此,我wrote script重新命令视图以便在运行中正确排序。
它像这样:
#!/usr/bin/env perl
use List::MoreUtils 'first_index'; #apt package liblist-moreutils-perl
use strict;
use warnings;
my $views_sql;
while (<>) {
$views_sql .= $_ if $views_sql or index($_, 'Final view structure') != -1;
print $_ if !$views_sql;
}
my @views_regex_result = ($views_sql =~ /(\-\- Final view structure.+?\n\-\-\n\n.+?\n\n)/msg);
my @views = (join("", @views_regex_result) =~ /\-\- Final view structure for view `(.+?)`/g);
my $new_views_section = "";
while (@views) {
foreach my $view (@views_regex_result) {
my $view_body = ($view =~ /\/\*.+?VIEW .+ AS (select .+)\*\/;/g )[0];
my $found = 0;
foreach my $view (@views) {
if ($view_body =~ /(from|join)[ \(]+`$view`/) {
$found = $view;
last;
}
}
if (!$found) {
print $view;
my $name_of_view_which_was_not_found = ($view =~ /\-\- Final view structure for view `(.+?)`/g)[0];
my $index = first_index { $_ eq $name_of_view_which_was_not_found } @views;
if ($index != -1) {
splice(@views, $index, 1);
splice(@views_regex_result, $index, 1);
}
}
}
}
用法:
mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase
答案 38 :(得分:1)
如果您从包含多个数据库的转储文件开始,则可以在转储上执行sed:
sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...
然后导入您的转储。确保没有名称冲突。
答案 39 :(得分:0)
你们要为此拍我,而且很可能每次都不会这样做,而且肯定是反对所有逻辑等等......但我刚试过的是......停止MySQL引擎,以root身份登录,只需在文件系统级别重命名DB ....
我在OSX上,只改变了从bedbf到BEDBF的情况。令我惊讶的是它有效......
我不建议在生产数据库上使用它。我刚尝试过这个实验......
祝你好运: - )
答案 40 :(得分:0)
您无法执行此操作是有原因的。 (尽管尝试了所有答案)
您需要在该数据库中转储所有对象类型,创建新命名的数据库,然后导入转储。如果这是一个实时系统,则需要将其删除。如果不能,则需要设置从该数据库到新数据库的复制。
如果要查看可以执行此操作的命令,请@satishD has the details,它传达了一些挑战,您需要围绕这些挑战来构建与目标数据库匹配的策略。
答案 41 :(得分:0)
UPDATE `db`SET Db = 'new_db_name' where Db = 'old_db_name';
答案 42 :(得分:0)
I)。你无法直接改变现有数据库的名称 但是你可以按照以下步骤实现你的目标: - 1)。创建newdb。 2)。使用newdb。 3)。 create table table_name(select * from olddb.table_name);
通过执行上述操作,您可以从olddb表复制数据并将其插入newdb表中。给表格的名称相同。
II)。 RENAME TABLE old_db.table_name TO new_db.table_name;
答案 43 :(得分:0)
我今天发布了这个How do I change the database name using MySQL?,经过几天的头部划伤和拔毛。 解决方案很简单,将模式导出到.sql文件并打开文件,并在顶部的sql CREAT TABLE部分中更改数据库/模式名称。如果将多个模式保存到文件中,则有三个或更多实例,并且可能不在页面顶部。 以这种方式编辑整个数据库是可行的,但我希望在大型数据库中,在表属性或索引的所有实例之后可能会非常痛苦。
答案 44 :(得分:-1)
这里有很多非常好的答案,但我没有看到PHP版本。这将在大约一秒钟内复制800M DB。
$oldDbName = "oldDBName";
$newDbName = "newDBName";
$oldDB = new mysqli("localhost", "user", "pass", $oldDbName);
if($oldDB->connect_errno){
echo "Failed to connect to MySQL: (" . $oldDB->connect_errno . ") " . $oldDB->connect_error;
exit;
}
$newDBQuery = "CREATE DATABASE IF NOT EXISTS {$newDbName}";
$oldDB->query($newDBQuery);
$newDB = new mysqli("localhost", "user", "pass");
if($newDB->connect_errno){
echo "Failed to connect to MySQL: (" . $newDB->connect_errno . ") " . $newDB->connect_error;
exit;
}
$tableQuery = "SHOW TABLES";
$tableResult = $oldDB->query($tableQuery);
$renameQuery = "RENAME TABLE\n";
while($table = $tableResult->fetch_array()){
$tableName = $table["Tables_in_{$oldDbName}"];
$renameQuery .= "{$oldDbName}.{$tableName} TO {$newDbName}.{$tableName},";
}
$renameQuery = substr($renameQuery, 0, strlen($renameQuery) - 1);
$newDB->query($renameQuery);
答案 45 :(得分:-3)
最简单的是,打开 MYSQL&gt;&gt; SELECT DB ,您要更改其名称&gt;&gt;点击“操作”,然后将新名称放入“将数据库重命名为:”字段,然后点击“开始”按钮
简单!
答案 46 :(得分:-3)
真的,最简单的答案是导出旧数据库,然后将其导入到您创建的新数据库中以替换旧数据库。当然,您应该使用phpMyAdmin或命令行来执行此操作。
重命名和Jerry-rigging数据库是一个坏主意!不要这样做。(除非你是在黑暗中坐在母亲的地下室并且在白天吃披萨的“黑客型”。)
你最终会遇到比你想要的更多问题和工作。
所以,
此文件的扩展名为.sql
- phpMyAdmin SQL转储 - 版本3.2.4
- 主持人:localhost - 世代时间:2010年6月30日下午12:17 - 服务器版本:5.0.90 - PHP版本:5.2.6
SET SQL_MODE =“NO_AUTO_VALUE_ON_ZERO”;
/ *!40101 SET @OLD_CHARACTER_SET_CLIENT = @@ CHARACTER_SET_CLIENT /; / !40101 SET @OLD_CHARACTER_SET_RESULTS = @@ CHARACTER_SET_RESULTS /; / !40101 SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION /; / !40101 SET NAMES utf8 * /;
-
mydatab_online
-
user
CREATE TABLE IF NOT NOT EXISTS user
(
timestamp
int(15)NOT NULL默认为'0',
ip
varchar(40)NOT NULL default'',
file
varchar(100)NOT NULL default'',
PRIMARY KEY(timestamp
),
KEY ip
(ip
),
KEY file
(file
)
)ENGINE = MyISAM DEFAULT CHARSET = latin1;
-
user
INSERT INTO user
(timestamp
,ip
,file
)价值观
(1277911052,'999.236.177.116',''),
(1277911194,'999.236.177.116','');
这将是您的.sql文件。你刚刚出口的那个。
在你的硬盘上找到它;通常在/temp
。选择具有正确名称的空数据库(您正在阅读此内容的原因)。
说:进口 - GO
将程序输入到通常为configuration.php的文件中,将程序连接到正确的数据库。刷新服务器(两者。为什么?因为我是UNIX oldtimer ,我这样说。 现在,你应该保持良好状态。如果您有任何其他问题,请访问我网站。
答案 47 :(得分:-3)
答案 48 :(得分:-4)
如果您正在使用phpMyAdmin,那么您只需转到xamp中的mysql
文件夹,关闭phpMyAdmin,然后将您刚看到的文件夹重命名为数据库名称,然后重新启动phpMyAdmin。您可以看到该数据库已重命名。