全部產品
Search
文件中心

PolarDB:秒級修改欄位

更新時間:Mar 29, 2025

在MySQL生態中,修改欄位的類型需要使用COPY演算法對全表資料進行重建,且重建過程中目標表只能查詢資料,不能並發的寫入資料。更糟糕的是,COPY演算法採用單線程進行全表重建,其效率較低。因此,修改欄位類型操作一直是MySQL生態下的痛點問題。為瞭解決這一問題,PolarDB MySQL版支援秒級修改欄位(Instant Modify Column)功能,在修改欄位類型時,只需變更表定義資訊,無需修改已有資料,可以快速完成對任意大小表的欄位類型修改操作。本文介紹如何使用秒級修改欄位類型功能。

前提條件

PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.28及以上,您可以通過查詢版本號碼來確認叢集版本。

參數說明

參數名

層級

說明

loose_innodb_polar_instant_modify_column_enable

Global

秒級修改欄位功能控制開關。取值範圍如下:

  • ON:開啟秒級修改欄位功能。

  • OFF(預設):關閉秒級修改欄位功能。

loose_innodb_polar_instant_modify_column_max_times

Global

設定單表允許的秒級修改欄位最大次數。

取值範圍:1~64。 預設值為16。

說明
  • PolarDB MySQL版秒級修改欄位功能目前處於灰階發布階段。如需使用請前往配額中心,根據配額IDpolarm_82_instant_modify_column找到配額名稱,在對應的操作列單擊申請來開通該功能。

使用限制

  • 僅允許對以下資料類型進行長度擴充變更,不支援秒級修改除長度外的其他欄位屬性。具體支援的變更類型如下:

    • 整數類型:支援在TINYINTSMALLINTMEDIUMINTINTBIGINT類型之間秒級修改,但僅支援秒級擴大長度,不支援秒級縮小長度。

      例如,INT類型可以秒級修改為BIGINT類型,但無法將BIGINT類型秒級修改為INT類型。

    • 字串類型:

      • 支援VARCHAR(N)類型秒級修改為VARCHAR(N+M)類型,其中NM均為大於0的正整數。

        例如,VARCHAR(50)類型可以秒級修改為VARCHAR(300)類型,但不支援將VARCHAR(300)類型秒級修改為VARCHAR(50)類型。

      • 支援CHAR(N)類型秒級修改為CHAR(N+M)類型,其中NM均為大於0的正整數。

        例如,CHAR(30)類型可以秒級修改為CHAR(50)類型,但不支援將CHAR(50)類型秒級修改為CHAR(30)類型。

  • 僅支援行格式(Row Format)為COMPACTDYNAMIC的表。

  • 被修改的欄位不能是索引欄位。

  • 不支援分區表進行秒級修改欄位操作。

  • 不支援使用全文索引或空間索引的表。

  • 不支援在同一條SQL中同時執行除秒級修改欄位以外的其他DDL操作。

說明

您可以在執行DDL操作前使用EXPLAIN DDL功能,直觀地判斷當前DDL操作是否支援INSTANT操作。詳細內容請參見EXPLAIN DDL

使用方法

指定ALGORITHM=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.的錯誤,表示當前修改欄位類型操作無法使用Instant演算法執行。建議您查看loose_innodb_polar_instant_modify_column_enable參數是否已開啟,並仔細核對使用限制

不指定ALGORITHM或指定ALGORITHM=DEFAULT,由PolarDB MySQL自行選擇最優執行方式

當不指定ALGORITHM或者指定為ALGORITHM=DEFAULT時,系統將按照如下優先順序選擇最優的演算法進行修改欄位類型操作。

ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;
說明

PolarDB MySQL版資料庫在演算法選擇過程中遵循以下優先順序順序:

  • 優先使用INSTANT演算法:INSTANT演算法執行DDL操作時,只需要修改資料字典中的中繼資料,不需要修改表中資料。因此,它不受表的大小影響,整個DDL過程可以秒級完成。

  • 其次採用INPLACE演算法:大多數的INPLACE DDL在執行期間支援並發的讀寫操作,且支援使用並行DDL功能進行加速,對業務影響較小。

  • 最後使用COPY演算法:COPY演算法需要重建整表資料,重建期間不允許執行並發寫入操作,對業務影響較大。

查看秒級修改的欄位資訊

INFORMATION_SCHEMA資料庫中新增了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

欄位的類型資訊:MYSQL_TYPE_XXX。

PRTYPE

欄位的PRTYPE資訊。

LEN

欄位的長度資訊。

HAS_DEFAULT

是否有預設值(秒級添加的欄位為 1,否則為 0)。

DEFAULT_VALUE

預設值。

CURRENT_VERSION

當前欄位的版本資訊。

OLD_VERSION_INFO

該欄位上所有的歷史類型資訊。

藉助表INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS,您可以使用如下語句瞭解當前叢集已被秒級修改的欄位的情況:

SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
說明

如果目標表使用了Instant演算法進列欄位類型修改操作,而後又執行了需要重建表的DDL操作(如DROP COLUMN等),系統將會刪除INNODB_INSTANT_COLUMNS表中與該目標表相關的欄位資訊。