initdb:初始化pg_authid ... FATAL:索引表达式的数量错误

ris*_*ali 6 postgresql startup

我是PostgreSql的新手.我正在尝试在我的系统中安装PostgreSql.我的操作系统是Ubuntu,下面发布的是我的错误

将使用区域设置en_US.UTF-8初始化数据库群集.因此,默认数据库编码已设置为UTF8.

creating directory p01/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers/max_fsm_pages ... 24MB/153600
creating configuration files ... ok
creating template1 database in p01/pgsql/data/base/1 ... ok
initializing pg_authid ... FATAL:  wrong number of index expressions
STATEMENT:  CREATE TRIGGER pg_sync_pg_database   AFTER INSERT OR UPDATE OR DELETE ON   

pg_database   FOR EACH STATEMENT EXECUTE PROCEDURE flatfile_update_trigger();

child process exited with exit code 1
initdb: removing data directory "p01/pgsql/data"
Run Code Online (Sandbox Code Playgroud)

帮帮我!!谢谢!

小智 7

我在用 gcc 4.9.3 编译 postgresql 8.1.4 后遇到了同样的问题。

问题似乎是 postgres 用来表示可变长度数组的方式:

typedef struct
{
    int32       size;           /* these fields must match ArrayType! */
    int         ndim;
    int         flags;
    Oid         elemtype;
    int         dim1;
    int         lbound1;
    int2        values[1];      /* VARIABLE LENGTH ARRAY */
} int2vector;                   /* VARIABLE LENGTH STRUCT */
Run Code Online (Sandbox Code Playgroud)

在某些情况下,对于访问“值”的循环,GCC 假定它们最多执行一次迭代。如下所示的循环(摘自 postgres 的源代码):

ii->ii_NumIndexAttrs = numKeys;
for (i = 0; i < numKeys; i++)
    ii->ii_KeyAttrNumbers[i] = indexStruct->indkey.values[i];
Run Code Online (Sandbox Code Playgroud)

最终可能会减少到类似以下内容:

ii->ii_NumIndexAttrs = numKeys;
if (numKeys)
    ii->ii_KeyAttrNumbers[0] = indexStruct->indkey.values[0];
Run Code Online (Sandbox Code Playgroud)

通过查看为它生成的汇编程序推断出:

.L161:
    testl   %r12d, %r12d
    movl    %r12d, 4(%rbx)
    jle .L162
    movzwl  40(%r13), %eax
    movw    %ax, 8(%rbx)
.L162:
Run Code Online (Sandbox Code Playgroud)

在使用 -fno-aggressive-loop-optimizations 禁用该优化的情况下重新编译 postgres 后,问题消失了。


Joh*_*sen 5

我在为 centos 7 (3.10.0-229.el7.x86_64) 构建 centos 5 版本的 postgresql (8.2) 时遇到了同样的问题。

我无法使用 CFLAGS="-O1" 技巧使其与 gcc-4.8.3 一起工作,但是切换到 clang (3.4.2) 因为编译器 (CC=clang) 确实对我有用(并且它有效)在默认的 -O2 优化级别。)


Cra*_*ger 4

@Rhim 似乎是正确的 -你已经遇到了被认为是编译器错误的问题。您可能需要更新到最新的 gcc 软件包,然后作为参数make clean重新运行,然后重新编译。configureCFLAGS="-O1"

顺便说一句,这表明您正在编译 PostgreSQL 8.4 或更早版本,而pg_sync_pg_database9.0 或更高版本中没有出现这种情况。您还必须在较新的主机上进行编译。由于 PostgreSQL 8.4 即将停产且不受支持,因此这可能不是一个好主意。

它还建议您编译自己的版本而不是使用包。除非您有充分的具体原因,否则您应该使用http://apt.postgresql.org/而不是自己编译。