データベースの文字セットと照合順序を更新する

このページでは、Cloud SQL データベースの文字セットと照合順序を更新する方法について説明します。

概要

Cloud SQL for MySQL でデータベースを作成するときに、データベースの文字セットと照合順序の構成を指定できます。これらの設定にカスタム値を指定しない場合は、デフォルト値が使用されます。MySQL では、データベース、テーブル、列など、さまざまなオブジェクト レベルで文字セットと照合順序のカスタム値を指定できます。MySQL での文字セットと照合順序の構成の使用について詳しくは、文字セット、照合順序、Unicode をご覧ください。

データベースとデータベース内の一部のオブジェクトをすでに作成した後に、データベースの文字セットまたは照合順序を変更する場合は、このドキュメントの手順で変更できます。

この手順は次のステップで構成されます。

  1. 現在の文字セットと照合順序の値を確認する
  2. 実行する更新レベルを決定する
  3. インスタンスのバックアップを取得する
  4. 保存されたデータベース オブジェクトの再構築コマンドを生成する
  5. データベースを更新し、必要に応じてテーブルと列を更新する
  6. 更新を検証してエラーを確認する
  7. 保存されているデータベース オブジェクトを再作成する
  8. インスタンスの別のバックアップを作成する

現在の文字セットと照合順序の値を確認する

データベースとデータベース オブジェクトの文字セットと照合順序に構成されている既存の値を確認します。データベースを確認する際は、テーブル、列、保存されたオブジェクトの構成も確認する必要があります。次のステートメントを使用して、データベースとそのデータベース オブジェクトを確認できます。

インスタンス構成を確認する

インスタンス(サーバー)レベルのデフォルトのグローバル値を確認するには、MySQL シェルを開始して次のコマンドを入力します。

mysql> SELECT @@character_set_server,@@collation_server;

出力例:

+------------------------+--------------------+
| @@character_set_server | @@collation_server |
+------------------------+--------------------+
| utf8mb4                | utf8mb4_0900_ai_ci |
+------------------------+--------------------+
1 row in set (0.00 sec)

デフォルトのグローバル値が、後でデータベースに提供するカスタム値と異なることを確認できます。

データベースの構成を確認する

データベース レベルで既存の文字セットと照合順序の値を確認するには、次のステートメントを使用します。各ステートメントを実行したら、新しい文字セットまたは照合順序の値で更新するすべてのデータベースとデータベース オブジェクトのリストを作成します。リストの内容は、変更するデータベースと、構成の更新が必要なテーブル、列、データベース オブジェクトの数によって異なります。

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE schema_name
NOT IN ('performance_schema', 'mysql', 'sys', 'information_schema');

たとえば、次のような出力が表示されます。

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def          | test1       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test2       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test3       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
| def          | test4       | utf8mb4                    | utf8mb4_0900_ai_ci     |     NULL | NO                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

ここで、データベースを次のカスタム文字セット値に変更する必要があるとします。

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def          | test1       | ascii                      | ascii_general_ci       |     NULL | NO                 |
| def          | test2       | latin1                     | latin1_swedish_ci      |     NULL | NO                 |
| def          | test3       | utf16                      | utf16_general_ci       |     NULL | NO                 |
| def          | test4       | ucs2                       | ucs2_general_ci        |     NULL | NO                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

この場合、変更する値を含むデータベースごとに、データベースに存在する各オブジェクトを更新する必要があります。

テーブルの構成を確認する

テーブルの既存の値を確認するには、次のステートメントを使用します。

SELECT T.table_name, T.table_schema, CCSA.character_set_name, CCSA.collation_name
FROM information_schema.`tables` T,
  information_schema.`collation_character_set_applicability` CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_schema
NOT IN ('performance_schema', 'mysql', 'sys','information_schema');

出力例:

+------------+--------------+--------------------+-------------------+
| TABLE_NAME | TABLE_SCHEMA | CHARACTER_SET_NAME | COLLATION_NAME    |
+------------+--------------+--------------------+-------------------+
| t1         | test1        | ascii              | ascii_general_ci  |
| t2         | test2        | latin1             | latin1_swedish_ci |
| t3         | test3        | utf16              | utf16_general_ci  |
| t4         | test4        | ucs2               | ucs2_general_ci   |
+------------+--------------+--------------------+-------------------+

テーブル列の構成を確認する

列の値を確認するには、次のステートメントを使用します。

SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'sys', 'mysql');

出力例:

+--------------+------------+-------------+--------------------+------------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME   |
+--------------+------------+-------------+--------------------+------------------+
| test1        | t1         | c           | ascii              | ascii_general_ci |
| test1        | t1         | i           | NULL               | NULL             |
| test2        | t2         | j           | NULL               | NULL             |
| test2        | t2         | v           | ascii              | ascii_general_ci |
| test3        | t3         | k           | NULL               | NULL             |
| test3        | t3         | summary     | utf16              | utf16_general_ci |
| test4        | t4         | col         | ucs2               | ucs2_general_ci  |
| test4        | t4         | p           | NULL               | NULL             |
+--------------+------------+-------------+--------------------+------------------+

アクティブなスキーマまたはデータベースを確認する

アクティブなスキーマまたはデータベースの詳細を確認するには、次のステートメントを使用します。

SELECT TABLE_SCHEMA, TABLE_NAME, CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME, COLUMN_TYPE, C.CHARACTER_SET_NAME
FROM information_schema.TABLES AS T
JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
WHERE TABLE_SCHEMA=SCHEMA()
AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext', 'set' )
ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;

出力例:

+------------+
| DATABASE() |
+------------+
| test3      |
+------------+
+--------------+------------+------------------+-------------+-------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | DEFAULT_CHAR_SET | COLUMN_NAME | COLUMN_TYPE | CHARACTER_SET_NAME |
+--------------+------------+------------------+-------------+-------------+--------------------+
| test3        | t3         | utf16            | summary     | text        | utf16              |
+--------------+------------+------------------+-------------+-------------+--------------------+

ストアド プロシージャの構成を確認する

ストアド プロシージャの値を確認するには、次のステートメントを使用します。

SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';

DB_NAME は、データベースの名前に置き換えます。

出力例:

+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db    | Name | Type      | Definer | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| test2 | p1   | PROCEDURE | root@%  | 2024-08-09 11:47:05 | 2024-08-09 11:47:05 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | latin1_swedish_ci  |
| test2 | p2   | PROCEDURE | root@%  | 2024-08-09 11:48:36 | 2024-08-09 11:48:36 | DEFINER       |         | utf8mb4              | utf8mb4_0900_ai_ci   | latin1_swedish_ci  |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+

ストアド プロシージャの定義を取得するには、次のステートメントを使用します。

SHOW CREATE PROCEDURE DB_NAME.SP_NAME;

次のように置き換えます。

  • DB_NAME: MySQL データベースの名前
  • SP_NAME: ストアド プロシージャの名前

ストアド プロシージャが目的の文字セットまたは照合順序の値を使用していない場合は、プロシージャを削除し、新しい文字セットまたは照合順序で再作成する必要があります。

データベースの照合順序のマッピングを確認する

上記の出力例では、ストアド プロシージャのデフォルトの照合順序は latin1_swedish_ciで、対応する文字セットは latin1 です。つまり、すべての処理は latin1 文字セットを使用して行われます(プロシージャの特定のパラメータにカスタム文字セットのタグが付いている場合を除く)。データベース レベルの文字セットと照合順序のみを変更した場合、データベース レベルの更新でストアド プロシージャは自動的に更新されません。このプロシージャは、引き続き latin1 文字セットとそれに対応する照合順序を使用します。ストアド プロシージャを削除して再作成すると、プロシージャが開始され、データベースの新しい文字セットと新しい照合順序が使用されます。

データベースの照合順序と文字セットのマッピングを確認するには、information_schema.COLLATION_CHARACTER_SET_APPLICABILITY テーブルをクエリします。

たとえば、次のステートメントを使用します。

SELECT CHARACTER_SET_NAME
FROM information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
WHERE COLLATION_NAME = (SELECT database_collation FROM information_schema.ROUTINES
                        WHERE ROUTINE_SCHEMA = "test2" and ROUTINE_NAME = "p1");

出力例:

+--------------------+
| CHARACTER_SET_NAME |
+--------------------+
| latin1             |
+--------------------+

トリガーの構成を確認する

トリガーの値を確認するには、次のようなステートメントを使用します。

SHOW TRIGGERS FROM DB_NAME;

DB_NAME は、MySQL データベースの名前に置き換えます。

トリガーの定義を取得するには、次のようなステートメントを使用します。

SHOW CREATE trigger DB_NAME.TRIGGER_NAME;

次のように置き換えます。

  • DB_NAME: MySQL データベースの名前
  • TRIGGER_NAME: トリガーの名前

トリガーが意図した文字セットまたは照合順序の値を使用していない場合、トリガーを削除して、新しい文字セットまたは照合順序で再作成する必要があります。トリガーが正しいデータベース照合順序のマッピングを使用していることを確認します。データベースの照合順序の確認の詳細については、データベースの照合順序のマッピングを確認するをご覧ください。

イベントの構成を確認する

イベントの値を確認するには、次のようなステートメントを使用します。

SHOW EVENTS FROM DB_NAME;

DB_NAME は、データベースの名前に置き換えます。

イベントの定義を取得するには、次のようなステートメントを使用します。

SHOW CREATE EVENT DB_NAME.EVENT_NAME;

次のように置き換えます。

  • DB_NAME: データベースの名前。
  • EVENT_NAME: イベントの名前。

イベントが意図した文字セットまたは照合順序の値を使用していない場合、イベントを削除して、新しい文字セットまたは照合順序で再作成する必要があります。イベントで正しいデータベース照合順序のマッピングが使用されていることを確認します。データベースの照合順序の確認の詳細については、データベースの照合順序のマッピングを確認するをご覧ください。

関数の構成を確認する

関数の値を確認するには、次のようなステートメントを使用します。

SHOW FUNCTION STATUS WHERE db = 'DB_NAME';

DB_NAME は、データベースの名前に置き換えます。

関数の定義を取得するには、次のようなステートメントを使用します。

SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;

次のように置き換えます。

  • DB_NAME: MySQL データベースの名前
  • FUNCTION_NAME: 関数名

関数が意図した文字セットまたは照合順序の値を使用していない場合、関数を削除して、新しい文字セットまたは照合順序で再作成する必要があります。関数で正しいデータベース照合順序のマッピングが使用されていることを確認します。データベースの照合順序の確認の詳細については、データベースの照合順序のマッピングを確認するをご覧ください。

文字セットまたは照合順序。関数で正しいデータベース照合順序のマッピングが使用されていることを確認します。データベースの照合順序の確認の詳細については、データベースの照合順序のマッピングを確認するをご覧ください。

更新のレベルを決定する

データベースの文字セットと照合順序の構成を確認したら、データベースのリストと、更新が必要なデータベース オブジェクトのリストを作成します。

実行する必要のあるタスクの数は、構成変更が必要なデータベース オブジェクトのタイプによって異なります。

インスタンスのバックアップを作成する

これらの更新を行う前に、インスタンスのバックアップを作成してください。詳しくは、オンデマンド バックアップを作成するをご覧ください。インスタンスで DDL オペレーションを実行せずにバックアップを作成することをおすすめします。

データベースに格納されているデータベース オブジェクトの再構築コマンドを生成する

データベースに保存されているデータベース オブジェクトを削除して、新しい文字セットと照合順序で再作成する場合は、mysqldump ツールを使用してコマンドを生成します。データベースとテーブルの列を更新したら、生成された mysqldump ファイルを使用して、データベースに格納されているデータベース オブジェクトを再構築します。このコマンドは、すべてのストアド プロシージャ、関数、トリガー、イベントのステートメントを生成します。

次のコマンドを実行して、出力を確認し、後で特定のデータベースのストアド プロシージャ、関数、イベントをすべて再作成できるようにします(保存されたデータベース オブジェクトを再作成する場合)。

$ mysqldump -uDBAuser -p -h IP_ADDRESS \
   -P 3306 DB_NAME --no-data --no-create-db \
   --no-create-info --routines --triggers --events \
   --set-gtid-purged=OFF --events > dump_objects.sql

次のように置き換えます。

  • IP_ADDRESS: Cloud SQL for MySQL インスタンスの IP アドレス
  • DB_NAME: MySQL データベースの名前

データベースの更新を行い、必要に応じてテーブルと列を更新する。

このステップでは、データベースの文字セットと照合順序の値を更新します。また、テーブルと列の再構築が必要になる場合があります。

データベース レベルの更新を行う

データベース レベルでのみ更新を行う場合は、次のステートメントを実行してデータベースを更新します。

ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

次のように置き換えます。

  • DB_NAME: 更新するデータベースの名前
  • NEW_CHARSET: データベースに適用する新しい文字セット
  • NEW_COLLATION: データベースに適用する新しい照合順序

データベース レベルとテーブルレベルで更新を行う

データベース レベルとテーブルレベルで更新を行う場合は、次の操作を行います。

  1. 次のステートメントを実行してデータベースを更新します。

    ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    次のように置き換えます。

    • DB_NAME: 更新するデータベースの名前
    • NEW_CHARSET: データベースに適用する新しい文字セット
    • NEW_COLLATION: データベースに適用する新しい照合順序
  2. 更新するテーブルごとに、次のステートメントを実行します。

    ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    次のように置き換えます。

    • TABLE_NAME: 更新するテーブルの名前
    • NEW_CHARSET: テーブルに適用する新しい文字セット
    • NEW_COLLATION: テーブルに適用する新しい照合順序

データベース、テーブル、列レベルで更新を行う

このレベルでは、新しい文字セットと照合順序の設定に準拠するように、既存のデータを再エンコードする必要があります。データベース、テーブル、列レベルの更新を行う場合は、次の操作を行います。

  1. テーブル列の更新に進む前に、次の点に注意してください。

    • ALTER TABLE 文字セットと照合順序の変更により、テーブルが再構築され、テーブルがロックされます。その結果、テーブルにアクセスしようとするアクティブなクエリはすべてブロックされます。
    • ALTER TABLE の文字セットと照合順序の変換には時間がかかります。これは、メモリ内に完全なテーブルを取得するためです。このオペレーションでは、更新されたテーブルにバッファプール ページが使用されるため、並行して実行されるワークロードのレイテンシが増加する可能性があります。
    • 複数のテーブルにアクセスするクエリがあり、一部のテーブルが更新されて、他のテーブルがまだ更新されていない場合、このトランザクション内のクエリにより、一貫性のない結果が生じる可能性があります。
    • ALTER TABLE 文字セットと照合順序の変換を行うプロセスではシャドー テーブルが作成されるため、ディスク使用量を適切に計画してください。
    • ALTER TABLE 文字セットと照合順序の変換を行うと、テーブルのインデックスも再構築されます。
    • レプリカ インスタンスを個別に更新する必要はありません。ALTERDROPCREATE コマンドは自動的にレプリケートされます。ただし、DDL コマンドを実行すると、オペレーション中にレプリカの遅延時間が長くなる可能性があります。
    • これらの更新を適用する前に作成されたバックアップからデータベースを復元する場合は、更新を再度適用する必要があります。
  2. テーブルで、新しい文字セットと互換性のないデータタプルがないか確認します。互換性がない場合は、文字セットを更新する前に修正する必要があります。これを行わないと、変換プロセス中にエラーが発生します。次の SELECT CONVERT ステートメントを使用して、新しい文字セットでデータを検証できます。

    SELECT COLUMN_NAME,CONVERT(COLUMN_NAME USING NEW_CHARSET)
    FROM TABLE_NAME
    WHERE COLUMN_NAME != CONVERT(COLUMN_NAME USING NEW_CHARSET);
    SELECT c,CONVERT(c USING 'ascii')
    FROM t WHERE c != CONVERT(c USING ascii);
    

    出力例:

    +------+--------------------------+
    | c    | convert(c using 'ascii') |
    +------+--------------------------+
    | é    | ?                        |
    | é    | ?                        |
    | £    | ?                        |
    +------+--------------------------+
    

    この例では、出力はこれらの 3 つのタプルを返すため、3 つの不整合な値を修正する必要があります。次のステップに進む前に、クエリの出力を確認し、変換が必要なすべての列に対してクエリがゼロタプルを返すまでデータを修正します。同じ SELECT クエリで複数の列を組み合わせることもできます。

  3. 列レベルでテーブルの文字セットと照合順序を更新するオプションを選択します。

  4. 特定のテーブル列の文字セットを更新する場合は、「列レベル」タブの手順に沿って、選択した列のみを再エンコードします。それ以外の場合は、「テーブルレベル」タブの手順に沿って、テーブル全体を再エンコードします。

    テーブルレベル

    1. 次のステートメントを実行してデータベースを更新します。

      ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      次のように置き換えます。

      • DB_NAME: 更新するデータベースの名前
      • NEW_CHARSET: データベースに適用する新しい文字セット
      • NEW_COLLATION: データベースに適用する新しい照合順序
    2. 影響を受けるテーブルごとに、次のステートメントを実行してテーブルを更新します。

      ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      次のように置き換えます。

      • TABLE_NAME: 更新するテーブルの名前
      • NEW_CHARSET: テーブルに適用する新しい文字セット
      • NEW_COLLATION: テーブルに適用する新しい照合順序
    3. テーブルの一部であるすべての列が新しい文字セットと照合順序で更新されるように、テーブルレベルで更新します。このオプションを使用すると、テーブルが完全に再構築されます。このオプションを使用するには、次のステートメントを実行します。

      ALTER TABLE DB_NAME.TABLE_NAME
      CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      次のように置き換えます。

      • TABLE_NAME: 更新するテーブルの名前
      • NEW_CHARSET: テーブルに適用する新しい文字セット
      • NEW_COLLATION: テーブルに適用する新しい照合順序

    列レベル

    列レベルで更新します。このオプションでは、テーブルも完全に再構築されます。複数の列が更新されると、このオプションによって複数の再構築が発生する可能性があります。

    このオプションを使用するには、次のステートメントを実行します。

    1. 次のステートメントを実行してデータベースを更新します。
    2. ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      次のように置き換えます。

      • DB_NAME: 更新するデータベースの名前
      • NEW_CHARSET: データベースに適用する新しい文字セット
      • NEW_COLLATION: データベースに適用する新しい照合順序
    3. 影響を受けるテーブルごとに、次のステートメントを実行してテーブルを更新します。
    4. ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
       

      次のように置き換えます。

      • TABLE_NAME: 更新するテーブルの名前
      • NEW_CHARSET: テーブルに適用する新しい文字セット
      • NEW_COLLATION: テーブルに適用する新しい照合順序
    5. 次のステートメントを実行して、列レベルで更新します。
    6. ALTER TABLE DB_NAME.TABLE_NAME
      MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      次のように置き換えます。

      • DB_NAME: 更新するデータベースの名前
      • TABLE_NAME: 更新するテーブルの名前
      • COLUMN_DEFINITION: 制約を含む正確な列の定義を指定します。列定義に、古い文字セットと照合順序の値が含まれている場合があります。列定義を新しい値で更新する必要があります。
      • NEW_CHARSET: テーブル列に適用する新しい文字セット
      • NEW_COLLATION: テーブル列に適用する新しい照合順序

      文字セットまたは照合順序の更新が必要なテーブルのすべての文字列に対して、このステートメントを繰り返します。

更新を検証してエラーを確認する

ALTER TABLE オペレーション中に、テーブル内の既存のデータが新しい文字セットと互換性がないことを示すエラーが発生していないか確認します。次に例を示します。

ERROR 1366 (HY000): Incorrect string value: '\xC3\xA9' for column 'c' at row 1

データ互換性エラーが発生した場合は、テーブルでデータ互換性エラーがないか再度確認し、エラーを修正してから、ALTER TABLE ステートメントを再実行してデータを再エンコードすることをおすすめします。

また、ALTER TABLE オペレーションでテーブル(外部キーテーブルと参照テーブル)の列が再エンコードされるまで、外部キーチェックが失敗する可能性があります。この場合は、外部キーチェック(SET FOREIGN_KEY_CHECKS=0;)を無効にして、更新を再度実行できます。

保存したデータベース オブジェクトを再作成する

データベースを正常に更新したら、生成された mysqldump ファイルを使用して、文字セットと照合順序の値で保存されたデータベース オブジェクトを再作成できます。

保存されたデータベース オブジェクトを再作成するには、次の操作を行います。

  1. 保存されたデータベース オブジェクトがデータベースに存在することを確認します。
  2. この削除と再作成の際、保存されたデータベース オブジェクトが存在することを前提とする並列読み込みがないことを確認します。
  3. mysqldump ツールで生成した mysqldump ファイルには、トリガーを削除するためのステートメントは含まれていません。トリガーを削除する必要がある場合は、MySQL ターミナルを開いて、トリガーの DROP ステートメントを生成します。

    mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS
    drop_trigger_statements FROM information_schema.TRIGGERS
    WHERE TRIGGER_SCHEMA = DB_NAME;
  4. 出力をコピーします。

  5. MySQL シェルまたはスクリプトで、データベースのトリガーを削除するステートメントを実行します。

  6. トリガーを削除したら、mysqldump ツールで生成したダンプファイルを適用します。ダンプファイルを適用してオブジェクトを再作成するには、次のように入力します。

    $ mysql -uDBAuser -p -h IP_ADDRESS \
      -P 3306 DB_NAME < dump_objects.sql

    次のように置き換えます。

    • IP_ADDRESS: Cloud SQL for MySQL インスタンスの IP アドレス
    • DB_NAME: データベースの名前。

インスタンスの別のバックアップを作成する

更新が完了したら、インスタンスのバックアップをもう一度作成します。詳しくは、オンデマンド バックアップを作成するをご覧ください。

スクリプトの例

データベース、テーブル、列を更新する必要がある場合は、このセクションで説明するサンプル スクリプトを使用して、データを再エンコードできます。

複数のテーブルを更新するスクリプト

次のスクリプトは、指定されたデータベース内のすべてのテーブルに対して 1 つのステートメントを生成します。このステートメントを使用すると、新しい文字セットと照合順序の設定に準拠するように、既存のデータを再エンコードできます。

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;  ",
"ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION; ")
AS alter_sql FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';

次のように置き換えます。

  • DB_NAME: 更新するデータベースの名前
  • NEW_CHARSET: テーブルに適用する新しい文字セット
  • NEW_COLLATION: テーブルに適用する新しい照合順序

出力例:

+--------------------------------------------------------------------------------------------+
|alter_sql
+--------------------------------------------------------------------------------------------+
| ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;
  ALTER TABLE test1.t1 CONVERT TO CHARACTER SET <new-charset> COLLATE <new-collation>;       |
+--------------------------------------------------------------------------------------------+

テーブル内の複数の列を更新するスクリプト

次のスクリプトは、特定のテーブル内のすべての列にステートメントを生成します。このステートメントを使用すると、新しい文字セットと照合順序の設定に準拠するように、既存のデータを再エンコードできます。

  1. データベース内のすべてのテーブルに ALTER TABLE ステートメントを生成する

    SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;  ")
    AS alter_table_statements
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';

    次のように置き換えます。

    • DB_NAME: 更新するデータベースの名前
    • NEW_CHARSET: テーブルに適用する新しい文字セット
    • NEW_COLLATION: テーブルに適用する新しい照合順序

    出力例:

    +------------------------------------------------------------------------------+
    | alter_table_statements                                                       |
    +------------------------------------------------------------------------------+
    | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;    |
    +------------------------------------------------------------------------------+
    
  2. すべてのテーブルについて、ALTER TABLE MODIFY コマンドを生成します。

    SELECT CONCAT( "ALTER TABLE ", table_name, " MODIFY ", column_name, 'COLUMN_DEFINITION' , " CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION ")
    AS alter_table_column_statements FROM information_schema.columns
    WHERE table_schema = 'DB_NAME' AND table_name = 'TABLE_NAME'
    AND data_type IN ('char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext','set','enum');

    次のように置き換えます。

    • DB_NAME: 更新するデータベースの名前
    • TABLE_NAME: 更新するテーブルの名前
    • COLUMN_DEFINITION: 各クエリから結果を取得したら、各列の列定義に置き換えます(列定義は列によって異なる場合があります)。
    • NEW_CHARSET: テーブル列に適用する新しい文字セット
    • NEW_COLLATION: テーブル列に適用する新しい照合順序

    出力例:

    +-------------------------------------------------------------------------------------------------------------------------------------+
    |alter_table_column_statements                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    | ALTER TABLE t1 MODIFY c <column-definition-replaced-after-obtaining-result-set> CHARACTER SET <new-charset> COLLATE <new-collation>  |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    

次のステップ