{"format": 1, "mode": "release", "from_release": null, "to_release": {"date": "2015-06-12", "build": "9.4.4", "major": "9.4", "minor": 4, "manual": "9.4", "status": "stable", "doc_git": "", "version": "9.4.4", "eol_date": "2020-02-13", "date_text": "2015-06-12", "supported": false, "manual_url": "/docs/9.4/release-9-4-4.html", "source_url": "/docs/release/9.4.4/", "entry_count": 4, "placeholder": false, "content_hash": "f3f4245b77478168f830af02f870f4fea3bc48153aa703b30c474a78a11146a0", "manual_build": "9.4.26", "source_as_of": "", "changes_count": 4, "doc_loaded_at": "2026-09-26T02:56:45.438944", "migration_html": "<p>对于运行 9.4.X 的用户，不需要转储/恢复。</p>\n<p>但是，如果你要升级的安装此前曾使用 9.3.0 到 9.3.4（含）之间的<span>pg_upgrade</span>版本升级过，请参见下面的第一条变更日志条目。</p>\n<p>另外，如果你是从早于 9.4.2 的版本升级，请参见<a href=\"/docs/9.4/release-9-4-2.html\" title=\"E.25. 版本 9.4.2\">第 E.25 节</a>。</p>", "compatibility_count": 0, "label": "9.4.4", "status_label": "历史版本", "eol": "2020-02-13", "age_days": 4128, "support_days": -2421}, "groups": [{"date": "2015-06-12", "build": "9.4.4", "major": "9.4", "minor": 4, "manual": "9.4", "status": "stable", "doc_git": "", "version": "9.4.4", "eol_date": "2020-02-13", "date_text": "2015-06-12", "supported": false, "manual_url": "/docs/9.4/release-9-4-4.html", "source_url": "/docs/release/9.4.4/", "entry_count": 4, "placeholder": false, "content_hash": "f3f4245b77478168f830af02f870f4fea3bc48153aa703b30c474a78a11146a0", "manual_build": "9.4.26", "source_as_of": "", "changes_count": 4, "doc_loaded_at": "2026-09-26T02:56:45.438944", "migration_html": "<p>对于运行 9.4.X 的用户，不需要转储/恢复。</p>\n<p>但是，如果你要升级的安装此前曾使用 9.3.0 到 9.3.4（含）之间的<span>pg_upgrade</span>版本升级过，请参见下面的第一条变更日志条目。</p>\n<p>另外，如果你是从早于 9.4.2 的版本升级，请参见<a href=\"/docs/9.4/release-9-4-2.html\" title=\"E.25. 版本 9.4.2\">第 E.25 节</a>。</p>", "compatibility_count": 0, "label": "9.4.4", "status_label": "历史版本", "eol": "2020-02-13", "age_days": 4128, "support_days": -2421, "entries": [{"id": "9.4.4-73b7d5f1a2438a4d", "cves": [], "html": "<p>修复从不一致数据库状态恢复时可能失败的问题（Robert Haas）</p>\n<p>最近的<span>PostgreSQL</span>发行版引入了防御多事务 ID 回卷的机制，但其中一些代码没有考虑到可能需要在崩溃恢复期间（数据库可能不处于一致状态时）运行。这可能导致崩溃后无法重启或无法启动辅助服务器。在曾使用 9.3.0 到 9.3.4 之间<span>pg_upgrade</span>版本的安装中，<span>pg_upgrade</span>一个已修复缺陷的残留影响也可能导致这种失败。</p>\n<p>所涉及的<span>pg_upgrade</span>缺陷是：即使真实值应该更高，它也会把<code>pg_control</code>中的<code>oldestMultiXid</code>设为 1。有了本发行版引入的修复，这种情况将导致立即进行紧急自动清理，直到能够确定正确的<code>oldestMultiXid</code>值。如果这会造成困难，用户可以在升级到本发行版<span><em>之前</em></span>进行手工清理来避免。具体步骤如下：</p>\n<div>\n<ol type=\"1\">\n<li>\n<p>检查<span>pg_controldata</span>报告的<span>“<span>Latest checkpoint's oldestMultiXid</span>”</span>是否为 1。如果不是，则无需任何操作。</p>\n</li>\n<li>\n<p>查看<code>PGDATA/pg_multixact/offsets</code>中是否有名为<code>0000</code>的文件。如果有，则无需任何操作。</p>\n</li>\n<li>\n<p>否则，对于 <code>pg_class</code>.<code>relminmxid</code> 等于 1 的每个表，将<a href=\"/docs/9.4/runtime-config-client.html#GUC-VACUUM-MULTIXACT-FREEZE-MIN-AGE\">vacuum_multixact_freeze_min_age</a>和<a href=\"/docs/9.4/runtime-config-client.html#GUC-VACUUM-MULTIXACT-FREEZE-TABLE-AGE\">vacuum_multixact_freeze_table_age</a>都设为零后对该表执行 <code>VACUUM</code>。（可以使用<a href=\"/docs/9.4/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST\" title=\"18.4.4. 基于代价的清理延迟\">第 18.4.4 节</a>中描述的清理延迟代价参数来减小对并发会话的性能影响。）</p>\n</li>\n</ol>\n</div>", "text": "修复从不一致数据库状态恢复时可能失败的问题（Robert Haas） 最近的PostgreSQL发行版引入了防御多事务 ID 回卷的机制，但其中一些代码没有考虑到可能需要在崩溃恢复期间（数据库可能不处于一致状态时）运行。这可能导致崩溃后无法重启或无法启动辅助服务器。在曾使用 9.3.0 到 9.3.4 之间pg_upgrade版本的安装中，pg_upgrade一个已修复缺陷的残留影响也可能导致这种失败。 所涉及的pg_upgrade缺陷是：即使真实值应该更高，它也会把pg_control中的oldestMultiXid设为 1。有了本发行版引入的修复，这种情况将导致立即进行紧急自动清理，直到能够确定正确的oldestMultiXid值。如果这会造成困难，用户可以在升级到本发行版之前进行手工清理来避免。具体步骤如下： 检查pg_controldata报告的“Latest checkpoint's oldestMultiXid”是否为 1。如果不是，则无需任何操作。 查看PGDATA/pg_multixact/offsets中是否有名为0000的文件。如果有，则无需任何操作。 否则，对于 pg_class.relminmxid 等于 1 的每个表，将vacuum_multixact_freeze_min_age和vacuum_multixact_freeze_table_age都设为零后对该表执行 VACUUM。（可以使用第 18.4.4 节中描述的清理延迟代价参数来减小对并发会话的性能影响。）", "title": "修复从不一致数据库状态恢复时可能失败的问题", "commits": [], "section": "变更", "category": "bugfix", "source_url": "/docs/release/9.4.4/#id-1.11.6.27.5", "source_hash": "e2e2fde4accd537ab1251352ad37397de3477b5be28035712a8994a25bfdc908", "section_path": ["变更"], "commit_groups": [["068cfadf9", "2a9b01928", "b6a3444fa"]], "identity_text": "Fix possible failure to recover from an inconsistent database state (Robert Haas) Recent PostgreSQL releases introduced mechanisms to protect against multixact wraparound, but some of that code did not account for the possibility that it would need to run during crash recovery, when the database may not be in a consistent state. This could result in failure to restart after a crash, or failure to start up a secondary server. The lingering effects of a previously-fixed bug in pg_upgrade could also cause such a failure, in installations that had used pg_upgrade versions between 9.3.0 and 9.3.4. The pg_upgrade bug in question was that it would set oldestMultiXid to 1 in pg_control even if the true value should be higher. With the fixes introduced in this release, such a situation will result in immediate emergency autovacuuming until a correct oldestMultiXid value can be determined. If that would pose a hardship, users can avoid it by doing manual vacuuming before upgrading to this release. In detail: Check whether pg_controldata reports Latest checkpoint's oldestMultiXid to be 1. If not, there's nothing to do. Look in PGDATA/pg_multixact/offsets to see if there's a file named 0000. If there is, there's nothing to do. Otherwise, for each table that has pg_class.relminmxid equal to 1, VACUUM that table with both guc-vacuum-multixact-freeze-min-age and guc-vacuum-multixact-freeze-table-age set to zero. (You can use the vacuum cost delay parameters described in runtime-config-resource-vacuum-cost to reduce the performance consequences for concurrent sessions.)", "commit_aliases": ["068cfadf9", "2a9b01928", "b6a3444fa"], "source_commits": ["b6a3444fa"], "source_entry_id": "9.4.4/changes/001", "db_id": "2d66e6c53b648ce35a846303cd52b3d4", "patch_ids": ["ea3eff3629865b0352cc935a51d3855e"], "statement_hash": "b3c80c8463d18eaf276209dc486b6cfa32498fef3ecdc2cbfd642e301b599709", "relations": [], "version": "9.4.4", "category_label": "BUG 修复", "also_in": [], "variants": [], "related_changes": []}, {"id": "9.4.4-2138cf0f137fffce", "cves": [], "html": "<p>修复罕见的未能使关系缓存 init 文件失效的问题（Tom Lane）</p>\n<p>在并发活动时序恰好不对的情况下，对系统目录执行<code>VACUUM FULL</code>可能无法更新用于避免新会话缓存加载工作的<span>“<span>init 文件</span>”</span>。这将导致后续会话完全无法访问该目录。这是一个非常古老的缺陷，但它极难触发，直到最近才出现可复现的案例。</p>", "text": "修复罕见的未能使关系缓存 init 文件失效的问题（Tom Lane） 在并发活动时序恰好不对的情况下，对系统目录执行VACUUM FULL可能无法更新用于避免新会话缓存加载工作的“init 文件”。这将导致后续会话完全无法访问该目录。这是一个非常古老的缺陷，但它极难触发，直到最近才出现可复现的案例。", "title": "修复罕见的未能使关系缓存 init 文件失效的问题", "commits": [], "section": "变更", "category": "bugfix", "source_url": "/docs/release/9.4.4/#id-1.11.6.27.5", "source_hash": "6bec1b27e4a7c93b00f27640abe8cfeea45f0bff3dcdb265af25580efcb2a989", "section_path": ["变更"], "commit_groups": [["2fe1939b0", "3e69a73b9", "4f2458dd7", "be25a08a9", "e06e56212", "f3b5565dd"]], "identity_text": "Fix rare failure to invalidate relation cache init file (Tom Lane) With just the wrong timing of concurrent activity, a VACUUM FULL on a system catalog might fail to update the init file that's used to avoid cache-loading work for new sessions. This would result in later sessions being unable to access that catalog at all. This is a very ancient bug, but it's so hard to trigger that no reproducible case had been seen until recently.", "commit_aliases": ["2fe1939b0", "3e69a73b9", "4f2458dd7", "be25a08a9", "e06e56212", "f3b5565dd"], "source_commits": ["be25a08a9"], "source_entry_id": "9.4.4/changes/002", "db_id": "e08881035a5c62a2921de58daddb199c", "patch_ids": ["43109e6cb73ae640a9ad9fe95233aede"], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d", "relations": [{"rule": 2, "type": "equivalent", "target": "421f0e5f53c1b534c1a5d7e5c3ddaeb1", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}}, {"rule": 2, "type": "equivalent", "target": "56559e80e5e318ceb4a1514c01179a96", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}}, {"rule": 2, "type": "equivalent", "target": "62f6eb8f9354ed2084e2a04aba92b9a4", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}}, {"rule": 2, "type": "equivalent", "target": "d00ab3b80fd0fe3a84d1b02a94bfcd79", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}}], "version": "9.4.4", "category_label": "BUG 修复", "also_in": [], "variants": [], "related_changes": [{"db_id": "d00ab3b80fd0fe3a84d1b02a94bfcd79", "kind": "equivalent", "version": "9.3.9", "label": "9.3.9", "title": "修复罕见的未能使关系缓存 init 文件失效的问题", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}, "url": "/docs/compare/?release=9.3.9#9.3.9-2138cf0f137fffce", "source_url": "/docs/release/9.3.9/#id-1.11.6.21.5"}, {"db_id": "62f6eb8f9354ed2084e2a04aba92b9a4", "kind": "equivalent", "version": "9.2.13", "label": "9.2.13", "title": "修复罕见的未能使关系缓存 init 文件失效的问题", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}, "url": "/docs/compare/?release=9.2.13#9.2.13-2138cf0f137fffce", "source_url": "/docs/release/9.2.13/#id-1.11.6.16.5"}, {"db_id": "421f0e5f53c1b534c1a5d7e5c3ddaeb1", "kind": "equivalent", "version": "9.1.18", "label": "9.1.18", "title": "修复罕见的未能使关系缓存 init 文件失效的问题", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}, "url": "/docs/compare/?release=9.1.18#9.1.18-2138cf0f137fffce", "source_url": "/docs/release/9.1.18/#id-1.11.6.11.5"}, {"db_id": "56559e80e5e318ceb4a1514c01179a96", "kind": "equivalent", "version": "9.0.22", "label": "9.0.22", "title": "修复罕见的未能使关系缓存 init 文件失效的问题", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "cbd29ab3677162dd8eee0c8fdae7218663c03b789800db751346403cb4a7e91d"}, "url": "/docs/compare/?release=9.0.22#9.0.22-2138cf0f137fffce", "source_url": "/docs/release/9.0.22/#id-1.11.6.6.6"}]}, {"id": "9.4.4-bf7732cf950a1492", "cves": [], "html": "<p>避免传入会话与<code>CREATE/DROP DATABASE</code>之间的死锁（Tom Lane）</p>\n<p>在作为<code>DROP DATABASE</code>命令目标或<code>CREATE DATABASE</code>命令模板的数据库中启动的新会话，可能导致该命令等待五秒后失败，即使新会话本会在此之前退出。</p>", "text": "避免传入会话与CREATE/DROP DATABASE之间的死锁（Tom Lane） 在作为DROP DATABASE命令目标或CREATE DATABASE命令模板的数据库中启动的新会话，可能导致该命令等待五秒后失败，即使新会话本会在此之前退出。", "title": "避免传入会话与CREATE/DROP DATABASE之间的死锁", "commits": [], "section": "变更", "category": "bugfix", "source_url": "/docs/release/9.4.4/#id-1.11.6.27.5", "source_hash": "5955b77e7598b41a798cbf651d54231093f0a28da1857ce4d5be305b763ca703", "section_path": ["变更"], "commit_groups": [["002e7d144", "04358dab2", "247263dc3", "ac23b711d", "ac86eda63", "dbd99c7f0"]], "identity_text": "Avoid deadlock between incoming sessions and CREATE/DROP DATABASE (Tom Lane) A new session starting in a database that is the target of a DROP DATABASE command, or is the template for a CREATE DATABASE command, could cause the command to wait for five seconds and then fail, even if the new session would have exited before that.", "commit_aliases": ["002e7d144", "04358dab2", "247263dc3", "ac23b711d", "ac86eda63", "dbd99c7f0"], "source_commits": ["247263dc3"], "source_entry_id": "9.4.4/changes/003", "db_id": "c17918b133f9aac5297f7d0675245278", "patch_ids": ["dcfcf0c1a5ff11925f6edd679f0426cc"], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496", "relations": [{"rule": 2, "type": "equivalent", "target": "29b698d5466f021dc8611d5d25ef7a31", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}}, {"rule": 2, "type": "equivalent", "target": "324abd755d98fe477c7962eab7502c58", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}}, {"rule": 2, "type": "equivalent", "target": "7f208fa7a3abd0837b1466c4a8f65e61", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}}, {"rule": 2, "type": "equivalent", "target": "9bfc180a71dd7d167b27c33f605fed9e", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}}], "version": "9.4.4", "category_label": "BUG 修复", "also_in": [], "variants": [], "related_changes": [{"db_id": "324abd755d98fe477c7962eab7502c58", "kind": "equivalent", "version": "9.3.9", "label": "9.3.9", "title": "避免传入会话与CREATE/DROP DATABASE之间的死锁", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}, "url": "/docs/compare/?release=9.3.9#9.3.9-bf7732cf950a1492", "source_url": "/docs/release/9.3.9/#id-1.11.6.21.5"}, {"db_id": "29b698d5466f021dc8611d5d25ef7a31", "kind": "equivalent", "version": "9.2.13", "label": "9.2.13", "title": "避免传入会话与CREATE/DROP DATABASE之间的死锁", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}, "url": "/docs/compare/?release=9.2.13#9.2.13-bf7732cf950a1492", "source_url": "/docs/release/9.2.13/#id-1.11.6.16.5"}, {"db_id": "7f208fa7a3abd0837b1466c4a8f65e61", "kind": "equivalent", "version": "9.1.18", "label": "9.1.18", "title": "避免传入会话与CREATE/DROP DATABASE之间的死锁", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}, "url": "/docs/compare/?release=9.1.18#9.1.18-bf7732cf950a1492", "source_url": "/docs/release/9.1.18/#id-1.11.6.11.5"}, {"db_id": "9bfc180a71dd7d167b27c33f605fed9e", "kind": "equivalent", "version": "9.0.22", "label": "9.0.22", "title": "避免传入会话与CREATE/DROP DATABASE之间的死锁", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "9cfac8d41ed5419bd18a7efcbaf8feb78254029ffd3c6f0dd8c9d0f63a21a496"}, "url": "/docs/compare/?release=9.0.22#9.0.22-bf7732cf950a1492", "source_url": "/docs/release/9.0.22/#id-1.11.6.6.6"}]}, {"id": "9.4.4-1589ac17a237ca7b", "cves": [], "html": "<p>改进规划器对带内层索引扫描的半连接和反连接的代价估计（Tom Lane、Tomas Vondra）</p>\n<p>当所有连接子句都被用作索引扫描条件时，这种计划相当廉价，即使内层扫描名义上会取回很多行，因为执行器在取得一行后就会停止。规划器只部分考虑了这一效应，因此会高估代价，从而可能选择其他效率低得多的计划类型。</p>", "text": "改进规划器对带内层索引扫描的半连接和反连接的代价估计（Tom Lane、Tomas Vondra） 当所有连接子句都被用作索引扫描条件时，这种计划相当廉价，即使内层扫描名义上会取回很多行，因为执行器在取得一行后就会停止。规划器只部分考虑了这一效应，因此会高估代价，从而可能选择其他效率低得多的计划类型。", "title": "改进规划器对带内层索引扫描的半连接和反连接的代价估计", "commits": [], "section": "变更", "category": "improvement", "source_url": "/docs/release/9.4.4/#id-1.11.6.27.5", "source_hash": "f322cfa8327a0f509d300f9ab59a5f532671a568c4f8da13c4db1899c8996e73", "section_path": ["变更"], "commit_groups": [["3f59be836", "d3fdec6ae", "f0a8515c4"]], "identity_text": "Improve planner's cost estimates for semi-joins and anti-joins with inner indexscans (Tom Lane, Tomas Vondra) This type of plan is quite cheap when all the join clauses are used as index scan conditions, even if the inner scan would nominally fetch many rows, because the executor will stop after obtaining one row. The planner only partially accounted for that effect, and would therefore overestimate the cost, leading it to possibly choose some other much less efficient plan type.", "commit_aliases": ["3f59be836", "d3fdec6ae", "f0a8515c4"], "source_commits": ["f0a8515c4"], "source_entry_id": "9.4.4/changes/004", "db_id": "7916bee9ba56604ad86289b59ee36aa3", "patch_ids": ["f0a6612dbc9cf47bae74e80cba0abb58"], "statement_hash": "b7b5fc9512cfeae1b89fb392931193ad2c07a0a22d2eca615fcafaef29101555", "relations": [{"rule": 2, "type": "equivalent", "target": "7144805ffe7016753eda2f00a46bdd61", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "b7b5fc9512cfeae1b89fb392931193ad2c07a0a22d2eca615fcafaef29101555"}}], "version": "9.4.4", "category_label": "其他改进", "also_in": [], "variants": [], "related_changes": [{"db_id": "7144805ffe7016753eda2f00a46bdd61", "kind": "equivalent", "version": "9.3.9", "label": "9.3.9", "title": "改进规划器对带内层索引扫描的半连接和反连接的代价估计", "evidence": {"same_day": true, "patch_ids": [], "statement_hash": "b7b5fc9512cfeae1b89fb392931193ad2c07a0a22d2eca615fcafaef29101555"}, "url": "/docs/compare/?release=9.3.9#9.3.9-1589ac17a237ca7b", "source_url": "/docs/release/9.3.9/#id-1.11.6.21.5"}]}]}], "stats": [{"key": "all", "label": "全部变更", "count": 4}, {"key": "feature", "label": "新功能", "count": 0}, {"key": "bugfix", "label": "BUG 修复", "count": 3}, {"key": "security", "label": "安全相关", "count": 0}, {"key": "performance", "label": "性能改进", "count": 0}, {"key": "compatibility", "label": "兼容性变化", "count": 0}, {"key": "improvement", "label": "其他改进", "count": 1}], "total": 4, "release_count": 1, "cross_major": false, "cve_count": 0, "cves": [], "cve_available": true, "remaining_cves": [], "security_regressions": [], "warnings": [], "candidate_count": 4, "already_in_source_count": 0, "duplicate_count": 0, "excluded_count": 0, "exclusions": [], "source_as_of": "2026-09-26", "security_as_of": "2026-09-26"}