MySQL手册中有介绍。
通常我只是转储数据库并用一个新名称重新导入它。这不是非常大的数据库的一个选项。重命名数据库| SCHEMA} db_name TO new_db_name做坏事,只存在于少数版本中,总的来说是个坏主意。
这需要与InnoDB一起工作,InnoDB存储的东西与MyISAM非常不同。
MySQL手册中有介绍。
通常我只是转储数据库并用一个新名称重新导入它。这不是非常大的数据库的一个选项。重命名数据库| SCHEMA} db_name TO new_db_name做坏事,只存在于少数版本中,总的来说是个坏主意。
这需要与InnoDB一起工作,InnoDB存储的东西与MyISAM非常不同。
当前回答
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 ;
其他回答
在phpmyadmin中,您可以轻松地重命名数据库
select database
goto operations tab
in that rename Database to :
type your new database name and click go
要求删除旧表和重新加载表数据单击确定
数据库被重命名
如果您使用分层视图(视图从其他视图中提取数据),从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 .pl
步骤:
点击http://localhost/phpmyadmin/ 选择您的数据库 点击操作选项卡 将有一个选项卡作为“重命名数据库到”。添加新名称并勾选调整权限。 点击Go。
使用以下几个简单的命令:
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
在从包含多个数据库的转储文件开始的情况下,您可以对转储执行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
...
然后导入您的转储。只要确保没有名称冲突即可。