UNLOGGED 表说明
UNLOGGED 表特点
1. 什么是 UNLOGGED 表
UNLOGGED 表是 PostgreSQL 提供的一种特殊表类型,其特点是不记录 WAL(Write-Ahead Log)日志,以换取更高的写入性能。
2. UNLOGGED 表特性
性能特性
写入性能提升:跳过 WAL 日志记录
减少 I/O 开销:无需等待日志刷盘
降低存储压力:减少 WAL 日志空间占用
数据特性
数据仍写入磁盘:正常的数据文件存储
不保证持久性:数据库重启后数据丢失
不支持复制:不会同步到从库
3. 识别 UNLOGGED 表
-- 查看表类型SELECTschemaname,tablename,CASEWHEN relpersistence = 'u' THEN 'UNLOGGED'WHEN relpersistence = 'p' THEN 'PERMANENT'ELSE 'OTHER'END as table_typeFROM pg_tables tJOIN pg_class c ON c.relname = t.tablenameWHERE schemaname = 'public';
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 为表名称SELECTl.locktype,l.mode,l.granted,l.pid,a.state,a.query_start,now() - a.query_start as duration,CASEWHEN 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 NULLAND EXISTS (SELECT 1 FROM pg_class cWHERE c.oid = l.relationAND 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_newSELECT * FROM user_cacheWHERE 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 表并及时转换
该特性支持的版本为 v11.22_r1.26、v12.22_r1.29、v13.20_r1.24、v14.17_r1.33、v15.12_r1.18、v16.8_r1.13、v17.4_r1.7、v18.0_r1.0及以上版本,建议您尽快 升级内核小版本。
参数功能说明
当 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 表
用户需自行承担数据丢失风险
常见问题 FAQ
修改 tencentdb_log_unlogged_table 参数是否需要重启实例?
不需要。该参数为动态参数,修改后立即生效。
参数设置为 on 后,现有的 UNLOGGED 表会自动转换吗?
不会。参数只影响新创建的表,现有 UNLOGGED 表需要手动执行
ALTER TABLE SET LOGGED 转换。