1076

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

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

这需要与InnoDB一起使用,它存储的东西与MyISAM非常不同。

4

51 回答 51

947

对于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

于 2010-02-19T18:17:41.447 回答
476

使用这几个简单的命令:

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
于 2009-07-02T07:34:44.087 回答
227

我认为解决方案更简单,并且是一些开发人员建议的。phpMyAdmin 对此有一个操作。

从 phpMyAdmin 中,选择您要选择的数据库。在选项卡中有一个称为操作,转到重命名部分。就这样。

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

在此处输入图像描述

于 2012-01-15T19:46:03.360 回答
119

您可以使用 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;您可以通过运行(或其他一些较大的数字)来更改该限制。

于 2011-11-26T03:35:05.717 回答
63

模拟 MySQL 中缺少的RENAME DATABASE命令:

  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. 删除旧数据库

它取自Emulating The Missing RENAME DATABASE Command in MySQL

于 2012-08-10T20:43:45.390 回答
31

你可以使用这个 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
于 2013-02-07T06:54:29.630 回答
25

三个选项:

  1. 创建新数据库,关闭服务器,将文件从一个数据库文件夹移动到另一个,然后重新启动服务器。请注意,这仅在您的所有表都是 MyISAM 时才有效。

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

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

于 2008-09-15T21:28:12.787 回答
24

简单的方法

切换到数据库目录:

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 数据库。在这种情况下,您必须转储数据库并重新导入它。

于 2008-09-15T21:30:07.697 回答
21

进行完整重命名的最简单的万无一失的方法(包括在最后删除旧数据库,因此它是重命名而不是副本)

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”)的引用替换为等效项。
  3. 在命令行上一一执行(提示时输入“y”)。
于 2016-01-14T16:42:06.323 回答
19

我最近才遇到一种非常好的方法,可以与 MyISAM 和 InnoDB 一起使用,而且速度非常快:

RENAME TABLE old_db.table TO new_db.table;

我不记得我在哪里读到的,但功劳归于其他人,而不是我。

于 2010-05-07T13:15:27.437 回答
17

脚步 :

  1. 点击http://localhost/phpmyadmin/
  2. 选择您的数据库
  3. 单击操作选项卡
  4. 将有一个选项卡作为“将数据库重命名为”。添加新名称并检查调整权限。
  5. 点击前往。

在此处输入图像描述

于 2018-01-19T08:27:42.513 回答
15

这就是我使用的:

$ 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;
于 2010-10-28T15:01:12.227 回答
15

那么有2种方法:

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

从壳牌

 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 的“重命名表”将失败。为了解决这个问题,我们可以做以下事情:

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)将视图转储到输出文件中。可以使用对同一个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 表的简单更新来修复,将 old_schema 名称更新为 new_schema 并调用“刷新权限;”。尽管“方法 2”似乎比“方法 1”复杂一些,但这是完全可以编写脚本的。一个简单的 bash 脚本以正确的顺序执行上述步骤,可以帮助您在下次重命名数据库模式时节省空间和时间。

Percona Remote 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”。最后,这是上面用于“方法 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
于 2014-01-29T11:14:37.917 回答
14

MySQL 目前不支持通过其命令界面重命名数据库,但如果您可以访问 MySQL 存储其数据库的目录,则可以重命名数据库。对于默认 MySQL 安装,这通常位于 MySQL 安装目录下的 Data 目录中。在 Data 目录下找到要重命名的数据库的名称并重命名。但是,重命名目录可能会导致一些权限问题。意识到。

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

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

于 2008-09-15T21:26:07.550 回答
13

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

于 2008-09-15T21:24:15.230 回答
12

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

于 2012-11-30T01:06:26.287 回答
12

由于以下两个原因之一,这里的大多数答案都是错误的:

  1. 您不能只使用 RENAME TABLE,因为可能存在视图和触发器。如果有触发器,则 RENAME TABLE 失败
  2. 如果您想“快速”(按照问题中的要求)重命名大型数据库,则不能使用 mysqldump

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

于 2017-02-09T00:01:06.303 回答
10

似乎没有人提到这一点,但这是另一种方式:

create database NewDatabaseName like OldDatabaseName;

然后为每个表做:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

那么,如果你愿意,

drop database OldDatabaseName;

这种方法的优势在于在几乎为零的网络流量的服务器上进行整个传输,因此它比转储/恢复要快得多。

如果您确实有存储过程/视图/等,您可能也希望传输它们。

于 2017-09-21T15:22:17.803 回答
10

对于 mac 用户,您可以使用Sequel Pro(免费),它只提供重命名数据库的选项。虽然它不会删除旧数据库。

打开相关数据库后,只需单击:Database-->Rename database...

于 2017-10-04T06:51:40.533 回答
9

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

删除过程如果存在 mysql.rename_db;
分隔符 ||
创建过程 mysql.rename_db(在 old_db VARCHAR(100),在 new_db VARCHAR(100))
开始
SELECT CONCAT('CREATE DATABASE', new_db, ';') `# 创建新数据库`;
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, '`;') `# 删除旧数据库`;
结束||
分隔符;

$ time mysql -uroot -e "调用 mysql.rename_db('db1', 'db2');" | mysql -uroot

但是,目标数据库中的任何触发器都不会满意。您需要先删除它们,然后在重命名后重新创建它们。

mysql -uroot -e "调用 mysql.rename_db('test', 'blah2');" | mysql -uroot
第 4 行的 ERROR 1435 (HY000):在错误的架构中触发
于 2010-05-19T17:16:59.373 回答
8

这是我编写的一个批处理文件,用于从命令行自动执行它,但它适用于 Windows/MS-DOS。

语法是 rename_mysqldb 数据库 newdatabase -u [user] -p[password]

:: ***************************************************************************
:: 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=
于 2008-12-12T10:27:41.293 回答
8

为方便起见,下面是一个小 shellscript,它必须使用两个参数执行: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"
于 2012-03-15T14:05:13.083 回答
8

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

要下载 HeidiSQL,请访问 http://www.heidisql.com/download.php

要下载 Wine,请访问 http://www.winehq.org/

要在 HeidiSQL 中重命名数据库,只需右键单击数据库名称并选择“编辑”。然后输入一个新名称并按“确定”。

就是这么简单。

于 2013-02-07T07:02:35.620 回答
7

提出了一个关于服务器故障的问题,试图在使用 MySQL 代理恢复非常大的数据库时绕过停机时间。我没有取得任何成功,但我最终意识到我想要的是重命名数据库功能,因为由于我们数据库的大小,转储/导入不是一个选项。

MySQL 内置了一个 RENAME TABLE 功能,所以我最终编写了一个简单的 Python 脚本来为我完成这项工作。我已经将它发布在 GitHub 上,以防它对其他人有用。

于 2010-04-18T09:51:26.960 回答
7

TodoInTX 的存储过程并不适合我。这是我的尝试:

-- 存储过程rename_db:重命名数据库我的表复制方式。
-- 注意事项:
-- 将破坏与“新”数据库名称同名的任何现有数据库。
-- 只复制表格;存储过程和其他数据库对象不会被复制。
-- 托默奥特曼 (taltman@ai.sri.com)

分隔符 //
如果存在则删除程序 rename_db;
创建过程 rename_db(在 old_db VARCHAR(100)中,在 new_db VARCHAR(100)中)
开始
    声明 current_table VARCHAR(100);
    声明完成 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准备stmt;
    执行语句;

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

    打开旧表;
    重复
        FETCH old_tables INTO current_table;
        如果没有完成 那么
        SET @output = CONCAT('alter table', old_db, '.', current_table, 'rename', new_db, '.', current_table, ';');
        从@output准备stmt;
        执行语句;

        万一;
    直到完成 END REPEAT;

    关闭旧表;

结尾//
分隔符;
于 2011-05-17T18:24:19.407 回答
5

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

13.1.32 重命名数据库语法

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

于 2012-08-16T02:04:49.880 回答
4

在 MySQL Administrator 中执行以下操作:

  1. 在目录下,创建一个新的数据库模式。
  2. 转到备份并创建旧模式的备份。
  3. 执行备份。
  4. 转到还原并打开在步骤 3 中创建的文件。
  5. 在 Target Schema 下选择“Another Schema”,然后选择新的数据库模式。
  6. 开始还原。
  7. 验证新架构,如果看起来不错,则删除旧架构。
于 2008-10-03T04:17:56.557 回答
4

这是一个单行 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

开始时的历史命令只是确保不将包含密码的 MySQL 命令保存到 shell 历史记录中。

确保db_user对旧架构具有读/写/删除权限,并在新架构上具有读/写/创建权限。

于 2012-03-19T00:54:47.747 回答
4

phpmyadmin中,您可以轻松地重命名数据库

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

要求删除旧表并重新加载表数据在两者中单击确定

您的数据库已重命名

于 2013-08-21T06:17:20.893 回答
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' ;
于 2014-08-11T19:00:59.730 回答
4

我是这样做的:备份您现有的数据库。它会给你一个 db.zip.tmp 然后在命令提示符下写下

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[密码] [新数据库名称] < "C:\Backups\db.zip.tmp "

于 2017-07-26T01:03:31.117 回答
4

你不能这样做是有原因的。(尽管尝试了所有答案)

  • 基本答案在许多情况下都有效,而在其他情况下会导致数据损坏。
  • 需要根据对数据库的启发式分析来选择策略。
  • 这就是实现此功能的原因,然后将其删除[文档]

您需要转储该数据库中的所有对象类型,创建新命名的对象类型,然后导入转储。如果这是一个实时系统,您需要将其删除。如果不能,则需要设置从该数据库到新数据库的复制。

如果您想查看可以执行此操作的命令,@satishD 有详细信息,其中传达了一些挑战,您需要围绕这些挑战构建与目标数据库匹配的策略。

于 2020-12-10T12:55:52.923 回答
3

如果您使用的是phpMyAdmin,您可以在选择要重命名的数据库后转到“操作”选项卡。然后转到最后一部分“将数据库复制到”(或类似内容),命名,然后选择下面的选项。在这种情况下,我猜你必须选择“结构和数据”和“复制前创建数据库”复选框,最后按下该部分中的“开始”按钮。

顺便说一句,我在西班牙语中使用 phpMyAdmin,所以我不确定这些部分的英文名称是什么。

于 2011-07-12T15:30:43.283 回答
2

这适用于所有数据库,并通过使用maatkit mysql 工具包重命名每个表来工作

使用 mk-find 打印和重命名每个表。手册页有更多选项和示例

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

如果您安装了 maatkit(这很容易),那么这是最简单的方法。

于 2010-10-12T18:30:29.140 回答
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%"
于 2011-10-06T12:59:05.060 回答
2

你可以通过两种方式做到这一点。

  1. 将表 old_db.table_name 重命名为 new_db.table_name;
  2. 转到操作-> 在那里您可以看到表格选项选项卡。您可以在那里编辑表名。
于 2012-09-06T12:45:02.687 回答
2

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将在之后的会话中徘徊。如果不使用它,我无法编写此函数。

于 2013-01-11T22:33:05.577 回答
1

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

  1. 使用 mysqldump 或任何 DB 工具(例如 heidiSQL、mysql 管理员等)备份文件

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

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

4.恢复编辑好的sql文件

于 2013-09-11T05:24:23.600 回答
1

如果您使用分层视图(视图从其他视图中提取数据),从 mysqldump 导入原始输出可能不起作用,因为 mysqldump 不关心视图的正确顺序。正因为如此,我编写了脚本来重新排序视图以即时纠正顺序。

它看起来像这样:

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

于 2015-08-21T12:48:48.440 回答
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
...

然后导入您的转储。只要确保不会有名称冲突。

于 2017-07-03T15:38:45.800 回答
0

你们会为此向我开枪,而且很可能这不会每次都有效,当然,这违反所有逻辑等等等等……但我刚刚尝试的是……停止 MySQL 引擎,登录以root身份并简单地在文件系统级别重命名数据库......

我在 OSX 上,只是将情况从 bedbf 更改为 BEDBF。令我惊讶的是它起作用了......

我不会在生产数据库上推荐它。我只是尝试将其作为实验...

祝你好运:-)

于 2013-08-02T13:20:43.453 回答
0

我发布了这个如何使用 MySQL 更改数据库名称?今天经过几天的挠头和拉头发。解决方案非常简单,将模式导出到 .sql 文件并打开文件并在顶部的 sql CREAT TABLE 部分更改数据库/模式名称。如果将多个模式保存到文件中,则存在三个或更多实例,并且可能不在页面顶部。以这种方式编辑整个数据库是可能的,但我希望在大型数据库中,跟踪表属性或索引的所有实例可能会非常痛苦。

于 2014-04-20T16:25:26.277 回答
0

I)。您无法直接更改现有数据库的名称,但您可以通过以下步骤实现您的目标:- 1)。创建新数据库。2)。使用新数据库。3)。创建表 table_name(select * from olddb.table_name);

通过上述操作,您可以从 olddb 表中复制数据并将其插入 newdb 表中。给表的名称相同。

二)。将表 old_db.table_name 重命名为 new_db.table_name;

于 2014-09-02T11:52:35.980 回答
0
UPDATE `db`SET Db = 'new_db_name' where Db = 'old_db_name';
于 2020-07-16T05:02:05.557 回答
0

我可以给出的最快和最简单的解决方案是......在 MySql Workbench 中右键单击您的架构 -> 单击创建架构 -> 输入该架构的名称。

用旧名称删除旧模式。

你准备好摇滚了......

注意:: 仅出于本地目的,请执行此操作。不要尝试生产数据库表。架构已创建,但其中没有数据。所以要小心。

于 2022-01-20T10:51:42.363 回答
0

如果您更喜欢 GUI 工具并且碰巧安装了 MySQL Workbench,您可以使用内置的迁移向导

于 2022-01-28T16:33:44.647 回答
-2

这里已经有很多非常好的答案,但我没有看到 PHP 版本。这会在大约一秒钟内复制一个 800M 的数据库。

$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);
于 2016-05-22T21:33:12.927 回答
-3

实际上,最简单的答案是导出旧数据库,然后将其导入您创建的新数据库以替换旧数据库。当然,您应该使用phpMyAdmin或命令行来执行此操作。

重命名和 Jerry 操纵数据库是一个坏主意!不要做。(除非你是“黑客型”,在黑暗中坐在妈妈的地下室里,白天睡觉吃披萨。)

你最终会遇到比你想要的更多的问题和工作。

所以,

  1. 创建一个 new_database 并以正确的方式命名。
  2. 转到您的 phpMyAdmin 并打开您要导出的数据库。
  3. 导出它(检查选项,但您应该可以使用默认值。
  4. 你会得到一个类似或类似的文件。
  5. 此文件的扩展名为 .sql

    -- phpMyAdmin SQL 转储 -- 版本 3.2.4

    -- http://www.phpmyadmin.net

    -- 主机: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 设置@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /; / !40101 设置名称 utf8 */;

    --

    -- 数据库:mydatab_online


    --

    -- 表的表结构user

    如果不存在则创建表usertimestampint(15) NOT NULL default '0', ipvarchar(40) NOT NULL default '', filevarchar(100) NOT NULL default '', PRIMARY KEY ( timestamp), KEY ip( ip), KEY file( file) )引擎=MyISAM 默认字符集=latin1;

    --

    -- 为表转储数据user

    插入user( timestamp, ip, file) 值 (1277911052, '999.236.177.116', ''), (1277911194, '999.236.177.116', '');

这将是您的 .sql 文件。您刚刚导出的那个。

在您的硬盘上找到它;通常它在/temp. 选择具有正确名称的空数据库(您阅读本文的原因)。说:进口 - 去

通过将程序输入到通常是 configuration.php 文件中,将程序连接到正确的数据库。刷新服务器(两者都。为什么?因为我是 UNIX oldtimer,我说过。现在,您应该状态良好。如果您有任何其他问题,请在网络上访问我。

于 2010-06-30T17:58:16.783 回答
-3

最简单的是,打开MYSQL >> 选择要更改其名称的数据库>> 单击“操作”,然后将新名称放入“将数据库重命名为:”字段,然后单击“开始”按钮

简单的!

于 2012-01-05T10:04:26.880 回答
-4

如果您使用的是phpMyAdmin,那么您只需转到mysqlxamp 中的文件夹,关闭 phpMyAdmin 并将刚才看到的文件夹重命名为您的数据库名称,然后重新启动您的 phpMyAdmin。您可以看到该数据库已重命名。

于 2010-10-04T09:01:30.310 回答
-4

简单的方法

ALTER DATABASE `oldName` MODIFY NAME = `newName`;

或者你可以使用在线 sql 生成器

于 2018-07-16T18:59:26.780 回答