MySQL rename database如何做?

虽然MySQL里面有rename database的语法,但是只是在5.1.7 to 5.1.23提供的,其他版本并没有,要想做rename操作该如何做呢?percona提供了一个shell

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -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 $2G" -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 $1 $2 -e "show triggersG" | 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
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
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

来源:

https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

时间: 2024-10-16 13:03:39

MySQL rename database如何做?的相关文章

MySQL Drop Database之后的恢复测试

工具介绍 工具的名字叫做:  undrop-for-innodb 代码地址: https://github.com/twindb/undrop-for-innodb 官方文档: https://recovery.twindb.com/ 介绍工具的一篇ppt  http://www.slideshare.net/akuzminsky/undrop-for-innodb 当MySQL 执行 Drop Table或者 Drop Database 的时候,InnoDB并没有删除数据,数据的Page还在磁

用EF DataBase First做一个简单的MVC3报名页面

使用EF DataBase First做一个简单的MVC3报名网站 ORM(Object Relational Mapping)是面向对象语言中的一种数据访问技术,在ASP.NET中,可以通过ADO.NET Entity Framework技术来简化数据访问.在EF里,有Code First,Model First和DataBase First三种方法来实现. 百度百科关于ORM的介绍: http://baike.baidu.com/view/197951.htm?fr=aladdin 1.就像

R12.2.6 installation failed with - Unable to rename database

报错信息: 日志信息:/data/ebsdb/VIS/12.1.0/appsutil/log/VIS_ebstest/12222150.log Phase 3 Rename Database Executing command: sh -c "ORACLE_SID=ORCLVIS;export ORACLE_SID;ORACLE_HOME=/data/ebsdb/VIS/12.1.0;export ORACLE_HOME; /data/ebsdb/VIS/12.1.0/bin/rman targ

MYSQL create database 和 create table 做了一些什么!

create database Studio; 这样就可以创建一个数据库了.他包涵一些什么呢? 可以看到它创建了一个文件夹,下面我们进去看一下它里面有一些什么东西. 还是先建一张表再进去吧,运行一下这个  create table Nums(X int not null); 内容分析: db.opt 文件. 复制到另一个地方,用计事本打开. 发现它保存的是字符集与排序规则信息. .frm 文件. 它保存整个表框架的定义,但是它保存的是密文. .idb文件. 它用来保存表中的数据.

MySQL库database导入到另一台服务器的数据库中

Copying MySQL Databases to Another Machine In cases where you need to transfer databases between different architectures, you can use mysqldump to create a file containing SQL statements. You can then transfer the file to the other machine and feed i

mysql数据库索引如何做?

MySQL索引底层的实现,今天简单聊一聊,少讲"是怎么样",更多说说"为什么设计成这样". 问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去?于是,图书管理员设计了一套规则:(1)一楼放历史类,二楼放文学类,三楼放IT类-(2)IT类,又分软件类,硬件类-(3)软件类,又按照书名音序排序-以便快速找到一本书. 与之类比,数据库存储了1000W条数据,要从中找到name="she

Qt5.2.0 MinGW480 release静态版编译结果、过程及QtCreator配置分享(realfan的编译方法)(configure -h可以显示帮助)(静态编译mysql插件,需要做一些其它工作,机器上要有mysql)(不编译qtwebkit,就不用安装ActivePerl了)(用到 QMediaPlayer的编译办法)

这是我编译好的静态release版,可以直接取用,7z压缩包,解压即用(感谢zzhouqianq提醒)http://yunpan.cn/QDvxdTL9LFLJP (提取码:871c)包含odbc,sqlite,没有webkit如果要自己编译,可以参考下面的过程及需要的文件一.文件准备,下面用到的文件,可以自行到相应官网下载.我在网盘上也共享了:① qt-opensource-windows-x86-mingw48_opengl-5.2.1.exehttp://yunpan.cn/QpMMWfE

mysql create database 指定utf-8编码

如下脚本创建数据库yourdbname,并制定默认的字符集是utf8CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;如果要创建默认gbk字符集的数据库可以用下面的sql:create database yourdb DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 版权声明:本文为博主原创文章,未经博主允许不得转载.

添加MySql Metat Database 信息

有时候我们想看看 一个数据库上面 某种元素(比如表名)的所有信息,在Mysql上 我们可以通过引入information_schema 的方式,就可以非常方便的查看到. 添加步骤 Edit->Preferences 然后在出现的界面的右边栏目中选择 Sql Editor  钩中Show MetaData and Internal Schema 然后退出 再重启一下 Workbench.重新连入我们的DB server, 这时候才会新多一个DB schema “information_schema