PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 E. 版本说明 | 下一页

# E.217. 版本 7.4.2

> 发布日期: 2004-03-08

这个版本包含各种自7.4.1以来的修复。关于7.4主版本的新特性的信息， 请查阅第 E.219 节。

## E.217.1. 迁移到版本 7.4.2

运行7.4.X的用户不需要转储/恢复。不过， 作为合并修复在最初的7.4.X系统目录中发现的两个错误的最简单的方法，这应该会是明智的。 使用7.4.2的initdb的dump/initdb/reload序列将自动纠正这些问题。

更严重的两个错误是数据类型`anyarray`有错误的对齐标签； 这是一个问题，因为`pg_statistic`系统目录使用`anyarray`字段。 贴错标签会引起规划器错误估计甚至当包含`WHERE` 子句的规划器查询在两端对齐的字段(如`float8`和`timestamp`)上时会崩溃。 强烈建议所有安装都修复这个错误，通过initdb或遵循下面给出的手动修复程序。

较小的错误是系统视图`pg_settings`应该被标记为有公共更新访问， 以允许`UPDATE pg_settings`用作`SET`的替代。 这也可以通过initdb或者手动修复，但是没有必要修复，除非你想要使用`UPDATE pg_settings`。

如果你不愿意做initdb，那么下面的程序将修复`pg_statistic`。 作为数据库超级用户，执行：

    -- clear out old data in pg_statistic:
    DELETE FROM pg_statistic;
    VACUUM pg_statistic;
    -- this should update 1 row:
    UPDATE pg_type SET typalign = 'd' WHERE oid = 2277;
    -- this should update 6 rows:
    UPDATE pg_attribute SET attalign = 'd' WHERE atttypid = 2277;
    --
    -- At this point you MUST start a fresh backend to avoid a crash!
    --
    -- repopulate pg_statistic:
    ANALYZE;

这可以在活动的数据库中完成，但是要注意所有运行在改变了的数据库中的后端都必须在 重新填充`pg_statistic`是安全的之前重新启动。

要修复`pg_statistic`错误，只需要做：

    GRANT SELECT, UPDATE ON pg_settings TO PUBLIC;

上面的程序必须在每个安装的数据库中执行，包括`template1`， 理想上也包括`template0`。如果你没有修复模板数据库， 那么任何随后创建的数据库都将包含相同的错误。`template1`的修复方式和其他数据库相同， 但是修复`template0`需要额外的步骤。首先，从任意数据库中发出：

    UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';

下一步，连接到`template0`，并执行上面的修复步骤。最后，执行：

    -- re-freeze template0:
    VACUUM FREEZE;
    -- and protect it against future alterations:
    UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';

## E.217.2. 修改列表

版本7.4.2合并了所有包含在版本7.3.6中的修复，加上下面的修复：

- 修复会使优化器崩溃的`pg_statistics`对齐错误

  关于这个问题的详细信息请查看上文。

- 允许非超级用户更新`pg_settings`

- 修复几个优化器错误，大多数会导致"variable not found in subplan target lists"错误

- 避免启动大的多个索引扫描期间的超出内存失败

- 修复`COPY IN`期间可能导致"内存不足"错误的多字节问题

- 修复没有OID的表的`SELECT INTO` / `CREATE TABLE AS`问题

- 修复并行测试期间`alter_table`回归测试的问题

- 修复打开文件限制的问题，尤其是在OS X上 (Tom)

- 部分的修复Turkish区域设置问题

  initdb在Turkish的区域设置现在将成功，但是仍然有一些与`i/I`问题相关的不便。

- 使得pg_dump在恢复时设置客户端编码

- 其他较小的pg_dump修复

- 允许ecpg再次使用C关键字作为字段名 (Michael)

- 添加ecpg `WHENEVER NOT_FOUND`到`SELECT/INSERT/UPDATE/DELETE` (Michael)

- 修复查询调用设置返回函数时的ecpg崩溃 (Michael)

- 各种其他ecpg修复 (Michael)

- 修复Borland编译器

- 线程构建的改进 (Bruce)

- 各种其他构建修复

- 各种JDBC修复

上一页 | 起始页 | 下一页
版本 7.4.3 | 上一级 | 版本 7.4.1