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 后,问题消失了。
我在为 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 优化级别。)
@Rhim 似乎是正确的 -你已经遇到了被认为是编译器错误的问题。您可能需要更新到最新的 gcc 软件包,然后作为参数make clean重新运行,然后重新编译。configureCFLAGS="-O1"
顺便说一句,这表明您正在编译 PostgreSQL 8.4 或更早版本,而pg_sync_pg_database9.0 或更高版本中没有出现这种情况。您还必须在较新的主机上进行编译。由于 PostgreSQL 8.4 即将停产且不受支持,因此这可能不是一个好主意。
它还建议您编译自己的版本而不是使用包。除非您有充分的具体原因,否则您应该使用http://apt.postgresql.org/而不是自己编译。
| 归档时间: |
|
| 查看次数: |
6473 次 |
| 最近记录: |