外观
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: 处理系统表空间满的方法:
- 检查系统表空间中是否有临时对象或垃圾数据
- 清理无用的系统对象
- 扩展系统表空间
- 调整系统表空间的自动扩展设置
- 优化系统表空间的使用,如将部分对象迁移到用户表空间
