一、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 转换。