使用pg_dump和psql -U postgres db_name <...移动数据库会导致"ERROR:relation"table_name"不存在"

Dea*_*lze 19 postgresql jpa jdbc

我使用PostgresQL数据库从一个硬盘驱动器移动到另一个硬盘驱动器

pg_dump -U postgres db_name > db_name.dump
Run Code Online (Sandbox Code Playgroud)

然后

psql -U postgres db_name < db_name.dump
Run Code Online (Sandbox Code Playgroud)

我在两个实例中以相同的方式创建了数据库db_name.在新数据库中,当我使用JPA查询(或JDBC查询)运行我的Java程序时,我收到此错误:

"ERROR: relation "table1" does not exist"
Run Code Online (Sandbox Code Playgroud)

查询是:

select count(0) from table1
Run Code Online (Sandbox Code Playgroud)

我知道我有连接,因为如果我在连接参数中更改密码,我会收到错误.

出于某种原因,在新的PostgresQL实例中,它认为table1在导入的模式中不存在.

如果我将查询更改为

从myschema.table1中选择count(0)

然后它抱怨权限:

"ERROR: permission denied for schema myschema"
Run Code Online (Sandbox Code Playgroud)

为什么权限会有所不同?

表table1存在于myschema中,因为我可以在pgAdmin工具中看到它.所有行都导入到新的PostgresQL实例中.

当我从Java进行查询时,pg_dump和psql的组合产生了一个问题.

我该怎么做才能解决这个问题?

提前致谢.

Joh*_*n P 32

您是否正在转向相同版本的PostgreSQL?如果使用pg_dump 8.3进行转储并尝试在Postgresql 8.4中恢复它,则可能会出现问题.无论如何,假设它是相同的版本,请尝试以下方法:

转储所有全局对象,例如用户和组(不知道它们是否在转储中丢失):

pg_dumpall -g -U postgres > globals.sql
Run Code Online (Sandbox Code Playgroud)

转储数据库架构:

pg_dump -Fp -s -v -f db-schema.sql -U postgres dbname
Run Code Online (Sandbox Code Playgroud)

转储数据库的内容:

pg_dump -Fc -v -f full.dump -U postgres dbname
Run Code Online (Sandbox Code Playgroud)

现在恢复.

psql -f globals.sql
psql -f db-schema.sql dbname
pg_restore -a -d dbname -Fc full.dump
Run Code Online (Sandbox Code Playgroud)

那是我0.02美元.希望能帮助到你.

  • 我会在大型数据库的pg_restore中添加详细标志(-v)。pg_restore -a -v -d dbname -Fc full.dump` (2认同)
  • 如果您无论如何都要去`pg_restore -a`,那么将模式转储两次(以纯文本和压缩形式)有什么意义?例如,为什么不是`pg_dump -Fc -a -v -f data.dump`?或者完全跳过模式步骤,只在一个步骤中执行全局变量,而在另一个步骤中执行其他所有操作? (2认同)

Ali*_*vut 6

我遇到了这个问题。然后我意识到我忘记安装postgis扩展了。

不要忘记安装您使用的扩展。

  • 非常感谢伙计。这是我挣扎了几个小时的问题。甚至不知道 postgis 的存在,我是 postgre 世界的新手。刚刚从 repo 安装了 postgis 并且一切正常。 (2认同)