DDL 操作指引

最近更新时间:2025-08-08 17:39:12

我的收藏

操作前检查

1. 确认是否有足够的空间进行 DDL 操作。
查看进行 DDL 操作的表当前占用的空间,并通过当前实例的磁盘使用率判断是否有足够的空间进行 DDL 操作。
SELECT
table_name AS '表名',
ROUND((data_length + index_length) / 1024 / 1024, 2) AS '总空间(MB)',
ROUND(data_length / 1024 / 1024, 2) AS '数据空间(MB)',
ROUND(index_length / 1024 / 1024, 2) AS '索引空间(MB)',
ROUND(data_free / 1024 / 1024, 2) AS '碎片空间(MB)'
FROM information_schema.TABLES
WHERE table_schema = '数据库名'
AND table_name = '表名';
说明:
部分 DDL 可以使用 instant DDL,不涉及空间占用,详细请参见 OnlineDDL 说明
2. 查看同名表是否有超长数据的慢查询。
SELECT * FROM information_schema.processlist WHERE INFO LIKE "%表名%" ORDER BY TIME_MS DESC LIMIT 10;
若有,则等慢查询结束后再执行 DDL。
3. 针对大单表,查看数据分布,确认 IO 压力。
SELECT
SUM(region_stats_approximate_size) AS size,
COUNT(b.rep_group_id) AS region_nums,
sql_addr,
c.leader_node_name,
b.rep_group_id
FROM
information_schema.META_CLUSTER_DATA_OBJECTS a
JOIN information_schema.META_CLUSTER_REGIONS b
JOIN information_schema.META_CLUSTER_RGS c
JOIN information_schema.META_CLUSTER_NODES d
ON a.data_obj_id = b.data_obj_id
AND b.rep_group_id = c.rep_group_id
AND c.leader_node_name = d.node_name
WHERE
a.schema_name = '数据库名'
AND a.table_name = '表名'
GROUP BY
rep_group_id
ORDER BY
leader_node_name;
如果数据全部倾斜在某一个节点,建议将 max_parallel_ddl_degree 从默认8设置为4或者2,减少 DDL 并发线程以降低 IO 压力。
4. 通过租户端监控指标确认 CPU/IO 负载。
建议在业务低峰期进行 DDL 操作。

操作中查看进度

-- 查看DDL,是否在执行,LAST_TIMESTAMP 若在更新,则表明 DDL 在执行,如果长时间没有更新,则可能 hang 住
SELECT * FROM information_schema.ddl_jobs WHERE is_history = 0;

-- 查看进度则关注 information_Schema.ddl_jobs INFO 字段中的"progress"信息
ID: 13
SCHEMA_NAME: tdstore
TABLE_NAME: sbtest1
VERSION: 13
DDL_STATUS: SUCCESS
START_TIMESTAMP: 2025-08-08 14:29:35
LAST_TIMESTAMP: 2025-08-08 14:29:35
DDL_SQL: alter table tdstore.sbtest1 add index idx(v)
INFO_TYPE: ALTER TABLE
INFO: {"tmp_tbl":{"db":"tdstore","table":"#sql-d_1000be_6895994e0000ad_1"},"alt_type":1,"alt_tid_upd":{"tid_from":10039,"tid_to":10039},"cr_idx":[{"id":10040,"ver":4,"stat":0,"tbl_type":1,"idx_type":2}],"rm_idx":[],"init":false,"tmp_tab":false,"online_op":true,"wf_rmed":false,"online_copy_stage":0,"idx_op":true,"row_applied":true,"row_apply_saved":true,"current_schema_name":"tdstore","crt_data_obj_task_id":29437883249066288,"dstr_data_obj_task_id":0,"alt_tbl_pp_stage":0,"alt_tbl_policy_option":0,"data_obj_to_be_dstr_arr":[],"progress":"total: 1, scanned: 1 (100.00%)","fillback_mode":"ThomasWrite","exec_addr":{"ip":"10.10.10.10","port":15035},"recov_addr":{"ip":"10.10.10.10","port":15035}}
IS_HISTORY: 1

--通过租户端观察 CPU/IO 负载以及慢查询告警;
INFO 字段中的 progress 即是进度说明: "progress":"total: 1, scanned: 1 (100.00%)"

查看任务结果

--返回empty, 则表明 DDL job 执行结束
SELECT * FROM information_schema.ddl_jobs WHERE is_history = 0;