Postgres 10 + Rails 5备份报错:column 'increment_by' does not exist
解决PostgreSQL 10 + Rails 5备份时的"increment_by"列不存在错误
这个问题我之前帮朋友排查过,核心原因是PostgreSQL 10对序列相关的系统视图做了结构调整,再加上备份工具版本不兼容导致的。下面给你拆解具体原因和解决办法:
一、最常见的原因:备份工具版本跟不上PostgreSQL 10
1. Navicat版本太旧
旧版本的Navicat(比如11及以下)没有适配PostgreSQL 10的序列视图变更,它还是按照PostgreSQL 9.x的逻辑去查询increment_by这类列,自然会报错。
- 解决办法:
- 直接升级Navicat到支持PostgreSQL 10的版本(比如Navicat Premium 12或更高版本的Navicat for PostgreSQL),新版本已经修复了这个兼容性问题。
- 要是暂时没法升级,就先用PostgreSQL官方自带的
pg_dump工具来备份,稳定性更高。
2. 用错了pg_dump版本
如果你服务器上装了多个版本的PostgreSQL,很可能不小心调用了低版本(比如9.x)的pg_dump来备份10的库——不同大版本的pg_dump不兼容,低版本工具看不懂10的序列结构,就会报这个错。
- 解决办法:
- 先确认当前用的
pg_dump版本:pg_dump --version - 如果版本不对,就指定PostgreSQL 10的
pg_dump完整路径执行备份,比如:/usr/lib/postgresql/10/bin/pg_dump -U 你的数据库用户名 -d 你的应用数据库名 -f 备份文件名.sql - 要是你用了Rails的备份gem(比如
backup),记得在配置文件里指定这个正确的路径。
- 先确认当前用的
二、次要可能:Rails相关依赖或代码的兼容问题
虽然Rails 5本身是支持PostgreSQL 10的,但也有小概率是应用里的代码或gem导致的:
- 检查你的数据库迁移文件,有没有直接查询序列的
increment_by列的自定义代码,如果有的话,改成适配PostgreSQL 10的写法(比如从pg_sequence视图里用新的字段名,或者用pg_get_serial_sequence这类官方函数)。 - 更新
pggem到最新兼容版本(比如0.21及以上),确保数据库驱动和PostgreSQL 10匹配。
验证方法
先执行pg_dump --version确认工具版本是PostgreSQL 10.x,然后跑一次简单的备份命令,要是没报错,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Charles Smith
相关产品推荐
相关产品推荐

