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

时间:2020-03-05 18:54:34  来源:igfitidea点击:

MySQL的MySQL手册对此进行了介绍。

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

这需要与InnoDB一起使用,后者存储的内容与MyISAM完全不同。

解决方案

回答

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

回答

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

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

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

回答

三种选择:

  • 创建新数据库,关闭服务器,将文件从一个数据库文件夹移动到另一个数据库文件夹,然后重新启动服务器。请注意,这仅在所有表均为MyISAM的情况下才有效。
  • 创建新数据库,使用CREATE TABLE ... LIKE语句,然后使用INSERT ... SELECT * FROM语句。
  • 使用mysqldump并重新加载该文件。

回答

简单的方法

转到数据库目录:

cd /var/lib/mysql/

关闭MySQL ...这很重要!

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

回答

在MySQL Administrator中,请执行以下操作:

  • 在目录下,创建一个新的数据库架构。
  • 转到备份并创建旧模式的备份。
  • 执行备份。
  • 转到"还原",然后打开在步骤3中创建的文件。
  • 在"目标模式"下选择"另一个模式",然后选择新的数据库模式。
  • 开始还原。
  • 验证新架构,如果看起来不错,请删除旧架构。

回答

这是我编写的用于从命令行自动执行的批处理文件,但适用于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=

回答

使用以下几个简单命令:

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

或者为了减少I / O,请使用@Pablo Marin-Garcia建议的以下内容:

mysqladmin -u username -p create newdatabase
mysqldump -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用户名-ppassword部分。

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

mysqldump -R old_db | mysql new_db

回答

我对服务器故障提出了一个问题,该问题试图通过使用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))
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

回答

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

重命名和Jerry-riging数据库是一个BAD-IDEA!不要做。 (除非我们是黑暗中坐在母亲地下室的"黑客型",白天吃比萨饼。)

我们最终将面临比我们想要的更多的问题和工作。

所以,

  • 创建一个new_database并以正确的方式命名。
  • 转到phpMyAdmin并打开要导出的数据库。
  • 导出它(检查选项,但是我们应该使用默认设置。
  • 我们将获得与此类似的文件。
  • 此文件的扩展名是.sql-phpMyAdmin SQL Dump-版本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 SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION /; /!40101设置名称utf8 * /; --数据库:mydatab_online--表user的表结构如果用户不存在则创建表(timestampint(15)NOT NULL default'0',ipvarchar(40) NOT NULL默认值'',filevarchar(100)NOT NULL默认值'',PRIMARY KEY(timestamp),KEYip(ip),KEYfile(file))ENGINE = MyISAM DEFAULT CHARSET = latin1; --将表user的数据转储到INSERT到user(timestampipfile)值(1277911052,'999.236.177.116',''),(1277911194,'999.236.177.116 ','');

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

在硬盘上找到它;通常在/ temp中。选择具有正确名称(读取此名称的原因)的空数据库。
说:导入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 -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;