Skip to content

KingBaseES 表空间管理

表空间概述

表空间定义

表空间是KingBaseES中用于管理数据存储的逻辑概念,它将数据库对象(如表、索引)映射到物理存储位置。表空间允许DBA将不同类型的数据存储在不同的物理设备上,以优化性能和管理存储。

表空间类型

KingBaseES支持以下类型的表空间:

  • 系统表空间:用于存储系统数据库和系统表,如sys_catalog、information_schema等
  • 用户表空间:由用户创建,用于存储用户数据
  • 临时表空间:用于存储临时数据和排序结果
  • UNLOGGED表空间:用于存储不记录WAL日志的表,适合临时数据

表空间的作用

  • 性能优化:将热点数据存储在高性能存储设备上
  • 存储管理:灵活管理不同类型的数据存储
  • 备份恢复:针对不同表空间实施不同的备份策略
  • 负载均衡:将数据分布到不同的存储设备上
  • 空间隔离:将不同应用的数据隔离存储

表空间创建与配置

准备工作

在创建表空间前,需要完成以下准备工作:

  1. 创建物理目录:为表空间创建物理存储目录

    bash
    mkdir -p /opt/kingbase/tablespaces/user_ts
    chown -R kingbase:kingbase /opt/kingbase/tablespaces
    chmod -R 700 /opt/kingbase/tablespaces
  2. 规划表空间大小:根据数据量和增长趋势,规划表空间大小

  3. 选择存储设备:根据数据类型选择合适的存储设备

创建表空间

使用CREATE TABLESPACE语句创建表空间:

sql
-- 创建用户表空间
CREATE TABLESPACE user_ts
  OWNER sys
  LOCATION '/opt/kingbase/tablespaces/user_ts'
  WITH (
    owner = sys,
    permission_bits = 0700,
    random_page_cost = 1.1,
    seq_page_cost = 1.0,
    effective_io_concurrency = 200
  );

-- 创建临时表空间
CREATE TABLESPACE temp_ts
  OWNER sys
  LOCATION '/opt/kingbase/tablespaces/temp_ts'
  WITH (
    owner = sys,
    permission_bits = 0700
  );

-- 创建UNLOGGED表空间
CREATE TABLESPACE unlogged_ts
  OWNER sys
  LOCATION '/opt/kingbase/tablespaces/unlogged_ts'
  WITH (
    owner = sys,
    permission_bits = 0700
  );

配置默认表空间

配置数据库或用户的默认表空间:

sql
-- 配置数据库默认表空间
ALTER DATABASE testdb SET default_tablespace = user_ts;

-- 配置用户默认表空间
ALTER USER developer SET default_tablespace = user_ts;

-- 配置临时表空间
ALTER SYSTEM SET temp_tablespaces = 'temp_ts';
SELECT sys_reload_conf();

表空间管理操作

查看表空间

查看已创建的表空间:

sql
-- 查看所有表空间
SELECT spcname, spcowner, spclocation FROM sys_tablespace;

-- 查看表空间详细信息
\db+

-- 查看表所在的表空间
SELECT table_name, tablespace_name FROM information_schema.tables WHERE table_schema = 'public';

-- 查看索引所在的表空间
SELECT indexname, tablespace FROM sys_indexes WHERE schemaname = 'public';

修改表空间

修改表空间的属性:

sql
-- 修改表空间所有者
ALTER TABLESPACE user_ts OWNER TO db_admin;

-- 修改表空间位置(需要重启数据库)
ALTER TABLESPACE user_ts RENAME TO new_user_ts;

-- 修改表空间参数
ALTER TABLESPACE user_ts SET (random_page_cost = 1.2);

移动数据库对象到表空间

将数据库对象移动到指定表空间:

sql
-- 将表移动到表空间
ALTER TABLE users SET TABLESPACE user_ts;

-- 将索引移动到表空间
ALTER INDEX idx_users_id SET TABLESPACE user_ts;

-- 将所有表移动到表空间
ALTER TABLE ALL TABLES IN SCHEMA public SET TABLESPACE user_ts;

-- 将所有索引移动到表空间
ALTER INDEX ALL IN SCHEMA public SET TABLESPACE user_ts;

删除表空间

删除不再使用的表空间:

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

-- 删除包含对象的表空间(需要先删除或移动所有对象)
-- 1. 查看表空间中的对象
SELECT * FROM sys_tables WHERE tablespace = 'user_ts';
SELECT * FROM sys_indexes WHERE tablespace = 'user_ts';

-- 2. 移动或删除对象
ALTER TABLE users SET TABLESPACE default_ts;
DROP INDEX idx_users_id;

-- 3. 删除表空间
DROP TABLESPACE user_ts;

表空间监控与维护

监控表空间使用情况

监控表空间的使用情况,及时发现空间不足问题:

sql
-- 查看表空间使用情况
SELECT 
  spcname AS tablespace_name,
  pg_size_pretty(pg_tablespace_size(spcname)) AS size,
  pg_size_pretty(pg_tablespace_size(spcname) - pg_tablespace_size('template1')) AS used,
  pg_size_pretty(pg_tablespace_size('template1')) AS free
FROM sys_tablespace;

-- 查看表空间中表的大小
SELECT 
  table_name,
  pg_size_pretty(pg_total_relation_size(table_name)) AS total_size,
  pg_size_pretty(pg_table_size(table_name)) AS table_size,
  pg_size_pretty(pg_indexes_size(table_name)) AS index_size
FROM information_schema.tables 
WHERE table_schema = 'public'
ORDER BY pg_total_relation_size(table_name) DESC;

表空间维护

定期对表空间进行维护,确保性能和可靠性:

  1. 碎片整理:对频繁更新的表进行VACUUM和ANALYZE

    sql
    -- 手动VACUUM和ANALYZE
    VACUUM FULL ANALYZE users;
  2. 检查表空间完整性:使用pg_checksums工具检查表空间完整性

    bash
    pg_checksums -c -D /opt/kingbase/tablespaces/user_ts
  3. 备份表空间:定期备份表空间

    bash
    sys_basebackup -D /backup/tablespaces_backup -T /opt/kingbase/tablespaces/user_ts=/backup/user_ts_backup

表空间扩容

当表空间空间不足时,需要进行扩容:

  1. 增加数据文件(如果使用文件系统表空间):

    bash
    -- 对于文件系统表空间,可以挂载新的存储设备并创建新的表空间
    mkdir -p /opt/kingbase/tablespaces/user_ts_new
    chown -R kingbase:kingbase /opt/kingbase/tablespaces/user_ts_new
    chmod -R 700 /opt/kingbase/tablespaces/user_ts_new
    sql
    -- 创建新的表空间
    CREATE TABLESPACE user_ts_new LOCATION '/opt/kingbase/tablespaces/user_ts_new';
    
    -- 将表移动到新表空间
    ALTER TABLE users SET TABLESPACE user_ts_new;
  2. 扩展存储卷(如果使用LVM或其他卷管理):

    bash
    -- 扩展存储卷
    lvextend -L +100G /dev/vg_data/lv_tablespaces
    resize2fs /dev/vg_data/lv_tablespaces

表空间最佳实践

表空间设计原则

  1. 根据数据类型设计

    • 热点数据存储在高性能存储设备上
    • 冷数据存储在低成本存储设备上
    • 临时数据和排序结果存储在高速存储设备上
  2. 根据访问模式设计

    • 读写频繁的表放在高性能存储上
    • 只读表可以放在普通存储上
    • 索引可以考虑单独存储在高性能存储上
  3. 根据备份需求设计

    • 核心数据和非核心数据分离存储
    • 不同备份策略的表放在不同表空间

表空间布局建议

表空间类型存储设备用途
系统表空间SAS/SATA存储系统数据库和系统表
用户表空间SSD/NVMe存储核心业务表和索引
临时表空间SSD存储临时数据和排序结果
归档表空间SATA/磁带存储历史数据和归档数据
索引表空间SSD/NVMe存储索引,提高查询性能

性能优化建议

  1. 使用多个表空间:将不同类型的数据分布到不同表空间,提高并行访问性能

  2. 合理设置表空间参数:根据存储设备类型调整表空间参数

    sql
    -- 对于SSD存储
    ALTER TABLESPACE ssd_ts SET (random_page_cost = 1.1, effective_io_concurrency = 200);
    
    -- 对于HDD存储
    ALTER TABLESPACE hdd_ts SET (random_page_cost = 4.0, effective_io_concurrency = 2);
  3. 避免单个表空间过大:将大表拆分为多个表或使用分区表,分布到不同表空间

  4. 监控表空间使用情况:定期监控表空间使用情况,及时扩容

  5. 定期维护:定期对表空间进行VACUUM和ANALYZE,减少碎片

版本差异

特性V8 R6V8 R7
表空间创建语法基础语法增强语法,支持更多参数
表空间参数基本参数更多性能相关参数
表空间重命名支持支持
表空间移动不支持支持(需要重启数据库)
表空间监控视图基础视图更丰富的监控视图
表空间检查工具基础工具增强的检查工具
分区表表空间基础支持更好的支持,可指定分区表空间
临时表空间支持增强支持,可配置多个临时表空间

常见问题(FAQ)

Q: 如何选择表空间的存储设备?

A: 选择表空间存储设备时,需要考虑以下因素:

  • 数据类型和访问模式
  • 性能要求
  • 成本预算
  • 可靠性要求

建议:

  • 热点数据和索引使用SSD/NVMe
  • 普通数据使用SAS
  • 归档数据使用SATA或磁带

Q: 如何将现有表移动到新表空间?

A: 可以使用ALTER TABLE语句将现有表移动到新表空间:

sql
ALTER TABLE table_name SET TABLESPACE new_tablespace;

注意:移动表会锁定表,建议在业务低峰期进行。

Q: 表空间满了怎么办?

A: 表空间满了可以采取以下措施:

  • 清理无用数据
  • 移动部分表到其他表空间
  • 扩容存储设备
  • 创建新表空间并移动数据

Q: 如何监控表空间使用情况?

A: 可以使用以下方法监控表空间使用情况:

  • 查询sys_tablespace和相关视图
  • 使用KingBaseES Manager(KEM)监控
  • 配置监控工具如Prometheus+Grafana
  • 定期生成表空间使用报告

Q: 表空间可以跨主机使用吗?

A: 表空间默认是本地的,不支持跨主机使用。如果需要跨主机共享表空间,可以考虑使用共享存储设备,如SAN、NAS等。

Q: 如何备份表空间?

A: 可以使用以下方法备份表空间:

  • 使用sys_basebackup进行基础备份
  • 使用sys_dump进行逻辑备份
  • 使用第三方备份工具
  • 对存储设备进行快照备份

Q: 临时表空间的作用是什么?

A: 临时表空间用于存储临时数据,如排序结果、临时表等。配置专门的临时表空间可以提高排序性能,避免影响其他数据的存储。

Q: 如何优化表空间性能?

A: 优化表空间性能的方法:

  • 根据存储设备类型调整表空间参数
  • 将热点数据和索引存储在高性能存储上
  • 定期进行VACUUM和ANALYZE
  • 避免单个表空间过大
  • 使用多个表空间分布数据

Q: 表空间和数据文件的关系是什么?

A: 表空间是逻辑概念,数据文件是物理概念。一个表空间对应一个或多个数据文件,数据库对象存储在表空间中,实际物理存储在数据文件中。

Q: 如何删除表空间?

A: 删除表空间的步骤:

  1. 查看表空间中的所有对象
  2. 移动或删除这些对象
  3. 使用DROP TABLESPACE语句删除表空间

总结

表空间是KingBaseES中重要的存储管理机制,通过合理的表空间设计和管理,可以提高数据库性能、优化存储资源、简化备份恢复操作。DBA应根据业务需求和存储设备情况,设计合适的表空间布局,定期监控和维护表空间,确保数据库的高效运行。

表空间管理的关键是根据数据类型、访问模式和备份需求,将数据分布到不同的表空间,并根据存储设备类型调整表空间参数。同时,需要定期监控表空间使用情况,及时扩容和维护,确保表空间的可靠性和性能。