MySQLのデータベース名を変更する

13228 ワード

MySQLにはデータベース名を変更するコマンドが無い

MySQLにはデータベース名を変更するコマンドが無いらしいので、他の方法を調べると

があることが分かった。
dumpするのはデータ量がそれなりになると時間がかかるので、RENAME TABLEでやりたくなる。

すべてのテーブルにRENAME TABLEするのは面倒なのでスクリプトを書いた

使い方

./dbrename.bash --host=db --user=root -password=root --database=src --rename=dest
パラメータ 説明
--host 接続するMySQLサーバー
--user サーバー接続時に使用するMySQLユーザー名
--password サーバー接続時に使用するパスワード
--database 変更したいデータベースの名前
--rename 新しいデータベース名

スクリプト

dbrename.bash
#!/bin/bash
# -*- coding: utf-8 -*-

function usage() {
    echo "Usage: dbrename --host=[host_name] --user=[user_name] -password=[password] --database=[src] --rename=[dest]"
    echo "  -I | --help "
    echo "  -h | --host <str>       接続するMySQLサーバー"
    echo "  -u | --user <str>       サーバー接続時に使用するMySQLユーザー名"
    echo "  -p | --password <str>   サーバー接続時に使用するパスワード"
    echo "  -d | --database <str>   変更したいデータベースの名前"
    echo "  -r | --rename <str>     新しいデータベース名"
}

function error() {
    echo $1 >&2
    exit 1
}

readonly ARGUMENT=$@
readonly OPTION_SHORT="I,h:,u:,p:,d:,r:"
readonly OPTION_LONG="help,host:,user:,password:,database:,rename:"

OPT=`getopt -o $OPTION_SHORT -l $OPTION_LONG -- $ARGUMENT` || exit 1
eval set -- $OPT

while :; do
    case $1 in
        -I | --help)
            usage
            exit 0
            ;;
        -h | --host)
            readonly HOSTNAME=$2
            shift 2
            ;;
        -u | --user)
            readonly USERNAME=$2
            shift 2
            ;;
        -p | --password)
            readonly PASSWORD=$2
            shift 2
            ;;
        -d | --database)
            readonly DATABASE=$2
            shift 2
            ;;
        -r | --rename)
            readonly RENAME=$2
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            error "Unknows options ${1}"
            ;;
    esac
done

if [ -z $HOSTNAME ]; then
    error "Require option --host"
fi

if [ -z $USERNAME ]; then
    error "Require option --user"
fi

if [ -z $PASSWORD ]; then
    error "Require option --password"
fi

if [ -z $DATABASE ]; then
    error "Require option --database"
fi

if [ -z $RENAME ]; then
    error "Require option --rename"
fi

# コマンドの作成
# 1. 新しいデータベースを作成
# 2. 元のデータベースから新しいデータベースにテーブルを移動
# 3. 元のデータベースを削除
readonly CREATE_DATABASE="create database ${RENAME};"

TABLES=`mysql --host=$HOSTNAME --user=$USERNAME --password=$PASSWORD -e "use ${DATABASE}; show tables;" -s -N` || exit 1
RENAME_TABLE_LIST=
for TABLE in $TABLES
do
    RENAME_TABLE="rename table ${DATABASE}.${TABLE} to ${RENAME}.${TABLE};"
    RENAME_TABLE_LIST="${RENAME_TABLE_LIST} ${RENAME_TABLE}"
done

readonly DROP_DATABASE="drop database ${DATABASE};"

# コマンドの実行
mysql --host=$HOSTNAME --user=$USERNAME --password=$PASSWORD -e "${CREATE_DATABASE} ${RENAME_TABLE_LIST} ${DROP_DATABASE}"