スキーマ(データベース)のリネーム
MySQLでは、スキーマ名を直接変更する次のようなクエリが利用できません。
RENAME SCHEMA old_schema TO new_schema;
また、一度スキーマの内容をダンプしてから、再度別のスキーマにロードする方法は、データベースのデータ量が多い場合は困難です。
データベースエンジンにInnoDBを使用している場合、スキーマをまたぐテーブルのリネームは可能なため、次のような手順でスキーマ全体のリネームを行うことができます。
1. 変更先の名前を持つ新しいスキーマを作成する
まず、空の新しいスキーマを作成します。
CREATE SCHEMA new_schema;
2. テーブルを移動(リネーム)させる
例えば、users
というテーブルを新しいスキーマに移したい場合は、次のクエリを使用します。
RENAME TABLE old_schema.users TO new_schema.users;
ただ、すべてのテーブルに対して、一つ一つ上記のクエリを入力するのは大変です。
次のクエリを実行することで、スキーマ内のすべてのテーブルについて、リネーム用のクエリ文を出力することができます。
SELECT CONCAT('RENAME TABLE old_schema.', TABLE_NAME, ' TO new_schema.',TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='old_schema';
出力されたクエリを実行することで、テーブルの移動が完了します。
また、コマンドライン(Unix)上でmysqlコマンドを利用できる場合は、次のコマンドで同様の操作を一度に行うことができます。
mysql -u <username> -p<password> old_schema -sNe 'SHOW TABLES' | while read table; \
do mysql -u <username> -p<password> -sNe "RENAME TABLE old_schema.$table TO new_schema.$table"; done
3. View(ビュー)とStored Procedure(ストアドプロシージャ)を移動させる
ビューとストアドプロシージャに対しては、上記のRENAMEクエリを実行することができません。新しいスキーマの中に、新たに作成する必要があります。
テーブルと同様の方法で作成用のクエリを出力することができます。
View
SELECT CONCAT('CREATE VIEW new_schema.', TABLE_NAME, ' AS ', VIEW_DEFINITION, ';') FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA='old_schema';
Stored Procedure
SELECT
CONCAT('CREATE PROCEDURE new_schema.', r.ROUTINE_NAME , ' (', COALESCE(p.params, '') , ') ', r.ROUTINE_DEFINITION, '//')
FROM
INFORMATION_SCHEMA.ROUTINES r
LEFT JOIN
(SELECT
GROUP_CONCAT(CONCAT(PARAMETER_MODE, ' ', PARAMETER_NAME, ' ', DATA_TYPE) SEPARATOR ",") AS params,
SPECIFIC_SCHEMA,
SPECIFIC_NAME
FROM
INFORMATION_SCHEMA.PARAMETERS
GROUP BY
SPECIFIC_SCHEMA,
SPECIFIC_NAME) p ON p.SPECIFIC_SCHEMA = 'old_schema' AND p.SPECIFIC_NAME = r.ROUTINE_NAME
WHERE
ROUTINE_SCHEMA = 'old_schema';
Stored Procedureに関しては、出力したクエリを実行する場合には、出力したクエリの上下にクエリ文の区切り文字を一時的に\\
に変更するためのクエリを入れます。これを行わないと、プロシージャ内の;
に反応してシンタックスエラーが発生します。
DELIMITER \\
CREATE PROCEDURE ...
CREATE PROCEDURE ...
CREATE PROCEDURE ...
...
DELIMITER ;