😸

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

2022/05/03に公開1

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}"

Discussion

naotakenaotake
mysql --host=$HOSTNAME --user=$USERNAME --password=$PASSWORD -e "${CREATE_DATABASE} ${RENAME_TABLE_LIST} ${DROP_DATABASE}"

-e オプションで複数クエリを渡した場合、途中でクエリが失敗したときの挙動って以降のクエリは実行されず終了であってるよな...
自分の環境ではそうなったけど、もしかしたら設定で変わったりするのだろか??