カラムのデータ型を変更するために、MySQL は COPY アルゴリズムを使用してテーブル全体のデータを再構築します。このプロセス中は、テーブルは読み取り専用になり、同時書き込み操作は許可されません。さらに、COPY アルゴリズムは単一スレッドでテーブル全体を再構築するため、低速で非効率的です。これは、大規模なデータセットを管理する MySQL ユーザーにとって長年の課題となっています。この問題に対処するために、PolarDB for MySQL はカラム即時変更機能を提供します。この機能を使用すると、テーブルサイズに関係なくカラム型をすばやく変更できます。テーブル全体を再構築する代わりに、カラム即時変更機能はテーブルのメタデータのみを変更します。このトピックでは、カラム即時変更機能の使用方法について説明します。
前提条件
クラスターで PolarDB for MySQL 8.0.2(リビジョンバージョン 8.0.2.2.28 以降)が実行されていること。操作前にクラスターのデータベースエンジンバージョンをクエリすることで、データベースエンジンバージョンが要件を満たしていることを確認してください。
パラメーター
パラメーター | レベル | 説明 |
| グローバル | カラム即時変更機能を有効にするかどうかを指定します。有効値:
|
| グローバル | カラム即時変更機能がテーブルのカラム型を変更できる最大回数。 有効値範囲:1 ~ 64。デフォルト値:16。 |
PolarDB for MySQL のインスタント変更カラム機能は、Canary リリース段階です。この機能を使用するには、[クォータセンター] にアクセスし、ID が
polarm_82_instant_modify_columnのクォータを探し、[適用] をクリックします。
制限事項
カラム即時変更機能は、以下のカラム型の長さのみを変更するために使用できます。長さ以外のカラムプロパティを変更するためにカラム即時変更機能を使用することはできません。
整数型:カラム即時変更機能は、
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT型の中で、整数カラムの長さを増やす場合にのみ使用できます。たとえば、カラムを
INT型からBIGINT型に変更することはできますが、BIGINT型からINT型に変更することはできません。文字列型:
インスタント変更カラム機能を使用すると、文字列カラムを
VARCHAR(N)型からVARCHAR(N+M)型に変更できます。ここで、N と M は 0 より大きい正の整数です。たとえば、文字列カラムを
VARCHAR(50)型からVARCHAR(300)型に変更することはできますが、VARCHAR(300)型からVARCHAR(50)型に変更することはできません。インスタント変更カラム機能を使用すると、文字列カラムを
CHAR(N)型からCHAR(N+M)型に変更できます。ここで、N と M は 0 より大きい正の整数です。たとえば、文字列カラムを
CHAR(30)型からCHAR(50)型に変更することはできますが、CHAR(50)型からCHAR(30)型に変更することはできません。
カラム即時変更機能は、
COMPACTまたはDYNAMIC行フォーマットを使用するテーブルにのみ使用できます。インデックスが作成されているカラムを変更するためにカラム即時変更機能を使用することはできません。
パーティションテーブルのカラムを変更するためにカラム即時変更機能を使用することはできません。
フルテキストインデックスまたは空間インデックスが作成されているテーブルのカラムを変更するためにカラム即時変更機能を使用することはできません。
カラム即時変更操作と他の DDL 操作を同じ SQL 文に含めることはできません。
DDL 操作を実行する前に、EXPLAIN DDL 機能を使用して、操作が INSTANT アルゴリズムをサポートしているかどうかを確認できます。
使用方法
INSTANT アルゴリズムを指定して、カラム即時変更機能を強制的に使用する(推奨) 使用を強制するには 機能 (推奨)
CREATE TABLE t(a int);SHOW CREATE TABLE t;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8-- INSTANT アルゴリズムの使用を指定して、カラム型をすばやく変更します。
ALTER TABLE t modify COLUMN a bigint DEFAULT NULL,algorithm=INSTANT;カラム即時変更機能を使用してカラムを追加できない場合は、次のエラーメッセージが返されます:ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE。この場合、loose_innodb_polar_instant_modify_column_enable パラメーターが ON に設定されていることを確認し、操作が制限されているかどうかを判断することをお勧めします。カラム即時変更機能の制限事項については、このトピックの「制限事項」セクションをご参照ください。
アルゴリズムを指定しないか、PolarDB for MySQL のデフォルトアルゴリズムを指定して、最適な実行方法を選択する
アルゴリズムを指定しない場合、またはデフォルトアルゴリズムを指定した場合、システムはアルゴリズムの優先順位に基づいて最適なアルゴリズムを選択します。
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;PolarDB for MySQL は、次の優先順位で DDL アルゴリズムを評価および選択します。
INSTANT アルゴリズム:テーブル内の実際のデータを変更する必要なく、データディクショナリ内のメタデータのみを変更します。DDL 操作は、テーブルサイズに関係なく数秒で完了できます。
INPLACE アルゴリズム:DDL 操作中に同時読み取りおよび書き込みアクセスを許可し、ビジネス運用の中断を最小限に抑えます。並列 DDL を使用して操作を高速化できます。
COPY アルゴリズム:テーブルデータ全体を再構築します。このプロセス中は、テーブルは読み取り専用になり、書き込みアクセスは許可されないため、ビジネス運用に大きな影響を与えます。
カラム即時変更機能を使用して変更されたカラムに関する情報を表示する
INFORMATION_SCHEMA データベースの INNODB_INSTANT_COLUMNS テーブルには、現在のクラスターでカラム即時変更機能を使用して変更されたすべてのカラムが記録されます。このテーブルには、カラム即時変更機能を使用して変更されたカラムのみが含まれます。INNODB_INSTANT_COLUMNS テーブルスキーマ:
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
***************************[ 1. row ]***************************
Table | INNODB_INSTANT_COLUMNS
Create Table | CREATE TEMPORARY TABLE `INNODB_INSTANT_COLUMNS` (
`TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
`TABLE_NAME` varchar(193) NOT NULL DEFAULT '',
`SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',
`COLUMN_NAME` varchar(193) NOT NULL DEFAULT '',
`MTYPE` int(11) NOT NULL DEFAULT '0',
`PRTYPE` int(11) NOT NULL DEFAULT '0',
`LEN` int(11) NOT NULL DEFAULT '0',
`HAS_DEFAULT` int(1) NOT NULL DEFAULT '0',
`DEFAULT_VALUE` mediumblob,
`CURRENT_VERSION` int(11) NOT NULL DEFAULT '0',
`OLD_VERSION_INFO` blob
) ENGINE=InnoDB DEFAULT CHARSET=utf8次の表は、前のステートメントから返されたフィールドの説明です。
カラム名 | 説明 |
TABLE_ID | テーブル ID。 |
TABLE_NAME | テーブル名。 |
SCHEMA_NAME | スキーマ名。 |
COLUMN_NAME | カラム名。 |
MTYPE | カラム型。 |
PRTYPE | 正確なカラム型または属性。 |
LEN | カラムの長さ。 |
HAS_DEFAULT | カラムにデフォルト値があるかどうか。 |
DEFAULT_VALUE | カラムのデフォルト値。 |
CURRENT_VERSION | カラムのバージョン情報。 |
OLD_VERSION_INFO | カラムの履歴型情報。 |
INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS テーブルは、カラム即時変更機能を使用して変更されたカラムを追跡します。次のステートメントを実行することで、テーブルをクエリできます。
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;以前にカラム即時変更機能を使用して変更されたカラムに対して、DROP COLUMN 操作などのテーブルの再構築が必要な DDL 操作を実行すると、システムは INNODB_INSTANT_COLUMNS テーブルから関連するカラム情報を削除します。