云数据库 PostgreSQL UNLOGGED 表使用说明

UNLOGGED 表是 PostgreSQL 提供的一种特殊表类型,其特点是不记录 WAL(Write-Ahead Log)日志,以换取更高的写入性能。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

一、UNLOGGED 表特点

1. 什么是 UNLOGGED 表

2. UNLOGGED 表特性

性能特性

·写入性能提升:跳过 WAL 日志记录

·减少 I/O 开销:无需等待日志刷盘

·降低存储压力:减少 WAL 日志空间占用

数据特性

·数据仍写入磁盘:正常的数据文件存储

·不保证持久性:数据库重启后数据丢失

·不支持复制:不会同步到从库

3. 识别 UNLOGGED 表

SELECT n.nspname,c.relname,c.relpersistence FROM pg_class c JOIN pg_namespace n ON n.oid=c.relnamespace WHERE c.relkind='r' AND c.relpersistence='u';

二、UNLOGGED 表风险

1. 数据安全风险

数据丢失风险

·服务器重启:所有 UNLOGGED 表数据清空

·数据库崩溃:异常关闭导致数据丢失

·硬件故障:无法通过 WAL 日志恢复

2. 高可用性限制

主从复制问题

·从库数据为空:UNLOGGED 表不会同步到从库

·故障切换风险:主从切换后数据丢失

3. 备份恢复限制

备份策略限制

·逻辑备份:pg_dump 默认不包含 UNLOGGED 表数据

·物理备份:基础备份不包含 UNLOGGED 表数据

·时间点恢复:无法恢复 UNLOGGED 表的历史数据

4. 功能兼容性限制

不支持的功能

·逻辑复制:无法作为发布表

·发布/订阅:不支持逻辑解码

·某些扩展:部分扩展可能不兼容

三、UNLOGGED 表使用场景

1. 适合使用的场景

·ETL 数据处理

·缓存和会话存储

·临时计算和统计

2. 性能优化场景

·大批量数据导入

·临时索引构建

3. 不适合使用的场景

·重要业务数据

·需要持久化的配置数据

四、将 UNLOGGED 表转 LOGGED 表

1. 转换语法

基本转换命令如下:

— 将 UNLOGGED 表转换为普通表,unlogged_table_name 为表名称ALTER TABLE unlogged_table_name SET LOGGED;– 锁定状态监控, mode 字段为锁类型,AccessExclusiveLock 为最严格的锁, unlogged_table_name 为表名称SELECT l.locktype, l.mode, l.granted, l.pid, a.state, a.query_start, now() – a.query_start as duration, CASE WHEN l.granted THEN 'GRANTED' ELSE 'WAITING' END as lock_status, substring(a.query, 1, 80) as query_snippetFROM pg_locks lLEFT JOIN pg_stat_activity a ON l.pid = a.pidWHERE l.relation IS NOT NULL AND EXISTS ( SELECT 1 FROM pg_class c WHERE c.oid = l.relation AND c.relname = 'unlogged_table_name' )ORDER BY l.granted, a.query_start;

2. 转换注意事项

·转换过程:需要重写整个表

·锁定时间:大表转换时间较长,期间表被锁定

·空间需求:转换期间需要额外存储空间

3. 转换实践

建议采用分批转换策略,示例如下:

— 对于大表,建议分批转换– 1. 创建新的 LOGGED 表CREATE TABLE user_cache_new (LIKE user_cache);– 2. 分批迁移数据INSERT INTO user_cache_new SELECT * FROM user_cache WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02';– 3. 重命名表BEGIN;DROP TABLE user_cache;ALTER TABLE user_cache_new RENAME TO user_cache;COMMIT;

五、云数据库 PostgreSQL 参数说明

云数据库 PostgreSQL 通过引入 tencentdb_log_unlogged_table 参数,在保持 PostgreSQL 原生功能的同时,为用户提供了更好的数据安全保障。参数修改请参考 设置实例参数。

六、参数功能说明

当 tencentdb_log_unlogged_table = on 时(默认):

·所有新创建的 UNLOGGED 表自动转换为 LOGGED 表

·用户创建 UNLOGGED 表时显示 WARNING 提示

·现有的 UNLOGGED 表保持不变(需手动转换)

·提供更高的数据安全性

— 创建 UNLOGGED 表amy=> CREATE UNLOGGED TABLE test_table (id INT, data TEXT);– 系统提示 WARNING :WARNING: change unlogged table to logged table, If you want to use unlogged tables, please set tencentdb_log_unlogged_table to false.CREATE TABLE– 验证表类型,返回: 'p' (PERMANENT/LOGGED)am=> SELECT relpersistence FROM pg_class WHERE relname = 'test_table'; relpersistence —————- p(1 row

当 tencentdb_log_unlogged_table = off 时:

·所有行为与原生 PostgreSQL 一致

·允许创建真正的 UNLOGGED 表

·用户需自行承担数据丢失风险

七、修改 tencentdb_log_unlogged_table 参数是否需要重启实例?

不需要。该参数为动态参数,修改后立即生效。

八、参数设置为 on 后,现有的 UNLOGGED 表会自动转换吗?

不会。参数只影响新创建的表,现有 UNLOGGED 表需要手动执行 ALTER TABLE SET LOGGED 转换。

赞 (0)
上一篇 4天前
下一篇 4天前