Object Storage Service (OSS) に保存されているコールドデータテーブルに対して DDL ステートメントを実行すると、PolarDB for MySQL は最も効率的な実行アルゴリズムを自動的に選択します。このドキュメントでは、サポートされている 2 つのアルゴリズム (INSTANT と COPY) について説明し、INSTANT DDL の OSS META 要件を記述し、各アルゴリズムを使用する操作をリストすることで、ワークロードを中断することなく DDL 変更を計画できるようにします。
前提条件
開始する前に、以下を確認してください。
リビジョンバージョン 8.0.2.2.23 以降の MySQL 8.0.2 を実行している PolarDB for MySQL クラスター
クラスターでコールドデータアーカイブが有効になっていること。詳細については、「コールドデータアーカイブを有効にする」をご参照ください。
クラスターへのアクティブ接続。詳細については、「クラスターに接続する」をご参照ください。
カンマ区切り値 (CSV) または Optimized Row Columnar (ORC) フォーマットのコールドデータ
仕組み
PolarDB for MySQL は、コールドデータに対して 2 つの DDL 実行アルゴリズムをサポートしています。
INSTANT アルゴリズム: データディクショナリ内のメタデータのみを変更します。既存のデータは変更、コピー、または再構築されません。操作はテーブルサイズに関係なく数秒で完了します。これはデフォルトです。PolarDB for MySQL は、サポートされている場合に自動的に適用します。
COPY アルゴリズム: すべてのテーブルデータを新しいテーブルにコピーします。コピー中、元のテーブルは SHARED_NO_WRITE (SNW) ロック下に置かれます。読み取りは許可されますが、書き込みはブロックされます。このアルゴリズムは、INSTANT が適用できない場合にのみ使用してください。
アルゴリズムを明示的に指定するには、ALGORITHM 句を DEFAULT、INSTANT、または COPY とともに使用します。指定されたアルゴリズムが操作をサポートしていない場合、エラーが返されます。
PolarDB for MySQL はデフォルトで INSTANT を選択し、操作にテーブルの再構築が必要な場合にのみ COPY にフォールバックします。
INSTANT DDL を使用するための OSS META の有効化
テーブルは、OSS META が有効になっている場合にのみ INSTANT DDL をサポートします。OSS META は、リビジョン 8.0.2.2.23 以降で利用可能な強化されたメタデータ層です。
OSS META が有効になっているか確認
SHOW CREATE TABLE を実行します。出力に OSS META=1 が表示されている場合、OSS META は有効になっています。
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)新しいテーブルに対する OSS META の有効化
use_oss_meta パラメーターを ON に設定します。これは、InnoDB 非パーティション化テーブルが OSS 外部テーブルにアーカイブされるシナリオ、InnoDB パーティションテーブルが OSS 外部テーブルにアーカイブされるシナリオ、および InnoDB テーブルが OSS パーティションにアーカイブされるシナリオの 3 つのアーカイブシナリオすべてに適用されます。
パラメーターがアクティブであることを確認します。
show variables like "use_oss_meta";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| use_oss_meta | ON |
+---------------+-------+
1 row in set (0.03 sec)use_oss_meta が ON の場合、新しくアーカイブされたテーブルには自動的に OSS META マーカーが含まれます。以下の例は、非パーティション化テーブルとパーティションテーブルをアーカイブした後にマーカーが表示されることを示しています。
alter table t engine = csv storage oss;
Query OK, 3 rows affected (2.13 sec)
Records: 3 Duplicates: 0 Warnings: 0
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
alter table t1 change partition p0 engine = orc;
Query OK, 0 rows affected (1.95 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020223 OSS META=1 */ CONNECTION='default_oss_server'
/*!99990 800020205 PARTITION BY RANGE COLUMNS(id)
(PARTITION p0 VALUES LESS THAN (10) ENGINE = ORC,
PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (40) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (50) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (60) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (70) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (80) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN (90) ENGINE = InnoDB,
PARTITION p9 VALUES LESS THAN (100) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (110) ENGINE = InnoDB) */
1 row in set (0.00 sec)既存のテーブルに対する OSS META の有効化
既存のテーブルに OSS META を追加するには、REPAIR TABLE を実行します。
repair table t;
+--------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+--------+----------+----------+
| test.t | repair | status | OK |
+--------+--------+----------+----------+
1 row in set (0.84 sec)
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)REPAIR TABLE の実行中、テーブルは X ロックによってロックされます。テーブルをクエリまたは変更することはできません。実行時間はテーブルサイズに比例します。
OSS META の無効化
OSS META マーカーを削除するには、ALTER TABLE ... DISABLE OSS META を実行します。
alter table t disable oss meta;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */
1 row in set (0.00 sec)変更はデータベースサービスを再起動することなくすぐに有効になります。
サポートされている DDL 操作
以下の表は、各操作が INSTANT (メタデータのみ) または COPY (テーブルの再構築) のどちらを使用するかを示しています。
カラム操作
| 操作 | テーブルを再構築する | メタデータのみを変更する |
|---|---|---|
| カラムを追加 | No¹ | Yes¹ |
| カラムを削除 | Yes | No |
| カラムの名前を変更 | No | Yes |
| カラムをソート | Yes | No |
| カラムのデフォルト値を指定 | No | Yes |
| カラムのコメントを変更 | No | Yes |
| カラムの型を変更 | Yes | No |
| VARCHAR カラムの長さを拡張 | No | Yes |
| カラムの utf8mb3 文字セットを utf8mb4 に変更 | No² | Yes² |
| カラムのデフォルト値を削除 | No | Yes |
| カラムの自動増分値を変更 | No | Yes |
| カラムの値を NULL に変更 | Yes | No |
| カラムの値を非 NULL 値に変更 | Yes | No |
| ENUM または SET カラムの定義を変更 | No | Yes³ |
脚注 1 — カラムの追加: Instant ADD COLUMN 機能は、OSS META が有効になっているテーブルの末尾にのみカラムを追加します。テーブルにプライマリキーがない場合、自動生成された暗黙のプライマリキーカラムとの競合を避けるために、implicit_primary_key を OFF に設定してください。クラスターが Instant ADD COLUMN をサポートしていない場合、代わりに COPY アルゴリズムを使用してください。この場合、テーブルの再構築が必要ですが、再構築中に同時読み取りは許可されます。
脚注 2 — utf8mb3 から utf8mb4 への変更: カラムの文字セットを utf8mb3 から utf8mb4 に変更すると、以下の 3 つの条件すべてが満たされた場合にのみメタデータが変更されます。
カラム型が CHAR、VARCHAR、ENUM、または TEXT であること
カラムにインデックスが作成されていないこと
カラムの最大ストレージ長 (変換前後) が 256 バイト未満または 255 バイト超のいずれかであること
いずれかの条件が満たされない場合、COPY アルゴリズムが使用されます。この場合、テーブルはロックされ、再構築中は読み取りのみが許可されます。INSTANT を強制し、適用できない場合に即時エラーを取得するには、以下を実行します。
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = INSTANT;
ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.脚注 3 — ENUM または SET カラム: メタデータのみの変更は、新しい要素が ENUM または SET カラムの末尾に追加され、データの型のストレージサイズが変更されない場合にのみ適用されます。それ以外の場合、COPY アルゴリズムが完全なテーブルの再構築とともに使用されます。
テーブル操作
| 操作 | テーブルを再構築する | メタデータのみを変更する |
|---|---|---|
| META を有効化 | Yes | No |
| META を無効化 | No | Yes |
| 文字セットを宣言 | No | Yes |
| 文字セットを変換 | Yes | No |
| テーブルの名前を変更 | No | Yes¹ |
| テーブルのコメントを変更 | No | Yes |
脚注 1 — テーブルの名前変更: OSS に保存されているテーブルの名前を変更する場合、OSS データファイルは書き換えられるのではなく、名前が変更されます。速度はテーブルサイズに比例し、メタデータのみを変更する他の INSTANT 操作よりもわずかに遅くなります。