Postgres重启后创建的视图丢失 如何设置让视图永久生效
问题解决方案
常见原因排查
PostgreSQL 中永久视图不会因为服务重启自动删除,出现该问题一般是以下几种场景:
- 创建视图时默认落到了临时模式(
pg_temp_*)下,临时模式的所有对象都是会话绑定的,会话断开、服务重启后会被自动清理 - 创建视图所在的会话开启了手动事务,创建完成后没有执行
COMMIT提交,会话断开后事务自动回滚,视图被删除 - 创建视图的数据库和重启后连接的数据库不是同一个,导致找不到对象
- 若通过容器部署PostgreSQL,且没有为数据目录配置持久化存储,容器重启/重建会清空所有数据,视图自然丢失
永久保存视图的操作步骤
- 显式指定永久模式创建视图
默认永久模式为public,创建时显式指定模式即可避免落到临时模式:
create view public.sp_pool_relay_cnt as select hash_id, count(hash_id) as relay_cnt from sp_pool_relay group by hash_id;
- 提交事务
如果你的客户端默认开启手动事务模式,创建完成后执行提交操作:
COMMIT;
- 验证视图属性
执行以下语句确认视图属于永久模式:
select table_schema, table_name from information_schema.views where table_name = 'sp_pool_relay_cnt';
返回结果中table_schema如果是public或其他你自定义的永久模式(非pg_temp开头),就说明该视图为永久对象,服务重启不会被自动清理。
4. 容器部署特殊处理
如果是Docker等容器部署场景,启动容器时必须挂载持久化卷映射到PostgreSQL数据目录,示例命令:
docker run -d \ -e POSTGRES_PASSWORD=你的数据库密码 \ -v /本地磁盘持久化目录:/var/lib/postgresql/data \ postgres:你使用的版本号
内容的提问来源于stack exchange,提问作者rob
相关产品推荐
相关产品推荐

