2

我有几十个未记录的表,文档说未记录的表在崩溃或不干净的关闭后会自动截断。

基于此,我需要在数据库开始后检查一些表以查看它们是否“空”并对其进行处理。

所以简而言之,我需要在数据库启动后立即执行一个过程。

如何做到最好?

PS:我在 Ubuntu 12.04 服务器上运行 Postgres 9.1。

4

2 回答 2

3

没有这样的功能可用(在撰写本文时,最新版本是 PostgreSQL 9.2)。您唯一的选择是:

  • 从 PostgreSQL 初始化脚本启动一个轮询数据库的脚本,当数据库准备好时锁定表并填充它们;

  • 修改启动脚本以使用pg_ctl start -w并在pg_ctl返回后立即调用您的脚本;这具有相同的竞争条件,但避免了轮询的需要。

  • 指导您的应用程序在打开新的池连接时运行测试,以检测这种情况、锁定表并填充它们;或者

  • 如果您的应用程序在打开新连接时无法处理它们为空的情况,请不要为此任务使用未记录的表

已经讨论了 pgsql-hackers 上的连接时间钩子,但没有发布和合并任何可行的实现。

您可以使用 PostgreSQL bgworkers 执行类似的操作,但这比简单地从脚本轮询数据库要困难得多。

于 2013-04-23T06:16:58.280 回答
0

Postgres 现在pg_isready可以确定数据库是否准备就绪。 https://www.postgresql.org/docs/11/app-pg-isready.html

于 2019-03-29T00:09:09.380 回答