mysql如何更改库名
[TOC]
如果 库中所有表为MyISAM引擎,直接更改 datadir 目录下该库对应的目录 即可(需要停机,也不太实际),而 Innodb 这样操作则会提示相关表不存在。
本文以 老库aaa 改为 新库bbb 为例,介绍3种 innodb 数据库改名的方案,仅供参考。
准备测试数据
use mysql;
drop database if exists aaa;
drop database if exists bbb;
create database aaa;
create table aaa.t1(id int);
insert into aaa.t1 values(1),(2),(3);
select * from aaa.t1;
方案1-直接 rename 库名 - 已弃用
- MySQL 5.1.7 到 5.1.23 之间的版本提供了一个
rename database aaa to bbb
的命令来直接对数据库改名,可能由于实现的功能不完备(比如,这条命令可能是一个超大的事务,或者是由于之前的表很多还是 MyISAM 等),官方并不推荐(会有丢失数据的危险),后来的版本直接取消了这条命令。
方案2-利用 rename table 改整库的表名 - 慎用
- 利用 rename table 改表名的方法,在新表的表名前面加上新的数据库名,这样就会将老数据库的表移动到新的数据库。
- 参考这个思路,把旧库的所有表依次遍历,批量改名为新库的表。所以,这种方法简单快速,但此方案只迁移表,不迁移 存储过程、视图、事件、触发器等对象,慎用。
#!/bin/bash
olddb=aaa
newdb=bbb
host=x.x.x.x
port=3406
user=dba_admin
pawd=***
mysql -h$host -P$port -u$user -p$pawd -e"create database if not exists ${newdb};"
tablist=$(mysql -h$host -P$port -u$user -p$pawd -Nse"select table_name from information_schema.TABLES where TABLE_SCHEMA='${olddb}' order by table_name;")
for table in $tablist
do
mysql -h$host -P$port -u$user -p$pawd -e"rename table ${olddb}.${table} to ${newdb}.${table};"
done
#mysql -h$host -P$port -u$user -p$pawd -e"drop database if exists ${olddb};"
附:mysql登陆命令行参数
-e, --execute=name #.执行mysql的sql语句
-N, --skip-column-names #.不显示列信息
-s, --silent #.一行一行输出,中间有tab分隔
- 其实利用 navicat 拖拽老库的表名到新库,也是这个思路:
1.创建新的数据库
2.使用 navicat 选中老库的所有旧表,拖动到新库,就可以复制表结构和数据,而且速度很快
3.复制完成之后,老库可以删除,留着当个备份也行
方案3-利用mysqldump导出老库数据并导入新库 - 安全
如下方案最安全,但如果数据量大,就比较耗时,稍微折腾。
- mysqldum 导出老库 aaa(包含:表、视图、触发器、事件、存储过程、存储函数等)
mysqldump --single-transaction --master-data=2 --flush-logs --set-gtid-purged=off --triggers --events --routines --skip-tz-utc -uroot -p --databases aaa > /data/aaa.sql
- 创建新库 bbb
create database if not exists bbb;
- 替换dump文件中的db名称(因为dump文件里包含 CRATE DATABASE aaa 和 USE aaa)
sed -i '/DATABASE/d' /data/aaa.sql
sed -i '/^USE `aaa`;/c USE `bbb`;' /data/aaa.sql
- 将老库的备份文件导入新库 bbbb
source /data/aaa.sql;
- 删除老库 aaa
drop database if exists aaa;