tencent cloud

云数据库 PostgreSQL

Documentation云数据库 PostgreSQL用户指南参数管理云数据库 PostgreSQL UNLOGGED 表使用说明

云数据库 PostgreSQL UNLOGGED 表使用说明

Download
Focus Mode
Font Size
Last updated: 2026-01-26 14:16:08

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

Help and Support

Was this page helpful?

Help us improve! Rate your documentation experience in 5 mins.

Feedback