文档中心>云数据库 PostgreSQL>操作指南>参数管理>云数据库 PostgreSQL UNLOGGED 表使用说明

云数据库 PostgreSQL UNLOGGED 表使用说明

最近更新时间:2026-01-16 14:52:02

我的收藏

UNLOGGED 表说明

UNLOGGED 表特点

1. 什么是 UNLOGGED 表
UNLOGGED 表是 PostgreSQL 提供的一种特殊表类型,其特点是不记录 WAL(Write-Ahead Log)日志,以换取更高的写入性能。
2. UNLOGGED 表特性
性能特性
写入性能提升:跳过 WAL 日志记录
减少 I/O 开销:无需等待日志刷盘
降低存储压力:减少 WAL 日志空间占用
数据特性
数据仍写入磁盘:正常的数据文件存储
不保证持久性:数据库重启后数据丢失
不支持复制:不会同步到从库
3. 识别 UNLOGGED 表
-- 查看表类型
SELECT
schemaname,
tablename,
CASE
WHEN relpersistence = 'u' THEN 'UNLOGGED'
WHEN relpersistence = 'p' THEN 'PERMANENT'
ELSE 'OTHER'
END as table_type
FROM pg_tables t
JOIN pg_class c ON c.relname = t.tablename
WHERE 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 为表名称
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_snippet
FROM pg_locks l
LEFT JOIN pg_stat_activity a ON l.pid = a.pid
WHERE 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 表并及时转换
该特性支持的版本为 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 转换。