pg_dump错误:记录字面错误

时间:2017-10-29 17:13:15

标签: postgresql

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

df = pd.concat([df]*10000)

%timeit df['new'] = df.name2.eq(df.name1).astype(int).groupby(df.name1).transform('sum')
# 100 loops, best of 3: 4.85 ms per loop

%%timeit
cnt = df.groupby('name1').apply(lambda g: (g.name1 == g.name2).sum())
df['new'] = df.name1.map(cnt)
# 10 loops, best of 3: 22.1 ms per loop

我的架构

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

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

1 个答案:

答案 0 :(得分:3)

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

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

进行检查 将某些内容投射到name时,

通常,查询也是如此 失败(SELECT 'bigint'::name AS sequence_type...),就是这样 输入被pg_catalog的{​​{1}},因为pg_catalogpublic之前隐式显示 在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;