postgresql 在google云上调用pg_repack的推荐方法

htrmnn0y  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(1)|浏览(188)

我们已经在postgresql数据库上安装了pg_repack。
使用GCP基础设施定期调用pg_repack命令的最佳方式是什么?
我们尝试使用Cloud Run运行它,但是1小时的时间限制通常意味着它在完成之前就超时了。
当它超时时,我们在后续运行中会遇到以下错误:

WARNING: the table "public.<table name>" already has a trigger called "repack_trigger"
DETAIL: The trigger was probably installed during a previous attempt to run pg_repack on the table which was interrupted and for some reason failed to clean up the temporary objects. Please drop the trigger or drop and recreate the pg_repack extension altogether to remove all the temporary objects left over.

这迫使我们手动重新创建扩展。
调度pg_repack而不用担心它超时的最简单的方法是什么?或者,有没有一种方法可以优雅地关闭pg_repack,这样我们就可以重试而不必重新创建扩展?

kiayqfof

kiayqfof1#

当你使用Cloud Run时,这个pg_repack命令需要很多时间才能完成。最好和最简单的方法是使用Google Cloud Functions或Google Cloud Scheduler来安排pg_repack命令的运行。
通过使用Cloud Scheduler以所需的间隔(如每天一次)定期运行来触发云功能,从而避免超时风险。
在下面的代码中,repack_table_felix函数用于重新打包指定的表。force_inplace=true参数强制就地进行重新打包,这可能会更快,但会占用更多磁盘空间。可以更改此参数以适合您的特定使用情况。**“repack_trigger”**处理异常错误消息,这将允许函数优雅地退出,而不会留下任何对象。

import psycopg2

def repack_database(request):
    conn = psycopg2.connect(host="<host name>", dbname="<database name>", user="<username>", password="<password>")
    cur = conn.cursor()

    try:
        cur.execute("SELECT pg_repack.repack_table_felix('<your table name>', force_inplace=true)")
        conn.commit()
    except Exception as e:
        conn.rollback()
        print(e)
    finally:
        cur.close()
        conn.close()

    return "pg_repack completed successfully"

相关问题