oceanbase-4.3.5.2中3亿测试表进行删除列操作秒级完成?

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.5.2
【问题描述】
1、针对3亿数据量表进行列删除操作
CREATE TABLE sbtest1 (
id int(11) NOT NULL AUTO_INCREMENT,
k varchar(200) DEFAULT NULL,
c char(120) NOT NULL DEFAULT ‘’,
pad char(60) NOT NULL DEFAULT ‘’,
PRIMARY KEY (id),
KEY k_1 (k) BLOCK_SIZE 16384 LOCAL
) ORGANIZATION INDEX AUTO_INCREMENT = 300000001 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 ;
mysql> select count() from sbtest1;
±----------+
| count(
) |
±----------+
| 300000000 |
±----------+
1 row in set (0.02 sec)

mysql> set _force_parallel_ddl_dop = 16;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table sbtest1 drop pad;
Query OK, 0 rows affected (0.37 sec)

检查数据列是否删除:
mysql> select * from sbtest1 limit 1;
±—±----------±--------------------------------------------------------------------+
| id | k | c |
±—±----------±--------------------------------------------------------------------+
| 1 | 167480658 | 50739423477-59896895752-91121550334-25071371310-03454727381-25307272676-12883025003-48844794346-97662793974-67443907837 |
±—±----------±--------------------------------------------------------------------+
1 row in set (0.01 sec)

查看表结构:
mysql> desc sbtest1;
±------±-------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±-------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| k | varchar(200) | YES | MUL | NULL | |
| c | char(120) | NO | | | |
±------±-------------±-----±----±--------±---------------+
3 rows in set (0.01 sec)

mysql>
mysql> select table_name,tablet_id from __all_table where tablet_id=200011 and table_name=‘sbtest1’;
±-----------±----------+
| table_name | tablet_id |
±-----------±----------+
| sbtest1 | 200011 |
±-----------±----------+
1 row in set (0.01 sec)mysql>
mysql> select svr_ip,tablet_id,data_size/1024/1024/1024 from oceanbase.DBA_OB_TABLET_REPLICAS where tablet_id=200011;
±--------------±----------±-------------------------+
| svr_ip | tablet_id | data_size/1024/1024/1024 |
±--------------±----------±-------------------------+
| 10.186.63.162 | 200011 | 22.085485168732 |
| 10.186.63.26 | 200011 | 22.085485168732 |
| 10.186.63.42 | 200011 | 22.085485168732 |
±--------------±----------±-------------------------+
3 rows in set (0.02 sec)

当前疑问:
参考官方文档https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003980529列删除操作为offline ddl,不应该这么快完成吧?

测试修改列属性耗时数据:
mysql> set _force_parallel_ddl_dop = 16;
Query OK, 0 rows affected (0.01 sec)

mysql> alter table sbtest1 modify k int(11);
Query OK, 0 rows affected (25 min 39.20 sec)

mysql> select * from oceanbase.gv$session_longops\G
Empty set (0.02 sec)

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根因分析场景: DDL过程问题
根因分析命令: obdiag rca run --scene=ddl_failure
日志采集场景: DDL过程中报磁盘空间不足的问题
日志采集命令: obdiag gather scene run --scene=observer.ddl_disk_full

为了更好地理解这个问题并找到可能的原因,我建议您使用 obdiag 工具进行根因分析和日志采集。上述命令将帮助我们收集必要的信息来诊断问题。

麻烦您提供一些信息以便我们更好地帮助您:

  1. 您在执行删除列操作时是否有进行其他的操作或任务?
  2. 您能否提供执行该操作时的具体命令及其完整输出?
  3. 在执行该 DDL 操作之前,您是否进行了任何优化或配置更改?
  4. 您当前的 OceanBase 集群配置是什么样的,特别是涉及到存储和计算资源的配置?
  5. 能否查看并提供操作前后系统资源使用情况(如 CPU、内存、I/O)的变化?
  6. 您是否有启用过任何特定的参数或设置来加速 DDL 操作?

附上敏捷诊断工具 obdiag 使用帮助链接

查询一下drop字段前后table id是否变化了

mysql模式,删除列操作在435bp2改为online DDL了.

1 个赞

嗯嗯,在发版记录中看到这个变化了。
oceanbase在4.3.5.2之后支持了快速删列:

  • 快速删列

老版本删列是 Offline DDL,需同步等待数据重整完成,随着数据量增加 DDL 耗时也会增加。新版本实现了快速删列功能,删除列过程中不重整表数据,只在 TableSchema 中标记列被删除(即 UNUSED 列)。由于没有重整数据操作,磁盘水位线并不会因为删列完成而下降。如果想要彻底移除标记删除列,需要执行 ALTER TABLE TABLE_NAME FORCE 命令等待数据重整。

https://www.oceanbase.com/product/oceanbase-database-community-rn/releaseNote#V4.3.5

1 个赞

也就是说我要真的删除一个列,得要执行两条 SQL 才行,一个 drop 列,一个 alter table ,对吗?

第一个命令已经对客户端来说实现了删除列了

第二个alter 是重建数据,相当于释放空间