😸
MySQLのデータベース名を変更する
MySQLにはデータベース名を変更するコマンドが無い
MySQLにはデータベース名を変更するコマンドが無いらしいので、他の方法を調べると
- dumpする方法
- 全テーブルを
RENAME TABLE
で移動する方法(データーベースに紐づくものってテーブルだけなのだろうか?🤔)
があることが分かった。
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
-e オプションで複数クエリを渡した場合、途中でクエリが失敗したときの挙動って以降のクエリは実行されず終了であってるよな...
自分の環境ではそうなったけど、もしかしたら設定で変わったりするのだろか??