postgresql 通过GitHub操作从具有活动连接的GCP中删除Postgres数据库

vsmadaxz  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(76)

当开发人员为我们的后端打开PR时,将通过GitHub操作为PR创建一个来自暂存数据库的新副本。
数据库副本在与暂存数据库相同的SQL示例中创建,所有Postgres都在Google Cloud Platform中。
当PR关闭时,我们会运行另一个GitHub操作来清理资源。
执行的命令是

gcloud sql databases delete ${{ env.TF_VAR_db_name }} -i OurInstance

字符串

问题

未释放数据库。

ERROR: (gcloud.sql.databases.delete)
HTTPError 400: Invalid request: failed to delete database "db-pr-202".
Detail: pq: database "db-pr-202" is being accessed by other users.
(Please use psql client to delete database that is not owned by "cloudsqlsuperuser").


问题
如何解决这个问题?(* 不重启示例 *)

What I have tried

终止连接

我尝试用各种方法终止连接,但要么什么都不做,要么我连接到他的示例失败,因为缺少psql。另一件事是,没有人真正使用数据库。

- name: Terminate DB Connections
  run: |
    echo "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${{ env.TF_VAR_db_name }}' AND pid <> pg_backend_pid();" | gcloud sql connect api-db --user=postgres --quiet

重启示例

它工作,但它可以影响登台环境,所以我想找到一些其他的解决方案。

nx7onnlm

nx7onnlm1#

您可以修改GitHub操作工作流,以包含尝试强制删除PostgreSQL数据库的步骤。

name: Delete PostgreSQL Database

on:
  push:
    branches:
      - main

jobs:
  delete-database:
    runs-on: ubuntu-latest

steps:
- name: Set up Google Cloud CLI
  uses: google-github-actions/setup-gcloud@master
  with:
    project_id: ${{ secrets.GCP_PROJECT_ID }}
    service_account_key: ${{ secrets.GCP_SA_KEY }}
    export_default_credentials: true

- name: Forcefully Delete PostgreSQL Database
  run: |
    # Replace 'your_database_name' and 'OurInstance' with your actual database name and instance name.
    DATABASE_NAME="your_database_name"
    INSTANCE_NAME="OurInstance"
    
    # Forcefully disconnect active connections
    gcloud sql users set-password postgres@${INSTANCE_NAME} --password=random-password
    
    # Retry database deletion
    retries=3
    while [ $retries -gt 0 ]; do
      if gcloud sql databases delete ${DATABASE_NAME} -i ${INSTANCE_NAME}; then
        echo "Database deletion successful."
        break
      else
        echo "Retrying database deletion..."
        sleep 10
        retries=$((retries - 1))
      fi
    done

字符串
强制删除PostgreSQL数据库:
为“postgres”用户设置一个随机密码,这可能会强制断开活动连接。重试数据库删除,允许活动连接关闭一段时间。

相关问题