一,

前情回顾

某次在使用pg_dump命令逻辑备份出来的备份文件对指定的几个表恢复的时候,报错pg_restore: implied data-only restore  

当然,遇到问题首先就是百度了,但好像没有什么明确的解决方案,具体的报错命令和报错信息如下:

[postgres@node1 ~]$ pg_restore -Upostgres -v -x  -d   pgbench -t ds.dr_route_ds -t ds.dr_task_active_ds 2023-08-02T04_00-ds.dump 
pg_restore: connecting to database for restore
pg_restore: implied data-only restore

第二行表示pg_restore 命令已经正确连接到数据库,数据库名称是pgbench,准备开始备份

第三行表示    暗示恢复命令是仅恢复数据,然后就没有然后了!!!!

what  fa?

二,

问题分析和解决方案

仔细观察这个备份命令,发现是-d 数据库名称  -t 模式名称.该模式下的表名 -t 模式名称.该模式下的表名 -t 模式名称.该模式下的表名

OK,将模式名称去掉,发现可以正常的恢复了

postgres@node1 ~]$ pg_restore -Upostgres -v -x -a  -d   pgbench -t dr_route_ds -t dr_task_active_ds 2023-08-02T04_00-ds.dump 
pg_restore: connecting to database for restore
pg_restore: processing data for table "dr.dr_route_ds"
pg_restore: processing data for table "dr.dr_task_active_ds"
pg_restore: processing data for table "ds.dr_route_ds"
pg_restore: processing data for table "ds.dr_task_active_ds"

但出现了一个问题,pgbench这个数据库下有两个scheme,也就是两个模式,两个模式有同样的两张表,我现在只想恢复ds模式下的这两张表的数据,并不想恢复dr模式下的这两张表的数据

因此,最终的恢复命令为加 -n参数,-指定ds模式:

[postgres@node1 ~]$ pg_restore -Upostgres -v -x -a  -d   pgbench -n ds -t dr_route_ds -t dr_task_active_ds 2023-08-02T04_00-ds.dump 
pg_restore: connecting to database for restore
pg_restore: processing data for table "ds.dr_route_ds"
pg_restore: processing data for table "ds.dr_task_active_ds"

####注:

  • 参数-v 是显示恢复的过程,通常此参数是必加的
  • 参数-a 是只覆盖恢复数据不检查对象是否存在,比如,要恢复的表已存在,这个不检查,只把表数据覆盖到表内
  • 参数-x 如果逻辑备份文件内有包含权限的对象,例如用户什么的,使用此参数的时候将不执行相关操作,例如,某个用户的创建在此逻辑备份文件内,但不会执行,也不会检查
  • 参数-d 指定要恢复到哪个数据库内,也就是目标数据库
  • 参数-n 指定目标数据库下的scheme,也就是模式名称
  • 参数-t  指定要恢复的表的表名
  • 最后,逻辑备份文件前面不要加任何参数
10-12 18:48