Rails项目PostgreSQL导入dump备份文件后查询无数据
Rails PostgreSQL备份导入后无业务数据问题解决
问题现象
在Rails项目根目录存放dump格式的数据库备份文件,按顺序执行删库、建库、psql导入操作,所有步骤均返回成功提示,但进入Rails控制台查询业务表数据时返回空,以Contact表为例查询无任何记录。
操作回溯日志
$ rake db:drop Dropped database 'project_development' Dropped database 'project_test' $ rake db:create Created database 'project_development' Created database 'project_test' $ psql project_development<dump SET SET SET SET SET set_config ------------ (1 row) SET SET SET SET SET SET CREATE TABLE ALTER TABLE CREATE SEQUENCE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE COPY 0 COPY 1 COPY 1 COPY 0 COPY 4 COPY 40 COPY 0 setval -------- 1 (1 row) setval -------- 1 (1 row) ALTER TABLE CREATE INDEX ALTER TABLE
控制台查询数据返回空:
$ rails c Contact.all Contact Load (0.5ms) SELECT "contacts".* FROM "contacts" LIMIT $1 [["LIMIT", 11]] => #<ActiveRecord::Relation []>
问题定位
从导入日志的COPY输出可以直接找到核心判断依据:PostgreSQL导入纯文本dump时,COPY 数字的返回值代表对应表成功导入的数据行数。日志中存在多组COPY 0记录,说明对应表在导入环节没有写入任何数据,高频诱因有两个:
- 导入命令未开启错误即停:psql默认遇到错误不会终止执行,只会输出错误信息后跳过当前语句继续跑后续流程,最终不会返回全局失败提示。如果导入contacts表数据时触发权限不足、约束冲突、触发器拦截等错误,会直接跳过数据写入步骤,表面看全流程执行成功,实际数据没写进去。
- dump备份文件本身无效:导出备份时contacts表本身就无业务数据,或者导出时加了错误的过滤参数、导出过程中断,导致备份文件里根本没有contacts表的有效数据。
修复操作
- 重新执行导入,开启错误即停参数,把全量日志落盘方便排查
# 删库建库后执行,遇到任何错误直接终止,所有日志写入import.log psql -v ON_ERROR_STOP=1 project_development < dump > import.log 2>&1
执行后如果有报错,直接在import.log里搜ERROR关键字就能定位具体问题,常见问题对应处理:
- 权限不足:给当前导入使用的数据库用户授予public schema的读写权限
- 唯一键/主键冲突:删库后检查是否有Rails服务、定时任务、其他连接自动连库执行了迁移建表,杀掉所有相关连接后再重新导入
- 触发器拦截:导入前临时关闭业务表的触发器,导入完成后再重新开启
- 如果上述导入全程无报错,直接检查dump文件本身是否包含contacts表数据
# 搜索dump文件里contacts表的COPY段,看后续是否有对应数据行 grep -A 20 "COPY public.contacts" dump
如果COPY语句后面没有对应业务数据行,说明备份文件本身损坏或导出不全,需要重新生成有效备份再导入。
- 导入完成后先通过psql直连校验数据,再进Rails控制台查询
# 直连数据库查contacts表行数 psql project_development -c "SELECT count(*) FROM contacts;"
如果直连查询行数符合预期,Rails控制台查询为空,先执行spring stop关闭Spring预加载进程再重新进入控制台,同时检查config/database.yml里的库名、schema_search_path配置,确认Rails连接的是刚导入数据的数据库、查找的是对应schema下的表,避免连错实例、找错schema的问题。
内容的提问来源于stack exchange,提问作者antnbaranov
相关产品推荐
相关产品推荐

