如何高效的重命名mysql 数据库名称
2013-12-27 11:36
351 查看
大家好:现在分享一下最近的一个测试。大家都知道,在mysql里面,没有提供重命名一个数据库的语句(其实在MySQL 5.1.7 to 5.1.23也有使用过rename database,但是因为很多的危险性,之后的版本就摒弃了这个功能),那么如何在mysql数据库中高效的重命名一个数据库呢?1、使用mysqldump备份出数据库,之后删除原来的数据库,再dump文件中修改旧数据库名称为新的名称,再导入数据库,修改数据库中的相关用户权限(mysqldump的参数必须包含视图、触发器、函数、存储过程等,这里不再说明了)
优点:操作比较简单,不易出错弊端:在遇到数据库较大的时候,时间和磁盘空间都会有很高的要求2、利用renametable的方式实现数据库重命名主要操作步骤:A)新建数据库:create databaseB)重命名旧数据库中的表到新的数据库中,包含视图、触发器等:rename table C)删除旧数据库D)重授权相关用户的权限因为操作较为复杂,先附上两个脚本,rename_db.sh完成数据库表、触发器、事件、函数、存储过程,rename_grants.sh完成相关用户的授权转换
脚本执行方法:
A)bash rename_db.sh localhost old_database_name new_database_nameB)bash rename_grants old_database_name new_database_name
注:如果要使用的话,可以自己先测试一下,看看是否有问题,欢迎修改脚本和指正
看不见附件,贴出来了
1、rename_db.sh
#!/bin/bash
# Copyright 2013 zhujzhuo
. ~/.bash_profile > /dev/null 2>&1
if [ $# -lt 3 ]; then
echo "rename_db <server> <database> <new_database>"
exit 1
fi
old_db_exists=`mysql -h $1 -e "show databases like '$2'" -sss `
if [ -z "$old_db_exists" ]; then
echo "ERROR: Old database not exists $2"
exit 1
fi
db_exists=`mysql -h $1 -s -e "show databases like '$3'" -sss `
if [ -n "$db_exists" ]; then
echo "ERROR: New database already exists $3"
exit 1
fi
TIMESTAMP=`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" ]; then
echo "Error retrieving tables from $2"
exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $0 $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" ]; then
mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
if [ -n $TRIGGERS ];then
for TRIGGER in $TRIGGERS ; do
echo "drop trigger $TRIGGER"
/usr/bin/mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
fi
for TABLE in $TABLES; do
echo "rename table $2.$TABLE to $3.$TABLE"
mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
echo "loading views"
mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
echo "Dropping database $2"
mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
COLUMNS_PRIV=" UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
PROCS_PRIV=" UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
TABLES_PRIV=" UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
DB_PRIV=" UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
echo " flush privileges;"
fi
2、rename_grants.sh
#!/bin/bash
DATE=`date +%Y%m%d`
if [ -f "/tmp/grants$DATE.sql" ];then
rm -fr /tmp/grants$DATE.sql;
fi
for i in `mysql -N -s -e "select concat(\"show grants for '\",user,\"'@'\",host,\"';\") from mysql.user"|grep -w 'show grants'| mysql -N |grep -w 'GRANT'| sed 's/$/;/g' | grep $1 | awk -F'TO' '{print $2}'`;do mysql -N -s -e "show grants for $i"|grep -w 'GRANT'| sed 's/$/;/g' >> /tmp/grants$DATE.sql;done
if [ -f "/tmp/grants$DATE.sql" ];then
sed -i "s/$1/$2/g" /tmp/grants$DATE.sql;
fi
for i in `mysql -N -s -e "select concat(\"show grants for '\",user,\"'@'\",host,\"';\") from mysql.user"|grep -w 'show grants'| mysql -N |grep -w 'GRANT'| sed 's/$/;/g' | grep $1 | awk -F'TO' '{print $2}'`;do mysql -N -s -e "drop user $i" ;done
mysql < /tmp/grants$DATE.sql
本文出自 “爱mysql爱学习” 博客,请务必保留此出处http://zhuatlantis.blog.51cto.com/6106101/1345592
1 234 | [root@percona ~]# mysqldump emp > emp.out[root@percona ~]# mysql -e "CREATE DATABASE employees;"[root@percona ~]# mysql employees < emp.out [root@percona ~]# mysql -e "DROP DATABASE emp;" |
脚本执行方法:
A)bash rename_db.sh localhost old_database_name new_database_nameB)bash rename_grants old_database_name new_database_name
注:如果要使用的话,可以自己先测试一下,看看是否有问题,欢迎修改脚本和指正
看不见附件,贴出来了
1、rename_db.sh
#!/bin/bash
# Copyright 2013 zhujzhuo
. ~/.bash_profile > /dev/null 2>&1
if [ $# -lt 3 ]; then
echo "rename_db <server> <database> <new_database>"
exit 1
fi
old_db_exists=`mysql -h $1 -e "show databases like '$2'" -sss `
if [ -z "$old_db_exists" ]; then
echo "ERROR: Old database not exists $2"
exit 1
fi
db_exists=`mysql -h $1 -s -e "show databases like '$3'" -sss `
if [ -n "$db_exists" ]; then
echo "ERROR: New database already exists $3"
exit 1
fi
TIMESTAMP=`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" ]; then
echo "Error retrieving tables from $2"
exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $0 $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" ]; then
mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
if [ -n $TRIGGERS ];then
for TRIGGER in $TRIGGERS ; do
echo "drop trigger $TRIGGER"
/usr/bin/mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
fi
for TABLE in $TABLES; do
echo "rename table $2.$TABLE to $3.$TABLE"
mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
echo "loading views"
mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
echo "Dropping database $2"
mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
COLUMNS_PRIV=" UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
PROCS_PRIV=" UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
TABLES_PRIV=" UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
DB_PRIV=" UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
echo " flush privileges;"
fi
2、rename_grants.sh
#!/bin/bash
DATE=`date +%Y%m%d`
if [ -f "/tmp/grants$DATE.sql" ];then
rm -fr /tmp/grants$DATE.sql;
fi
for i in `mysql -N -s -e "select concat(\"show grants for '\",user,\"'@'\",host,\"';\") from mysql.user"|grep -w 'show grants'| mysql -N |grep -w 'GRANT'| sed 's/$/;/g' | grep $1 | awk -F'TO' '{print $2}'`;do mysql -N -s -e "show grants for $i"|grep -w 'GRANT'| sed 's/$/;/g' >> /tmp/grants$DATE.sql;done
if [ -f "/tmp/grants$DATE.sql" ];then
sed -i "s/$1/$2/g" /tmp/grants$DATE.sql;
fi
for i in `mysql -N -s -e "select concat(\"show grants for '\",user,\"'@'\",host,\"';\") from mysql.user"|grep -w 'show grants'| mysql -N |grep -w 'GRANT'| sed 's/$/;/g' | grep $1 | awk -F'TO' '{print $2}'`;do mysql -N -s -e "drop user $i" ;done
mysql < /tmp/grants$DATE.sql
本文出自 “爱mysql爱学习” 博客,请务必保留此出处http://zhuatlantis.blog.51cto.com/6106101/1345592
相关文章推荐
- 如何设计高效合理的MySQL查询语句(建立数据库索引的基本原则)
- mysql 如何修改数据库名称?
- 如何查询Oracle,Sql Server,MySQL 中的数据库名称、数据表名称、字段名称
- 如何查询Oracle,Sql Server,MySQL 中的数据库名称、数据表名称、字段名称
- 如何正确获得mysql,access的ADO连接字符串,并使用该连接字符串连接数据库
- mysql 数据库 如何获取刚刚插入的自增长的id号
- 在jsp中如何有JDBC连接各种数据库之MySQL
- mysql如何建立数据库
- 如何通过浏览器 JavaScript API 访问 MySQL 数据库
- 如何使用SQL Manager for MySQL 2007导出整个数据库
- mysql基础:删除数据库,删除表,重命名表
- 使用MySQL Workbench进行数据库设计——修改MySQL Schema的名称
- 如何改数据库名称和文件的扩展名
- mysql+jsp,在jsp页面连接了数据库,已成功获取数据库字段,请问如何取到当前用户对应的信息
- [转]SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
- mysql如何给一个数据库所有表都增加一个字段?
- MySQL外键:数据库新手入门之MySQL中如何定义外键(转)
- mysql处理上百万条的数据库如何优化语句来提高处理查询效率
- 数据库相关名称的命名
- 如何将数据库从SQL Server迁移到MySQL