使用pg_restore从生产环境恢复本地PostgreSQL数据库失败求助
解决pg_restore恢复数据库的两类错误
你遇到的恢复错误分两类,对应不同问题,逐个解决:
一、修复set_user扩展缺失的错误
错误核心是本地PostgreSQL未安装set_user扩展,步骤如下:
- 根据本地系统和PostgreSQL版本安装扩展包:
- Debian/Ubuntu(以PostgreSQL 14为例):
sudo apt install postgresql-14-set-user - CentOS/RHEL(以PostgreSQL 14为例):
sudo yum install postgresql14-contrib-set_user
- Debian/Ubuntu(以PostgreSQL 14为例):
- 手动在目标数据库创建扩展:
psql -d server_employees -c "CREATE EXTENSION IF NOT EXISTS set_user WITH SCHEMA public;" - 重新执行你的pg_restore命令即可。
二、修复pg_stat_statements视图的列歧义错误
这个错误是因为本地PostgreSQL版本和生产环境不一致,导致pg_stat_statements函数的返回列结构变化,或是视图定义里的别名与列名冲突。解决方法:
- 优先对齐PostgreSQL版本:
分别查看本地和生产环境的版本:
如果版本不一致,将本地PostgreSQL升级到和生产环境一致的版本后再重新恢复,这是最彻底的解决方式。# 本地版本 psql --version # 生产环境版本(若能访问) ssh 生产服务器地址 "psql --version" - 手动修改视图定义(无法升级版本时):
修改错误中的CREATE VIEW语句,把表别名改掉避免和列名冲突,比如将pg_stat_statements改为pss,修改后的语句如下:
先执行这条修改后的SQL创建视图,再重新运行pg_restore。CREATE VIEW metric_helpers.pg_stat_statements AS SELECT pss.userid, pss.dbid, pss.queryid, pss.query, pss.plans, pss.total_plan_time, pss.min_plan_time, pss.max_plan_time, pss.mean_plan_time, pss.stddev_plan_time, pss.calls, pss.total_exec_time, pss.min_exec_time, pss.max_exec_time, pss.mean_exec_time, pss.stddev_exec_time, pss.rows, pss.shared_blks_hit, pss.shared_blks_read, pss.shared_blks_dirtied, pss.shared_blks_written, pss.local_blks_hit, pss.local_blks_read, pss.local_blks_dirtied, pss.local_blks_written, pss.temp_blks_read, pss.temp_blks_written, pss.blk_read_time, pss.blk_write_time, pss.wal_records, pss.wal_fpi, pss.wal_bytes FROM metric_helpers.pg_stat_statements(true) pss(userid, dbid, queryid, query, plans, total_plan_time, min_plan_time, max_plan_time, mean_plan_time, stddev_plan_time, calls, total_exec_time, min_exec_time, max_exec_time, mean_exec_time, stddev_exec_time, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time, blk_write_time, wal_records, wal_fpi, wal_bytes); - 跳过该视图恢复(非必需视图时):
如果这个视图不是业务必需的,可以直接跳过它的恢复:pg_restore --exclude-table=metric_helpers.pg_stat_statements server_employees.tar -d server_employees
内容的提问来源于stack exchange,提问作者JAN
相关产品推荐
相关产品推荐

