【问题标题】:pg_dump ERROR: malformed record literalpg_dump 错误:格式错误的记录文字
【发布时间】:2017-10-30 05:35:10
【问题描述】:

我在一个也称为“名称”的数据库中有名为“名称”的下表。我在服务器上备份其他数据库没有问题。但是对于这个数据库,我收到以下错误

root@latitude:~/pg_backup_lenovo# pg_dump -h 192.168.1.201 -U superusername name > name.dump
pg_dump: [archiver (db)] query failed: ERROR:  malformed record literal: "bigint"
LINE 1: SELECT 'bigint'::name AS sequence_type, start_value, increme...
               ^
DETAIL:  Missing left parenthesis.
pg_dump: [archiver (db)] query was: SELECT 'bigint'::name AS sequence_type, start_value, increment_by, max_value, min_value, cache_value, is_cycled FROM name_id_seq

我的架构

CREATE TABLE public.name
(
    id bigint NOT NULL DEFAULT nextval('name_id_seq'::regclass),
    name text COLLATE pg_catalog."default",
    sex text COLLATE pg_catalog."default",
    type text COLLATE pg_catalog."default",
    CONSTRAINT name_pkey PRIMARY KEY (id)
)

我不确定这里发生了什么。这可能是一个错误吗?

【问题讨论】:

  • 是的,这是一个错误。我们应该在演员阵容中使用pg_catalog.name。请向 pgsql-bugs 邮件列表报告错误。
  • 来自sequence_type 我假设您使用最近的 10 个?...也许标记它?...

标签: postgresql


【解决方案1】:

name 是位于pg_catalog 命名空间中的内置类型。

public 架构中创建具有该名称的表时,会创建 public 模式中的另一种类型也称为 name,因为 每个表也是一个复合类型。您可以通过select * from pg_catalog.pg_type where typname='name' 进行检查

通常将某些内容投射到 name 时,查询 失败(SELECT 'bigint'::name AS sequence_type...),这是 输入pg_catalog 会被选中,因为pg_catalog 隐含在public 之前 在search_path中,如doc中所述:

除了公共和用户创建的模式之外,每个数据库 包含一个 pg_catalog 模式,其中包含系统表和所有 内置数据类型、函数和运算符。 pg_catalog 是 始终有效地成为搜索路径的一部分。如果没有命名 显式在路径中,然后在搜索之前隐式搜索 路径的模式。这确保了内置名称将始终 可找到的。但是,您可以明确地将 pg_catalog 放在 如果您希望覆盖用户定义的名称,您的搜索路径 内置名称

'bigint'::name得到的错误信息是指 该 postgres 使用对应的类型解析强制转换 到public 模式中的表,而显然pg_dump 期望它会找到内置的name 类型。

所以看起来你在上面引用的段落中强调的情况,在某种程度上与内置类型冲突,至少对于pg_dump

要测试该理论,请查看search_path 用户运行pg_dump 并在将其重置为无害的值后再次尝试转储,例如:

ALTER USER user_running_pg_dump SET search_path TO public;

【讨论】:

  • 感谢您的解释。我认为最简单的解决方案是将我的数据库/表名称从名称更改为其他名称
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多