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

MySQL手册在MySQL处介绍了这一点。

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

这需要与InnoDB一起工作,后者存储的内容与MyISAM非常不同。

1497100 次浏览

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

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

在重命名数据库之前,必须停止MySQL

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

三个选项:

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

  2. 创建新的数据库,使用Create TABLE…LIKE语句,然后使用INSERT…从语句中选择*。

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

简单的方法

切换到数据库目录:

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

在MySQL管理员中执行以下操作:

  1. 在Catalogs下,创建一个新的数据库模式。
  2. 进入Backup,创建的备份
  3. 执行备份。
  4. 进入“恢复”,打开文件在步骤3中创建
  5. 选择Target下的“Another Schema”模式并选择新的数据库李模式。< / >
  6. 开始恢复。
  7. 验证新模式,如果看起来很好,删除旧的

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

语法:rename_mysqldb database 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 OFFIF [%2]==[] GOTO HELPIF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)SET RDB_OLDDB=%1SET RDB_NEWDB=%2SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sqlGOTO START
:STARTSET RDB_STEP=1ECHO Dumping "%RDB_OLDDB%"...mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORTSET RDB_STEP=2ECHO Creating database "%RDB_NEWDB%"...mysqladmin %RDB_ARGS% create %RDB_NEWDB%IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORTSET RDB_STEP=3ECHO Loading dump into "%RDB_NEWDB%"...mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORTSET RDB_STEP=4ECHO Dropping database "%RDB_OLDDB%"...mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --forceIF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORTSET RDB_STEP=5ECHO Deleting dump...DEL %RDB_DUMPFILE%IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORTECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".GOTO END
:ERROR_ABORTIF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --forceIF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".GOTO END
:HELPECHO 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
:ENDSET RDB_OLDDB=SET RDB_NEWDB=SET RDB_ARGS=SET RDB_DUMP=SET RDB_STEP=

使用以下几个简单的命令:

mysqldump -u username -p -v olddatabase > olddbdump.sqlmysqladmin -u username -p create newdatabasemysql -u username -p newdatabase < olddbdump.sql

或者使用@Pablo Marin-Garcia建议的以下方法来减少I/O:

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

对于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错误)。如果是这种情况,使用传统的方法克隆一个数据库,然后删除旧的:

    # 0 < / p >

  • 如果你有存储过程,你可以复制它们:

    # 0 < / p >

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

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

我最近才发现了一个很好的方法,使用MyISAM和InnoDB,而且非常快:

RENAME TABLE old_db.table TO new_db.table;

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

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

DROP PROCEDURE IF EXISTS mysql.rename_db;DELIMITER ||CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))BEGINSELECT 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

然而,目标db中的任何触发器都不会开心。您需要先删除它们,然后在重命名后重新创建它们。

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -urootERROR 1435 (HY000) at line 4: Trigger in wrong schema

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

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

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

所以,

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

    ——phpMyAdmin SQL Dump——3.2.4版本

    ——# 0

    ——Host: localhost——生成时间:2010年6月30日中午12:17——服务器版本:5.0.90——PHP版本:5.2.6

    设置SQL_MODE =“NO_AUTO_VALUE_ON_ZERO”;

    < p > / * !40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;/ < / em > !40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;/ < / em > !40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;/ < / em > !40101 SET NAMES utf8 */

    --

    ——数据库:mydatab_online


    --

    ——表0的表结构

    创建表如果不存在user (timestamp int(15) NOT NULL default '0',ip varchar(40) NOT NULL default ",file varchar(100) NOT NULL default ",主键timestamp,键ip (ip),键file (file))引擎=MyISAM默认CHARSET=latin1;

    --

    ——转储表user的数据

    插入user(timestampipfile)值(1277911052, '999.236.177.116', "),(1277911194, '999.236.177.116', ");

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

在你的硬盘上找到它;通常是在/temp。选择具有正确名称(阅读本文的原因)的空数据库。输入:Import - GO

通过将程序输入到通常是configuration.php文件中,将程序连接到正确的数据库。刷新服务器(两个。为什么?因为我是UNIX 下来,我说过。现在,你的状态应该很好。

.如果你有任何进一步的问题,请访问我的网站

如果你使用phpMyAdmin,那么你只需要到xamp中的mysql文件夹,关闭phpMyAdmin,并将你看到的文件夹重命名为你的数据库名,然后重新启动你的phpMyAdmin。可以看到数据库重命名了。

这适用于所有数据库,通过将每个表重命名为Maatkit mysql工具包来实现

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

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

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

这是我所使用的:

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

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))BEGINDECLARE 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;REPEATFETCH old_tables INTO current_table;IF NOT done THENSET @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 ;

如果您使用phpMyAdmin,一旦选择了要重命名的数据库,就可以转到“operations”选项卡。然后转到最后一节“将数据库复制到”(或类似的内容),给出一个名称,并选择下面的选项。在这种情况下,我猜你必须选择“结构和数据”和“在复制之前创建数据库”复选框,最后,按下该部分中的“go”按钮。

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

这是我在Windows上写的重命名数据库的批处理脚本:

@echo offset olddb=olddbnameset newdb=newdbnameSET count=1SET 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%:%%Gecho 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%"

可以使用SQL生成SQL脚本,将源数据库中的每个表传输到目标数据库。

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

您可以使用这两个脚本中的任何一个(我最初建议使用前者,有人“改进”了我的回答,使用GROUP_CONCAT。随你挑,但我更喜欢原版):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')FROM information_schema.TABLESWHERE table_schema='$1';

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

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

这将生成一个SQL命令,然后必须运行该命令。

注意,GROUP_CONCAT有一个默认的长度限制,对于包含大量表的数据库可能会超过这个长度限制。您可以通过运行SET SESSION group_concat_max_len = 100000000;(或其他较大的数字)来更改该限制。

最简单的是,打开Mysql >> select db,你想改变>>点击“操作”的名字,然后是把新名称在“重命名数据库:”字段,然后点击“走”按钮

简单!

我认为这个解决方案更简单,是一些开发人员提出的。phpMyAdmin对此有一个操作。

从phpMyAdmin中选择要选择的数据库。在选项卡中有一个叫做Operations,转到rename部分。这是所有。

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

Enter image description here

更新2022-09-22:MySQL 8.0+增加了一个更简单的解决方案:

不知道从什么时候开始添加RENAME TO关键字,但肯定更简单。不过在尝试之前,我会先把桌子备份一下,尤其是如果你的桌子很大的话。无论如何,它可以实现如下:

ALTER TABLE `schema_name`.`table_name`RENAME TO  `schema_name`.`new_table_name` ;

为了便于阅读,我把它分成了两行,但也可以写成单行,如下:

ALTER TABLE `schema_name`.`table_name` RENAME TO `schema_name`.`new_table_name` ;

为了方便起见,下面是一个小shell脚本,必须使用两个参数执行: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");doecho "$1.$i -> $2.$i"mysql -e "rename TABLE $1.$i to $2.$i"donemysql -e "DROP DATABASE $1"

下面是一行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在旧模式上具有读/写/删除权限,在新模式上具有读/写/创建权限。

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

  1. 新建数据库

  2. 创建重命名查询:

     SELECT CONCAT('RENAME TABLE ',table_schema,'.`',table_name,'` TO ','new_schema.`',table_name,'`;')FROM information_schema.TABLESWHERE table_schema LIKE 'old_schema';
  3. 运行输出

  4. 删除旧数据库

它是从0号开始的。

# 0是MySQL提出的解决这个问题的方法,RENAME DATABASE被删除了。

从# 0:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

有两种方法。

  1. 重命名表old_db。table_name TO new_db.table_name;
  2. Goto操作->在那里你可以看到表选项卡。你可以在这里编辑表名。
对于那些Mac用户,Sequel Pro在数据库菜单中有一个重命名数据库选项。# 0 < / p >

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))BEGINDECLARE `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`;REPEATFETCH `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将在之后的会话中逗留。不使用它,我就无法写出这个函数。

你可以使用这个shell脚本:

参考:# 0

#!/bin/bashset -e # terminate execution on command failure
mysqlconn="mysql -u root -proot"olddb=$1newdb=$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

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

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

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

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

就是这么简单。

你们这些家伙会为此开枪打死我的,很可能这不会每次都管用,当然,这违反了所有的逻辑……但我刚试过的是…停止MySQL引擎,以root身份登录,并在文件系统级别上简单地重命名数据库....

我在OSX上,只改变了情况,从bedbf到bedbf。令我惊讶的是,它竟然起作用了……

我不建议在生产DB上使用它。我只是做了个实验……

祝你好运! -)

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

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

要求删除旧表和重新加载表数据单击确定

数据库被重命名

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

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

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

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

4.恢复已编辑的sql文件

有两种方法:

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

从壳

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

虽然上面的方法很简单,但它是时间和空间消耗。有一些方法可以将上述命令串联在一起以节省空间,但这并不能节省时间。

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

方法2: MySQL有一个非常好的特性,可以重命名表,甚至可以跨不同的模式工作。这个重命名操作是原子的,在重命名表时没有其他人可以访问它。这只需要很短的时间就可以完成,因为更改表名或表的模式只是元数据的更改。下面是重命名的过程方法:

使用所需的名称创建新的数据库模式。使用MySQL的" Rename TABLE "命令将旧模式的表重命名为新模式。删除旧的数据库模式。# 0。如果表上存在触发器,MySQL的“RENAME TABLE”将失败。为了解决这个问题,我们可以做以下的事情:

使用-E, -R flags(除了dump触发器的-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 wheretable_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3)在输出文件中转储视图。在同一个information_schema.TABLES表上使用查询可以找到视图。

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

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

mysql> DROP TRIGGER <trigger_name>;...

在步骤#2中找到的所有“Base”表重命名后,恢复上述转储文件。

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。mysql.db表将old_schema名称更新为new_schema并调用“Flush privileges;”。尽管“方法2″”似乎比“方法1″”复杂一些,但这完全是可编写脚本的。一个简单的bash脚本以适当的顺序执行上述步骤,可以帮助您在下次重命名数据库模式时节省空间和时间。

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

[root@dba~]# /tmp/rename_dbrename_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_testcreate database emp_test DEFAULT CHARACTER SET latin1drop trigger salary_triggerrename table emp.__emp_new to emp_test.__emp_newrename table emp._emp_new to emp_test._emp_newrename table emp.departments to emp_test.departmentsrename table emp.dept to emp_test.deptrename table emp.dept_emp to emp_test.dept_emprename table emp.dept_manager to emp_test.dept_managerrename table emp.emp to emp_test.emprename table emp.employees to emp_test.employeesrename table emp.salaries_temp to emp_test.salaries_temprename table emp.titles to emp_test.titlesloading viewsloading triggers, routines and eventsDropping database emp
real    0m0.643suser    0m0.053ssys     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 affiliatesset -eif [ -z "$3" ]; thenecho "rename_db <server> <database> <new_database>"exit 1fidb_exists=`mysql -h $1 -e "show databases like '$3'" -sss`if [ -n "$db_exists" ]; thenecho "ERROR: New database already exists $3"exit 1fiTIMESTAMP=`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" ]; thenecho "Error retrieving tables from $2"exit 1fiecho "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" ]; thenmysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dumpfimysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dumpfor TRIGGER in $TRIGGERS; doecho "drop trigger $TRIGGER"mysql -h $1 $2 -e "drop trigger $TRIGGER"donefor TABLE in $TABLES; doecho "rename table $2.$TABLE to $3.$TABLE"mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"doneif [ -n "$VIEWS" ]; thenecho "loading views"mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dumpfiecho "loading triggers, routines and events"mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dumpTABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`if [ -z "$TABLES" ]; thenecho "Dropping database $2"mysql -h $1 $2 -e "drop database $2"fiif [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; thenCOLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"fiif [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; thenPROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"fiif [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; thenTABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"fiif [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; thenDB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"fiif [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; thenecho "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fiif [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fiif [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fiif [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fiecho "    flush privileges;"fi
经过几天的挠头和拔头发,我今天发布了这个如何使用MySQL修改数据库名称?。解决方案非常简单,将一个模式导出到一个.sql文件中,然后打开该文件并在顶部的sql CREAT TABLE部分中更改数据库/模式名称。如果将多个模式保存到文件中,则有三个或更多实例,并且可能不在页面顶部。以这种方式编辑整个数据库是可能的,但我预计在大型数据库中,跟踪一个表属性或索引的所有实例可能是相当痛苦的。< / p >

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

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQLFROM information_schema.tables tWHERE table_schema='your_db_name' ;
< p >我)。没有办法直接改变现有数据库的名称但你可以透过以下步骤达到目标:-1).创建newdb。2).使用newdb。3). create table table_name(select * from olddb.table_name)

通过这样做,你复制数据从表的olddb和插入那些在newdb表。给表的名称相同。

II).重命名表old_db。table_name TO new_db.table_name;

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

它是这样的:

#!/usr/bin/env perl
use List::MoreUtils 'first_index'; #apt package liblist-moreutils-perluse 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);}}}}
< p >用法:< br ># 0 < / p >

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

mysqladmin -uroot -pmypassword create newdbnamemysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbnamemysqladmin -uroot -pmypassword drop olddbname

步骤:

  1. 复制行到记事本。
  2. 替换所有对"olddbname", "newdbname", "mypassword"(+可选的"root")的引用。
  3. 在命令行上逐一执行(在提示时输入“y”)。

这里已经有很多非常好的答案,但我没有看到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);

这里的大多数答案都是错误的,原因有两个:

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

Percona有一篇关于如何做好这件事的博客文章:# 0 < / p >

以及由西蒙·R·琼斯(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 -eif [ -z "$3" ]; thenecho "rename_db <server> <database> <new_database>"exit 1fidb_exists=`mysql -h $1 -e "show databases like '$3'" -sss`if [ -n "$db_exists" ]; thenecho "ERROR: New database already exists $3"exit 1fiTIMESTAMP=`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" ]; thenecho "Error retrieving tables from $2"exit 1fiecho "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" ]; thenmysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dumpfimysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dumpfor TRIGGER in $TRIGGERS; doecho "drop trigger $TRIGGER"mysql -h $1 $2 -e "drop trigger $TRIGGER"donefor TABLE in $TABLES; doecho "rename table $2.$TABLE to $3.$TABLE"mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"doneif [ -n "$VIEWS" ]; thenecho "loading views"mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dumpfiecho "loading triggers, routines and events"mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dumpTABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`if [ -z "$TABLES" ]; thenecho "Dropping database $2"mysql -h $1 $2 -e "drop database $2"fiif [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; thenCOLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"fiif [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; thenPROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"fiif [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; thenTABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"fiif [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; thenDB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"fiif [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; thenecho "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fiif [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fiif [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fiif [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fiecho "    flush privileges;"fi

将其保存到名为rename_db的文件中,并使用chmod +x rename_db使脚本可执行,然后像./rename_db localhost old_db new_db那样使用它

在从包含多个数据库的转储文件开始的情况下,您可以对转储执行sed:

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sqlsed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql...

然后导入您的转储。只要确保没有名称冲突即可。

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

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\ MySQL .exeLocalhost -u root -p[password] [new db name] <“C: \备份\ db.zip.tmp " < / p >

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

create database NewDatabaseName like OldDatabaseName;

然后对每个表执行:

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

然后,如果你想,

drop database OldDatabaseName;

这种方法的优点是可以在几乎为零的网络流量的情况下在服务器上完成整个传输,因此它比转储/恢复快得多。

如果你有存储过程/视图等,你可能也想要传输它们。

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

一旦打开相关的DB只需点击:Database—> Rename database...

步骤:

  1. 打# 0
  2. 选择您的数据库
  3. 点击操作选项卡
  4. 将有一个选项卡作为“重命名数据库到”。添加新名称并勾选调整权限。
  5. 点击Go。

enter image description here

简单的方法

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

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

UPDATE `db`SET Db = 'new_db_name' where Db = 'old_db_name';

你不能这么做是有原因的。(尽管有很多尝试的答案)

  • 基本的答案在许多情况下都有效,但在其他情况下会导致数据损坏。
  • 需要根据对数据库的启发式分析来选择策略。
  • # 0 (# 1)

您需要转储中的所有对象类型该数据库,创建新命名的数据库,然后导入转储。如果这是一个正常的系统,你得把它关掉。如果不能,则需要设置从此数据库到新数据库的复制。

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

我能给出的最快和最简单的解决办法是……在MySql Workbench中右键单击你的schema ->点击创建模式>为该模式输入名称。

删除旧名称的旧模式。

你已经准备好摇滚....

注意:仅用于本地目的。不要尝试生产数据库表。创建了模式,但其中没有数据。所以要小心。

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