如何快速重命名MySQL数据库(更改其架构名称)?
通常我会将数据库导出并以新名称重新导入。但对于非常大的数据库,这不是一个选择。显然,RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
会产生问题,在少数版本中存在,并且总体上是个坏主意。
如何快速重命名MySQL数据库(更改其架构名称)?
通常我会将数据库导出并以新名称重新导入。但对于非常大的数据库,这不是一个选择。显然,RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
会产生问题,在少数版本中存在,并且总体上是个坏主意。
TodoInTX的存储过程对我来说不太适用。这是我的尝试:
-- 存储过程rename_db:通过表复制重命名数据库。 -- 注意事项: -- 会覆盖任何与“新”数据库名称相同的现有数据库。 -- 仅复制表;不复制存储过程和其他数据库对象。 -- 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 ;
尽管有许多尝试过的答案,但你不能这样做,这是有原因的。
你需要导出该数据库中的所有对象类型,创建新命名的数据库,然后导入导出文件。 如果这是一个在线系统,你需要先关闭它。如果你无法关闭,则需要将此数据库设置为新数据库的复制源。
如果你想查看执行此操作的命令,@satishD提供了详细信息,其中传达了你需要根据目标数据库构建匹配策略的一些挑战。
如果你需要移动多个表格,这里有一个快速生成重命名 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' ;
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中被移除。
select database
goto operations tab
in that rename Database to :
type your new database name and click go
要求删除旧表并重新加载表数据,请在两个选项中都点击“确定”
您的数据库已被重命名
"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[密码] [新数据库名称] < "C:\Backups\db.zip.tmp"
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
在旧模式上具有读/写/删除权限,在新模式上具有读/写/创建权限。
既然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
将在会话中保留。如果不使用它,我将无法编写此函数。