ALTER TABLE语法用于修改表的结构,例如增加列、删除列、修改列的数据类型、新增表属性等。本文介绍ALTER TABLE语法在不同引擎中的使用方法和差异。
引擎与版本
ALTER TABLE语法适用于宽表引擎和时序引擎。无版本限制。
注意事项
ALTER TABLE操作不会锁定表,在执行DDL操作过程中整个表都是可以正常读写的。在读写过程中,可能会遇到超时报错或轻微抖动和毛刺,可能是由于以下原因:
DDL操作变更时,每个分片都会先关闭再打开并重新加载元数据,该过程耗时很短,通常在十毫秒至数百毫秒之间。如果在该过程恰好有请求发送至重新打开的分片,则此时请求可能会有轻微抖动或毛刺,建议您在业务低峰期执行DDL变更操作。
所有DDL操作都会在分片完成变更后才会返回执行结果,因此在对规模较大的表执行DDL操作时,由于客户端超时时间较短,可能会遇到超时报错,但实际上DDL操作会在服务器上继续执行直至完成。
语法
alter_table_statement ::= ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::= ADD [COLUMN] column_name type [TAG]
| DROP COLUMN [ IF EXISTS ] column_name
| SET table_options
| COMPACT (idcName)?
差异说明
Lindorm宽表引擎和时序引擎的ALTER TABLE语法差异较大。差异对比请参见下表。
语法要素 | 宽表引擎 | 时序引擎 |
ADD COLUMN | 〇 | 〇 |
COMPACT | 〇 说明 宽表引擎2.3.4及以上版本支持。 | ✖️ |
DROP COLUMN | 〇 说明 宽表引擎2.6.6及以上版本支持。 | ✖️ |
SET table_options | 〇 | ✖️ |
使用说明
ADD COLUMN(新增列)
宽表引擎和时序引擎均支持ADD COLUMN。
新增列有以下规则:
新增的列不能声明为主键。
针对时序引擎,只支持新增标签列(TAG)和量测值列(FIELD),不支持新增时间戳列。
DROP COLUMN(删除列)
仅版本为2.6.6及以上版本的宽表引擎支持DROP COLUMN。
如果您无法通过控制台升级至2.6.6及以上版本,请联系Lindorm技术支持(钉钉号:s0s3eg3)。
DROP COLUMN操作是异步执行的,ALTER TABLE
语句执行成功后系统会立刻删除目标列,但列中的数据在系统完成COMPACT
操作后才会被清理。如果您需要加速数据清理进程,可以手动执行FLUSH
和COMPACT
操作。同时,在数据完成清理前,您无法添加同名列。具体操作及说明,请参见常见问题。
SET table_options(设置表属性)
仅宽表引擎支持SET table_options。
具体的表属性列表,请参见表属性。您可以通过SHOW TABLE VARIABLES
语句验证表属性是否设置成功,详细介绍请参见SHOW TABLE VARIABLES。
修改MUTABILITY和CONSISTENCY属性,有以下两点注意事项:
创建索引之前,支持修改MUTABILITY和CONSISTENCY。
创建索引之后:
无法修改MUTABILITY。
仅支持将CONSISTENCY的值从
eventual
修改为strong
,但不支持从strong
修改为eventual
。
示例请参见开启动态列。
COMPACT(强制执行Major Compaction)
仅版本为2.3.4及以上版本的宽表引擎支持Major Compaction。
执行Major Compaction操作,会合并数据文件,清理已删除或过期的数据,释放磁盘空间,提高读写性能,但Major Compaction操作会占用系统资源。
不指定idcName:
对单可用区实例来说,因为只有一个IDC,是否指定idcName没有区别。
对多可用区实例来说,有2个IDC,不指定idcName时Major Compaction操作的执行规则如下:
宽表引擎版本低于2.6.4.2:只会对idc1进行Major Compaction。
宽表引擎为2.6.4.2及以上版本:默认对所有的IDC进行Major Compaction。
指定idcName,表示对指定IDC进行Major Compaction。idcName可指定多个,多个idcName之间用半角逗号(,)分隔。
示例请参见执行Major Compaction。
示例
本文提供的示例基于CREATE TABLE文档的建表示例语句。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time BIGINT NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);
新增列
为表sensor
新增一个列n1
。
ALTER TABLE sensor ADD COLUMN n1 DOUBLE;
删除列
为表sensor
删除列n1
。
ALTER TABLE sensor DROP COLUMN IF EXISTS n1;
结果验证
执行以下语句可以验证操作结果。
DESCRIBE table sensor;
开启动态列
开启sensor
表的动态列。
ALTER TABLE sensor SET DYNAMIC_COLUMNS = 'true';
关于动态列的介绍,请参见动态列。
设置数据有效期
为
sensor
表设置数据有效期,时间单位为秒(s)。ALTER TABLE sensor SET TTL = '2592000';
为
sensor
表取消数据有效期。ALTER TABLE sensor SET TTL = '';
结果验证
在集群管理系统的概览页面,单击目标数据库下的目标表名,可在当前详情表格区域,查看ttl参数的值。如何进入集群管理系统,请参见登录集群管理系统。
设置压缩算法
设置
sensor
表的压缩算法为ZSTD
。ALTER TABLE sensor SET COMPRESSION = 'ZSTD';
设置
sensor
表的压缩算法为NONE
。ALTER TABLE sensor SET COMPRESSION = 'NONE';
结果验证
在集群管理系统的概览页面,单击目标数据库下的目标表名。在当前详情表格区域,单击查看表属性,查看COMPRESSION参数的值。
设置冷热分离
关于冷热分离的介绍,请参见冷热分离介绍。
设置冷热分界线
按时间戳冷热分离
设置表sensor
表的冷热分界线。宽表引擎会基于每一行数据实际写入数据库的时间戳(入库时间戳)来计算是否需要将该数据归档至容量型云存储。
-- 为表sensor开启按按时间戳冷热分离,设置冷热分离时间点为一天。
ALTER TABLE sensor SET CHS = '86400', CHS_L2 = 'storagetype=COLD';
结果验证
您可以通过SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';
语句,查看CHS和CHS_L2参数的值。SHOW VARIABLES
语法的详细介绍,请参见SHOW VARIABLES。
按自定义时间列冷热分离
按自定义时间列冷热分离对自定义时间列存在限制和要求,在使用前请阅读相关注意事项,具体内容请参见注意事项。
将自定义时间列time
设置为表sensor
的冷热分界线。宽表引擎会基于每一行数据的time
列的时间戳(业务时间戳),来计算是否需要将该数据归档至容量型云存储。
-- 为表sensor开启按自定义列冷热分离,设置冷热分离时间点为一天,并按time列冷热分离。
ALTER TABLE sensor SET CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=time';
结果验证
您可以通过SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';
语句,查看CHS、CHS_L2和CHS_COLUMN参数的值。SHOW VARIABLES
语法的详细介绍,请参见SHOW VARIABLES。
取消冷热分界线
取消sensor表的冷热分界线。
ALTER TABLE sensor SET CHS = '', CHS_L2 = '';
结果验证
您可以通过SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';
语句,查看CHS和CHS_L2参数的值。SHOW VARIABLES
语法的详细介绍,请参见SHOW VARIABLES。
执行Major Compaction
对sensor表执行Major Compaction。
ALTER TABLE sensor COMPACT;
说明如果实例为多可用区实例,需注意以下规则:
如果宽表引擎版本低于2.6.4.2版本,未指定IDC时,系统默认对idc1进行Major Compaction。
如果宽表引擎为2.6.4.2及以上版本,系统默认对所有的IDC进行Major Compaction。
对idc2执行Major Compaction。
ALTER TABLE sensor COMPACT 'idc2';
对idc1和idc2执行Major Compaction。
ALTER TABLE sensor COMPACT 'idc1,idc2';
=