删除 PostgreSQL 数据库的深入指南

作为一名经验丰富的数据库管理员,我帮助过许多公司管理他们的 PostgreSQL 数据库。需要格外小心的一项操作是使用以下命令永久删除(删除)数据库:DROP DATABASE命令。该命令使用不当可能会导致不可恢复的数据丢失,因此在使用它之前了解它的工作原理至关重要。

DROP DATABASEPostgreSQL 中的语句不仅仅从 SQL 目录中删除数据库。以下是幕后实际发生的情况:

  • 数据库目录条目被删除,以便 PostgreSQL 不再认为它是有效的数据库
  • 磁盘上的数据库系统数据目录被删除——这会递归删除所有包含表数据、索引等的文件。
  • 删除与数据库相关的访问权限和设置
  • 与正在删除的数据库的活动连接被终止

一次DROP DATABASE完成后,恢复数据几乎是不可能的。这些文件与文件系统取消链接,因此它们可能会被新数据覆盖。

如你看到的,DROP DATABASE具有破坏性和最终性。意外地针对生产数据库运行它将是灾难性的。接下来我们就来看看如何正确使用DROP DATABASE

在 PostgreSQL 中安全删除数据库

根据我管理数百台 PostgreSQL 服务器的经验,以下是我的最佳实践DROP DATABASE:

始终使用 IF EXISTS

强烈地推荐使用IF EXISTS选项,如果数据库已经消失,这将防止错误:

DROP DATABASE IF EXISTS mydb;

没有IF EXISTS,如果有人已经手动删除了数据库文件,您可能会遇到令人困惑的错误。

限制访问

DROP DATABASE仅受过专门培训的高级 DBA 享有此特权。将其视为具有破坏性的删除原始磁盘分区 - 潜在的损坏是严重的!

根据经验,应用程序开发人员和初级 DBA 不应具有访问权限。

首先在开发环境中进行测试

切勿在生产环境中首次直接删除数据库。首先在反映生产的开发或暂存环境中对其进行测试。检查数据库是否已按预期完全删除。

这使您可以捕获可能导致DROP DATABASE到一半就失败了。

删除前备份

在尝试删除数据库之前,始终要有可靠的备份计划:

  • 在删除之前进行最终完整备份
  • 确保您拥有 2-4 周前的可用备份
  • 验证备份是否可以成功恢复

备份是您的保险政策,以防出现问题或业务需要恢复数据!

PostgreSQL数据库删除操作的时序

当你执行DROP DATABASE,需要多长时间才能完成?这取决于要删除的数据库的大小:

数据库大小 大约。删除时间
100GB 2-3分钟
500GB 10-12分钟
1TB 25-30分钟

如您所见,大型数据库删除可能需要一些时间。 PostgreSQL 引擎必须递归遍历并取消链接与该数据库相关的每个数据文件和子目录。

如果您的连接在此序列期间断开,则删除操作应在后台继续进行,直至完成。但是,最好在操作系统级别监视数据库大小。DROP DATABASE以确保其完全完成。

现在我们已经介绍了最佳实践,让我们看一下实际删除数据库的示例。

通过 Shell 删除 PostgreSQL 数据库

您可以通过命令行 SQL shell (psql) 删除 PostgreSQL 中的数据库:

步骤1)连接到与您要删除的数据库不同的数据库:

$ psql -d postgres

步骤2)跑步DROP DATABASE:

postgres=# DROP DATABASE mydb;

步骤3)通过列出数据库来验证它是否已消失\l:

postgres=# \l
                                 List of databases
   Name   |  Owner   | Encoding | Collation | Ctype | Access privileges
----------+----------+----------+------------+-------+-------------------
 postgres | postgres | UTF8     | C         | C     | 
 template0 | postgres | UTF8     | C         | C     | =c/postgres        
         |          |          |            |       | postgres=CTc/postgres 
 template1 | postgres | UTF8     | C         | C     | =c/postgres        
         |          |          |            |       | postgres=CTc/postgres
(3 rows)  

这涵盖了使用基本的psql删除数据库。但是,如果您想删除远程 PostgreSQL 服务器上运行的数据库该怎么办?继续阅读!

使用 dropdb 远程删除 PostgreSQL 数据库

dropdb命令允许从任何可以通过网络到达 PostgreSQL 服务器的位置安全地删除数据库:

dropdb -h host -p port -U user database_name

让我们看一个例子:

$ dropdb -h dbserver.company.com -p 5432 -U postgres mydb
Password for user postgres: *****

Are you sure you want to drop database "mydb" []? y

这将从运行于以下位置的 PostgreSQL 服务器中删除“mydb”数据库:dbserver.company.com在端口 5432 上。

-iflag 预先确认删除,无需额外提示:

$ dropdb -h 192.168.1.55 -i -p 5000 archivetest

比删除生产服务器上的数据安全得多!

这涵盖了基础知识——让我们快速回顾一下。

概括

正如我们在本指南中所讨论的,DROP DATABASE语句完全删除 PostgreSQL 数据库:

  • 它删除所有目录元数据并递归删除数据目录
  • 恢复删除的数据库通常是不可能的
  • 使用安全检查,例如IF EXISTS并限制出入以防止发生事故
  • 未经测试,切勿首次删除生产数据库
  • 删除时间取决于数据库总大小
  • 您可以使用以下命令远程删除数据库dropdb管理工具

我希望这些提示有助于解释如何谨慎使用DROP DATABASE。如有任何其他 PostgreSQL 问题,请联系我们!