Skip to content

OceanBase 数据库表空间

核心概念

数据库表空间是OceanBase中用于管理数据存储的逻辑单位,是数据库存储架构的重要组成部分。表空间将物理存储设备与数据库对象(如表、索引等)逻辑隔离,便于DBA对存储资源进行统一管理和优化。OceanBase的表空间设计充分考虑了分布式架构的特点,支持多租户隔离、资源配额管理和灵活的存储策略配置。表空间管理是数据库存储管理的基础,对数据库性能、可靠性和可扩展性具有重要影响。

表空间类型

1. 系统表空间

功能:存储OceanBase系统元数据和内部对象 适用场景

  • 存储系统级元数据
  • 存储内置表和视图
  • 系统级对象管理

特点

  • 由系统自动创建和管理,用户无法直接操作
  • 包含系统租户的核心元数据
  • 对数据库正常运行至关重要
  • 通常存储在高速存储设备上

2. 用户表空间

功能:存储用户创建的数据库对象 适用场景

  • 存储用户表和索引
  • 存储用户创建的视图、存储过程等
  • 应用数据管理

特点

  • 由用户创建和管理
  • 支持灵活的存储策略配置
  • 可根据业务需求调整大小
  • 支持资源配额管理

3. 临时表空间

功能:存储临时数据和中间结果 适用场景

  • 存储排序、分组等操作的中间结果
  • 存储临时表数据
  • 大查询的临时数据处理

特点

  • 由系统自动管理,也可手动配置
  • 数据在会话结束或事务提交后自动清理
  • 支持动态扩展
  • 对查询性能有重要影响

4. 日志表空间

功能:存储数据库事务日志 适用场景

  • 存储redo日志
  • 支持事务恢复和数据一致性
  • 备份和恢复操作

特点

  • 由系统自动管理,也可手动配置
  • 采用循环写入方式
  • 对数据可靠性至关重要
  • 支持多副本存储

表空间管理

1. 创建表空间

功能:创建新的用户表空间 适用场景

  • 新应用上线需要新的存储空间
  • 不同业务模块需要独立的表空间
  • 实现存储资源的隔离管理

语法

sql
CREATE TABLESPACE tablespace_name
  DATAFILE 'datafile_path' SIZE size_clause
  [ENGINE [=] engine_name]
  [DEFAULT COMPRESSION [=] compression_type]
  [DEFAULT ENCRYPTION [=] encryption_option];

示例

sql
-- 创建基本表空间
CREATE TABLESPACE users_ts
  DATAFILE '/data/ob/data/users_ts.dbf' SIZE 10G;

-- 创建带压缩的表空间
CREATE TABLESPACE compressed_ts
  DATAFILE '/data/ob/data/compressed_ts.dbf' SIZE 20G
  DEFAULT COMPRESSION 'zstd_1.0';

-- 创建加密表空间
CREATE TABLESPACE encrypted_ts
  DATAFILE '/data/ob/data/encrypted_ts.dbf' SIZE 5G
  DEFAULT ENCRYPTION 'Y';

注意事项

  • 表空间名称必须唯一
  • 数据文件路径必须存在且有足够权限
  • 支持多种压缩算法,如zstd、lz4等
  • 加密表空间需要配置加密密钥

2. 扩展表空间

功能:增加表空间的存储容量 适用场景

  • 表空间使用率过高
  • 业务数据量增长
  • 预见到数据量将大幅增加

扩展方式

2.1 增加数据文件

sql
-- 为表空间添加新的数据文件
ALTER TABLESPACE users_ts
  ADD DATAFILE '/data/ob/data/users_ts2.dbf' SIZE 10G;

2.2 扩展现有数据文件

sql
-- 扩展现有数据文件大小
ALTER TABLESPACE users_ts
  RESIZE DATAFILE '/data/ob/data/users_ts.dbf' TO 20G;

2.3 自动扩展

sql
-- 创建支持自动扩展的数据文件
CREATE TABLESPACE auto_extend_ts
  DATAFILE '/data/ob/data/auto_extend_ts.dbf' SIZE 10G
  AUTOEXTEND ON NEXT 1G MAXSIZE 100G;

-- 修改现有数据文件为自动扩展
ALTER TABLESPACE users_ts
  AUTOEXTEND DATAFILE '/data/ob/data/users_ts.dbf' ON NEXT 512M MAXSIZE 50G;

3. 查看表空间

功能:查看表空间的配置和状态信息 适用场景

  • 监控表空间使用情况
  • 表空间性能分析
  • 存储资源规划

查询示例

sql
-- 查看所有表空间
SELECT * FROM DBA_TABLESPACES;

-- 查看表空间详细信息
SELECT 
  ts.name AS tablespace_name,
  ts.status AS status,
  ts.total_size / 1024 / 1024 / 1024 AS total_size_gb,
  ts.free_size / 1024 / 1024 / 1024 AS free_size_gb,
  (ts.total_size - ts.free_size) / ts.total_size * 100 AS used_percent
FROM oceanbase.DBA_OB_TABLESPACES ts;

-- 查看表空间数据文件
SELECT * FROM DBA_DATA_FILES;

-- 查看表空间使用情况
SELECT 
  t.name AS tablespace_name,
  SUM(s.used_size) / 1024 / 1024 / 1024 AS used_size_gb,
  SUM(s.total_size) / 1024 / 1024 / 1024 AS total_size_gb,
  SUM(s.used_size) / SUM(s.total_size) * 100 AS used_percent
FROM oceanbase.GV$OB_TABLESPACE_STAT s
JOIN oceanbase.DBA_OB_TABLESPACES t ON s.tenant_id = t.tenant_id AND s.name = t.name
GROUP BY t.name;

4. 修改表空间

功能:修改表空间的配置参数 适用场景

  • 调整表空间存储策略
  • 修改表空间状态
  • 更新表空间配置

修改示例

sql
-- 修改表空间状态
ALTER TABLESPACE users_ts READ ONLY;
ALTER TABLESPACE users_ts READ WRITE;

-- 修改表空间默认压缩算法
ALTER TABLESPACE compressed_ts DEFAULT COMPRESSION 'zstd_1.3';

-- 修改表空间默认加密设置
ALTER TABLESPACE encrypted_ts DEFAULT ENCRYPTION 'N';

5. 删除表空间

功能:删除不再使用的表空间 适用场景

  • 表空间不再需要
  • 表空间数据已迁移到其他表空间
  • 清理无用的存储资源

语法

sql
DROP TABLESPACE tablespace_name [INCLUDING CONTENTS [AND DATAFILES]];

示例

sql
-- 删除空表空间
DROP TABLESPACE unused_ts;

-- 删除表空间及其内容
DROP TABLESPACE old_ts INCLUDING CONTENTS;

-- 删除表空间及其内容和数据文件
DROP TABLESPACE obsolete_ts INCLUDING CONTENTS AND DATAFILES;

注意事项

  • 删除表空间前需确保其中没有重要数据
  • INCLUDING CONTENTS选项会删除表空间中的所有对象
  • AND DATAFILES选项会删除物理数据文件
  • 系统表空间无法删除

表空间配置参数

1. 表空间级配置

功能:配置表空间级别的存储参数 适用场景

  • 调整表空间存储策略
  • 优化表空间性能
  • 控制表空间资源使用

核心参数

参数名功能建议值
max_size表空间最大大小根据业务需求设置
min_size表空间最小大小根据初始数据量设置
auto_extend是否自动扩展TRUE
next_extent_size自动扩展步长1G-10G
compression默认压缩算法zstd_1.0
encryption默认加密设置FALSE
replica_num副本数量3
zone_list可用区列表根据集群部署设置

配置示例

sql
-- 创建表空间时配置参数
CREATE TABLESPACE config_ts
  DATAFILE '/data/ob/data/config_ts.dbf' SIZE 50G
  MAXSIZE 200G
  AUTOEXTEND ON NEXT 5G
  DEFAULT COMPRESSION 'zstd_1.0'
  REPLICA_NUM = 3
  ZONE_LIST = ('zone1', 'zone2', 'zone3');

2. 租户级表空间配置

功能:为租户配置表空间资源配额和默认策略 适用场景

  • 多租户环境下表空间资源管理
  • 租户资源隔离
  • 租户存储策略统一配置

核心参数

参数名功能建议值
default_tablespace租户默认表空间users
temporary_tablespace租户默认临时表空间temp
tablespace_quota表空间资源配额根据租户需求设置
max_tablespaces最大表空间数量100

配置示例

sql
-- 设置租户默认表空间
ALTER TENANT test_tenant SET default_tablespace = 'users_ts';

-- 设置租户临时表空间
ALTER TENANT test_tenant SET temporary_tablespace = 'temp_ts';

-- 设置租户表空间配额
ALTER TENANT test_tenant SET tablespace_quota = '100G';

3. 系统级表空间配置

功能:配置系统级别的表空间默认参数 适用场景

  • 集群级表空间策略配置
  • 新创建表空间的默认设置
  • 系统级存储管理

核心参数

参数名功能建议值
default_tablespace_size默认表空间大小10G
default_auto_extend_size默认自动扩展步长1G
default_compression默认压缩算法zstd_1.0
datafile_dir默认数据文件目录/data/ob/data

配置示例

sql
-- 设置系统默认表空间大小
ALTER SYSTEM SET default_tablespace_size = 10737418240 GLOBAL;

-- 设置默认数据文件目录
ALTER SYSTEM SET datafile_dir = '/data/ob/data' GLOBAL;

表空间监控和维护

1. 表空间监控

功能:监控表空间的使用情况和性能指标 适用场景

  • 实时监控表空间状态
  • 预测存储容量需求
  • 发现表空间性能问题

监控指标

指标名称描述预警阈值
tablespace_used_percent表空间使用率>80%
tablespace_free_size表空间剩余大小<10%
datafile_auto_extend_count数据文件自动扩展次数>10次/小时
tablespace_io_wait_time表空间IO等待时间>100ms
tablespace_read_write_ratio表空间读写比例根据业务模型判断

监控方法

sql
-- 监控表空间使用率
SELECT 
  ts.name AS tablespace_name,
  (ts.total_size - ts.free_size) / ts.total_size * 100 AS used_percent,
  ts.free_size / 1024 / 1024 / 1024 AS free_gb
FROM oceanbase.DBA_OB_TABLESPACES ts
WHERE (ts.total_size - ts.free_size) / ts.total_size * 100 > 80;

-- 监控数据文件自动扩展情况
SELECT 
  df.tablespace_name,
  df.file_name,
  df.autoextensible,
  df.maxbytes / 1024 / 1024 / 1024 AS max_size_gb
FROM DBA_DATA_FILES df
WHERE df.autoextensible = 'YES';

-- 使用OCP监控表空间
-- 1. 登录OCP平台
-- 2. 导航到集群监控页面
-- 3. 选择"存储监控"模块
-- 4. 查看表空间使用情况和性能指标

2. 表空间维护

功能:维护表空间的健康状态和性能 适用场景

  • 表空间性能优化
  • 表空间碎片整理
  • 表空间数据迁移

维护任务

2.1 表空间碎片整理

sql
-- 检查表空间碎片情况
SELECT 
  ts.name AS tablespace_name,
  ts.free_size / 1024 / 1024 / 1024 AS free_gb,
  ts.total_size / 1024 / 1024 / 1024 AS total_gb,
  ts.free_size / ts.total_size * 100 AS free_percent
FROM oceanbase.DBA_OB_TABLESPACES ts;

-- 重建表空间中的表以减少碎片
ALTER TABLE table_name MOVE TABLESPACE new_tablespace;
ALTER INDEX index_name REBUILD TABLESPACE new_tablespace;

2.2 表空间数据迁移

sql
-- 将表迁移到新表空间
ALTER TABLE user_table MOVE TABLESPACE new_users_ts;

-- 将索引迁移到新表空间
ALTER INDEX user_index REBUILD TABLESPACE new_index_ts;

-- 将整个表空间的数据迁移到新位置
-- 1. 创建新表空间
-- 2. 迁移表和索引
-- 3. 删除旧表空间

2.3 表空间备份和恢复

sql
-- 备份表空间
BACKUP TABLESPACE users_ts TO '/backup/ob/tablespace';

-- 恢复表空间
RESTORE TABLESPACE users_ts FROM '/backup/ob/tablespace';

-- 表空间不完全恢复
RECOVER TABLESPACE users_ts UNTIL TIME '2023-06-01 12:00:00';

3. 表空间优化

功能:优化表空间配置和性能 适用场景

  • 提高表空间存储效率
  • 优化表空间IO性能
  • 降低存储成本

优化策略

3.1 存储分层策略

sql
-- 热数据存储在高速存储
CREATE TABLESPACE hot_data_ts
  DATAFILE '/data/ob/ssd/hot_data_ts.dbf' SIZE 100G;

-- 冷数据存储在低速存储
CREATE TABLESPACE cold_data_ts
  DATAFILE '/data/ob/hdd/cold_data_ts.dbf' SIZE 500G
  DEFAULT COMPRESSION 'zstd_1.5';

3.2 表空间分离策略

sql
-- 数据和索引分离
CREATE TABLESPACE data_ts
  DATAFILE '/data/ob/data/data_ts.dbf' SIZE 200G;

CREATE TABLESPACE index_ts
  DATAFILE '/data/ob/index/index_ts.dbf' SIZE 100G;

-- 不同业务模块表空间分离
CREATE TABLESPACE order_ts
  DATAFILE '/data/ob/order/order_ts.dbf' SIZE 150G;

CREATE TABLESPACE user_ts
  DATAFILE '/data/ob/user/user_ts.dbf' SIZE 100G;

3.3 压缩策略优化

sql
-- 根据数据类型选择合适的压缩算法
CREATE TABLESPACE log_ts
  DATAFILE '/data/ob/log/log_ts.dbf' SIZE 300G
  DEFAULT COMPRESSION 'lz4'; -- 适合日志数据

CREATE TABLESPACE archive_ts
  DATAFILE '/data/ob/archive/archive_ts.dbf' SIZE 1000G
  DEFAULT COMPRESSION 'zstd_1.5'; -- 适合归档数据

表空间与租户管理

1. 租户表空间资源隔离

功能:实现不同租户间的表空间资源隔离 适用场景

  • 多租户环境下的资源管理
  • 防止租户间资源抢占
  • 实现租户级别的存储配额

实现方法

sql
-- 设置租户表空间配额
ALTER TENANT tenant_a SET tablespace_quota = '500G';
ALTER TENANT tenant_b SET tablespace_quota = '1000G';

-- 查看租户表空间使用情况
SELECT 
  t.tenant_name,
  SUM(ts.used_size) / 1024 / 1024 / 1024 AS used_gb,
  t.tablespace_quota / 1024 / 1024 / 1024 AS quota_gb,
  SUM(ts.used_size) / t.tablespace_quota * 100 AS used_percent
FROM oceanbase.GV$OB_TABLESPACE_STAT ts
JOIN oceanbase.DBA_OB_TENANTS t ON ts.tenant_id = t.tenant_id
GROUP BY t.tenant_name, t.tablespace_quota;

2. 租户默认表空间配置

功能:为租户配置默认表空间 适用场景

  • 简化租户对象创建
  • 统一租户存储策略
  • 便于表空间管理

配置方法

sql
-- 设置租户默认表空间
ALTER TENANT test_tenant SET default_tablespace = 'users_ts';

-- 设置租户临时表空间
ALTER TENANT test_tenant SET temporary_tablespace = 'temp_ts';

-- 创建表时自动使用默认表空间
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));

3. 租户表空间监控

功能:监控租户级别的表空间使用情况 适用场景

  • 租户存储资源管理
  • 租户资源使用计费
  • 租户扩容规划

监控方法

sql
-- 监控特定租户的表空间使用情况
SELECT 
  ts.name AS tablespace_name,
  ts.used_size / 1024 / 1024 / 1024 AS used_gb,
  ts.total_size / 1024 / 1024 / 1024 AS total_gb,
  ts.used_size / ts.total_size * 100 AS used_percent
FROM oceanbase.GV$OB_TABLESPACE_STAT ts
WHERE ts.tenant_id = (SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = 'test_tenant');

最佳实践

1. 表空间规划

  • 存储分层:根据数据访问频率和重要性,将数据存储在不同性能的存储设备上
  • 业务分离:不同业务模块使用独立的表空间,便于管理和优化
  • 数据和索引分离:将表和索引存储在不同表空间,优化IO性能
  • 预留扩展空间:表空间初始大小应考虑未来业务增长,避免频繁扩展

2. 表空间配置

  • 合理设置自动扩展:启用自动扩展功能,避免因空间不足导致业务中断
  • 优化压缩策略:根据数据类型选择合适的压缩算法,平衡存储效率和性能
  • 配置适当的副本数:根据数据重要性设置合适的副本数量,确保数据可靠性
  • 统一配置管理:使用集中化配置管理工具,统一管理表空间配置

3. 监控和维护

  • 建立监控体系:实时监控表空间使用率和性能指标,设置合理的告警阈值
  • 定期维护:定期进行表空间碎片整理和性能优化
  • 备份策略:制定合理的表空间备份策略,确保数据可恢复性
  • 容量规划:根据表空间使用趋势,提前规划存储扩容

4. 性能优化

  • 使用高速存储:将热数据和系统表空间存储在高速存储设备上
  • 优化IO布局:合理规划数据文件的物理布局,避免IO瓶颈
  • 调整缓存配置:根据表空间数据访问模式,优化缓存配置
  • 使用分区表:对于大表,使用分区表并将不同分区存储在不同表空间

常见问题(FAQ)

Q1: 如何判断表空间是否需要扩容?

A1: 判断表空间是否需要扩容的方法:

  • 监控表空间使用率,当使用率超过80%时考虑扩容
  • 观察数据文件自动扩展频率,频繁自动扩展说明需要手动扩容
  • 根据业务增长趋势,提前规划表空间扩容
  • 检查表空间剩余空间,当剩余空间不足总容量的10%时考虑扩容

Q2: 表空间扩容会影响数据库性能吗?

A2: 表空间扩容对数据库性能的影响:

  • 在线扩容对数据库性能影响很小
  • 自动扩展可能会在扩展瞬间产生短暂的IO峰值
  • 建议在业务低峰期进行手动扩容
  • 提前规划扩容可以避免频繁自动扩展带来的性能影响

Q3: 如何优化表空间的IO性能?

A3: 优化表空间IO性能的方法:

  • 将数据和索引存储在不同表空间
  • 使用高速存储设备存储热数据
  • 合理规划数据文件的物理布局
  • 调整表空间的预读参数
  • 使用分区表将数据分散到不同表空间

Q4: 如何处理表空间碎片?

A4: 处理表空间碎片的方法:

  • 重建表空间中的表和索引
  • 将表迁移到新表空间后删除旧表空间
  • 定期进行表空间碎片整理
  • 合理设置表空间的扩展策略,避免频繁小幅度扩展

Q5: 表空间加密会影响性能吗?

A5: 表空间加密对性能的影响:

  • 加密解密过程会带来一定的性能开销
  • 现代硬件的加密加速功能可以显著降低性能影响
  • 建议仅对敏感数据使用加密表空间
  • 可以通过测试评估加密对具体业务的性能影响

Q6: 如何在不影响业务的情况下迁移表空间?

A6: 不影响业务迁移表空间的方法:

  • 使用在线迁移工具
  • 采用双写模式,先复制数据再切换
  • 在业务低峰期进行迁移
  • 对大表采用分区迁移方式,分批次完成
  • 充分测试迁移过程,制定回滚计划

Q7: 如何监控多租户环境下的表空间使用情况?

A7: 监控多租户表空间使用情况的方法:

  • 为每个租户设置表空间配额
  • 定期检查租户表空间使用率
  • 设置租户表空间使用告警
  • 使用OCP等监控工具进行可视化监控
  • 建立租户表空间使用报告制度

Q8: 表空间与分区表的关系是什么?

A8: 表空间与分区表的关系:

  • 分区表的不同分区可以存储在不同表空间中
  • 这种设计可以优化IO性能,便于管理和维护
  • 可以根据分区数据的访问模式,将不同分区存储在不同性能的存储设备上
  • 便于实现数据的生命周期管理,如将历史数据迁移到低速存储

Q9: 如何选择合适的表空间压缩算法?

A9: 选择表空间压缩算法的方法:

  • 考虑数据类型:日志数据适合使用lz4,归档数据适合使用高压缩比的zstd
  • 考虑访问频率:热数据使用低压缩比,冷数据使用高压缩比
  • 考虑性能需求:对性能要求高的场景使用轻量级压缩
  • 通过测试评估不同压缩算法的效果

Q10: 系统表空间满了怎么办?

A10: 处理系统表空间满的方法:

  • 检查系统表空间中是否有临时对象或垃圾数据
  • 清理无用的系统对象
  • 扩展系统表空间
  • 调整系统表空间的自动扩展设置
  • 优化系统表空间的使用,如将部分对象迁移到用户表空间