HOWTO · PostgreSQL
在 PostgreSQL 中通过 PSQL 删除数据库
本文介绍如何在 PostgreSQL 中通过 Psql 删除数据库。
本页内容
要删除 PostgreSQL 数据库,请先通过 psql 连接到另一个数据库,再运行 DROP DATABASE;也可以使用独立的 dropdb 命令行工具。这两种方式都会永久删除目标数据库及其中的内容。操作前请确认数据库名称无误,创建并验证所需备份,并确认其中的数据可以丢弃。
检查目标数据库和连接
使用有权限删除目标数据库的账户启动 psql。例如,在终端或命令提示符中连接到维护数据库:
psql -U postgres -d postgres
-d 后面的 postgres 是要连接的数据库,而不是要删除的数据库。进入 psql 提示符后,使用 \l 列出数据库,并仔细核对目标名称的拼写和大小写。PostgreSQL 会将未加引号的标识符转换为小写,因此,如果数据库名称创建时使用了带引号的混合大小写字母,在 SQL 中也必须用相同大小写加引号。
你不能删除当前会话所连接的数据库。执行删除命令前,请先连接到另一个数据库,例如 postgres。还应与其他用户确认没有工作或应用程序依赖该目标数据库;删除会移除其中的数据,而且无法撤销。
使用 psql 删除数据库
在 psql 提示符下直接输入 SQL。假设数据库名为 sales_archive,命令如下:DROP DATABASE sales_archive;。分号用于结束 SQL 语句。如果数据库可能已经不存在,可使用 DROP DATABASE IF EXISTS sales_archive;,以避免因数据库不存在而报错;但它不会绕过权限检查或活动连接限制。
你也可以在 shell 中发送 SQL,而不进入交互式提示符。请连接到另一个数据库,并将 SQL 作为一个参数引用,例如:psql -U postgres -d postgres -c 'DROP DATABASE sales_archive;'。这里的 -c 是 psql 选项,而 DROP DATABASE 是 SQL 命令。请根据你的环境替换账户、连接选项和准确的目标名称。不同 shell 的引用规则可能不同,因此应将 SQL 保持为一个完整参数,并在运行前检查命令。
在命令行中使用 dropdb
dropdb 是独立的 PostgreSQL 命令行工具,不是在 psql 提示符中输入的命令。在可使用 PostgreSQL 客户端工具的终端中,运行 dropdb --username postgres --host localhost sales_archive。请根据服务器选择合适的连接选项;如果服务器要求密码,该工具可能会提示你输入。最后一个参数是目标数据库。
如果 shell 找不到 dropdb,请在 PostgreSQL 安装目录的 bin 目录中查找,或将该目录添加到 PATH。在 Windows 上,该目录通常位于 C:\Program Files\PostgreSQL\<version>\bin 下;实际安装版本和位置可能不同。不要仅为运行一条命令而更改无关的环境变量。
在 Python 脚本中调用 dropdb 时,应将参数作为列表传给进程 API,而不是拼接 shell 命令字符串。这个小示例只会构造并显示参数列表;它不会连接到 PostgreSQL,也不会删除任何内容。本文中的示例尚未执行。
本节中的代码以及显示的标签或输出仍为英文。
import json
command = ["dropdb", "--username", "postgres", "--host", "localhost", "sales_archive"]
print(json.dumps(command))
处理活动连接和常见错误
如果另一个会话正连接到目标数据库,PostgreSQL 可能会拒绝删除请求。客户端应用程序、后台作业或其他管理员仍在该数据库中建立会话时,也可能发生这种情况。请关闭或安全停止这些客户端,确认中断它们不会导致所需工作丢失,然后从连接到其他数据库的会话重试。
如果服务器报告数据库当前已打开,或由于存在连接而无法删除,请先确认哪些应用程序和用户持有这些会话。不要不加区分地终止会话,因为这可能中断事务或应用程序工作。如果你无法控制这些会话,请联系数据库管理员,协调安全关闭。强制断开连接的具体选项因 PostgreSQL 版本和配置而异;使用前请查阅你所管理服务器的文档。
其他错误可能表示数据库名称拼写错误或数据库不存在、权限不足、连接设置指向了错误的服务器,或你试图删除当前会话所使用的数据库。重试前,请重新核对服务器、用户、目标名称和错误文本;遇到含义不明的错误时,不要直接重启服务器。
验证结果并避免数据丢失
命令成功后,请重新连接到另一个数据库,或保持当前连接,然后在 psql 中运行 \l 查看数据库列表。确认预期的目标数据库已不存在,同时名称相近的数据库仍然存在。使用 dropdb 时,成功返回表示请求已完成;如果此次删除很重要,查看数据库列表还能提供一项独立确认。
无法通过另一条 SQL 命令撤销数据库删除。如果之后可能需要这些数据,请先创建并验证备份。DROP DATABASE 和 dropdb 都会执行破坏性操作;IF EXISTS 只用于处理指定数据库已不存在的情况,不能作为确认步骤或安全措施。