简体   繁体   English

在 AWS RDS 上删除没有超级用户权限的 postgresql 数据库

[英]Delete postgresql database without superuser rights on AWS RDS

I'm trying to delete a postgres database on an AWS RDS service with a bash script.我正在尝试使用 bash 脚本删除 AWS RDS 服务上的 postgres 数据库。 Based on some answers here I came up with this:基于这里的一些答案,我想出了这个:

#!/bin/bash -ex

DATABASE="confluence"
USER="postgres"
export PGPASSWORD="XXX"

PORT="5432"
HOST="postgres.XXX.eu-central-1.rds.amazonaws.com"

echo "drop db"
DROP_DB_COMMAND=$(cat <<EOF
REVOKE CONNECT ON DATABASE ${DATABASE} FROM public;
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '${DATABASE}';
DROP DATABASE ${DATABASE}
EOF
)

psql \
  --command "${DROP_DB_COMMAND}" \
  --host=${HOST} \
  --port=${PORT} \
  --user=${USER}

However I get an error DROP DATABASE cannot run inside a transaction block .但是我收到一个错误DROP DATABASE cannot run inside a transaction block

I understand that I have to terminate all existing connections and not be connected to the database I want to delete.我知道我必须终止所有现有连接,并且不能连接到我要删除的数据库。 What are the proper psql commands to achieve this?实现此目的的正确 psql 命令是什么?

As this is AWS RDS, the superuser rdsadmin is owned by AWS, so I can't use any solution that needs superuser rights.由于这是 AWS RDS,超级用户rdsadmin归 AWS 所有,因此我无法使用任何需要超级用户权限的解决方案。

Turns out that as opposed to MySQL you can't do it in one transaction.事实证明,与 MySQL 相比,您不能在一个事务中完成。 This works:这有效:

#!/bin/bash -ex

DATABASE="confluence"
USER="postgres"
export PGPASSWORD="XXX"

PORT="5432"
HOST="postgres.XXX.eu-central-1.rds.amazonaws.com"

echo "terminate connections to db"
TERMINATE_COMMAND=$(cat <<EOF
REVOKE CONNECT ON DATABASE ${DATABASE} FROM public;
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '${DATABASE}';
EOF
)


psql \
  --command "${TERMINATE_COMMAND}" \
  --host=${HOST} \
  --port=${PORT} \
  --user=${USER}


echo "drop db"
DROP_DB_COMMAND=$(cat <<EOF
DROP DATABASE ${DATABASE};
EOF
)

psql \
  --command "${DROP_DB_COMMAND}" \
  --host=${HOST} \
  --port=${PORT} \
  --user=${USER}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何通过AWS RDS在没有“数据库”名称的情况下连接到PostgreSQL DB - How to connect to PostgreSQL DB without a “database” name from AWS RDS PostgreSQL数据库超级用户 - Postgresql database superuser 在现有数据库上启用加密-AWS RDS Postgresql - Enable encryption on existing database - AWS RDS Postgresql 不提供证书的AWS RDS Postgresql Connect - AWS RDS Postgresql Connect Without Providing Certificate 使用 AWS RDS PostgreSQL 数据库移动数据 - Move data with AWS RDS PostgreSQL Database AWS RDS PostgreSQL 错误“剩余连接槽为非复制超级用户连接保留” - AWS RDS PostgreSQL error “remaining connection slots are reserved for non-replication superuser connections” 在没有超级用户角色的情况下通过迁移在 PostgreSQL 数据库中安装扩展? - Install extension in PostgreSQL database via migration without superuser role? 超级用户可以在未分配特定数据库的情况下登录PostgreSQL服务器吗? - Can a superuser log into a PostgreSQL server without a specific database assigned to them? 如何在没有超级用户帐户的情况下创建postgresql超级用户? - How to create a postgresql superuser without a superuser account? 如何指定PostgreSQL数据库的超级用户? - How to specify the superuser of a PostgreSQL database?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM