スキーマ(データベース)のリネーム


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 ;