如何在Ubuntu18.04上将PostgreSQL数据目录移动到新位置

来自菜鸟教程
跳转至:导航、​搜索

介绍

数据库随着时间的推移而增长,有时会超过其原始文件系统上的空间。 当它们与操作系统的其余部分位于同一分区时,这也可能导致 I/O 争用。

RAID、网络块存储和其他设备可以提供冗余并提高可扩展性,以及其他理想的功能。 无论您是要添加更多空间、评估优化性能的方法,还是希望利用其他存储功能,本教程都将指导您重新定位 PostgreSQL 的数据目录。

先决条件

要完成本指南,您需要:

  • 具有 sudo 权限的非 root 用户的 Ubuntu 18.04 服务器。 您可以在我们的 Initial Server Setup with Ubuntu 18.04 指南中了解有关如何设置具有这些权限的用户的更多信息。
  • PostgreSQL 安装在您的服务器上。 如果您还没有设置,如何在 Ubuntu 18.04 上安装和使用 PostgreSQL 指南可以为您提供帮助。

在此示例中,我们将数据移动到安装在 /mnt/volume_nyc1_01 上的块存储设备。 如果您在 DigitalOcean 上使用块存储,本指南 可以帮助您在继续本教程之前安装卷。

但是,无论您使用什么底层存储,以下步骤都可以帮助您将数据目录移动到新位置。

第 1 步 — 移动 PostgreSQL 数据目录

在我们开始移动 PostgreSQL 的数据目录之前,让我们通过启动一个交互式 PostgreSQL 会话来验证当前位置。 在下面的命令中,psql是进入交互监视器的命令,-u postgres告诉sudo执行psql作为系统的postgres[X163X ] 用户:

sudo -u postgres psql

打开 PostgreSQL 提示后,使用以下命令显示当前数据目录:

SHOW data_directory;
Output       data_directory       
------------------------------
/var/lib/postgresql/10/main
(1 row)

此输出确认 PostgreSQL 已配置为使用默认数据目录 /var/lib/postgresql/10/main,因此这是我们需要移动的目录。 确认系统上的目录后,键入 \q 并按 ENTER 关闭 PostgreSQL 提示符。

为确保数据的完整性,请在实际更改数据目录之前停止 PostgreSQL:

sudo systemctl stop postgresql

systemctl 不显示所有服务管理命令的结果。 要验证您是否已成功停止服务,请使用以下命令:

sudo systemctl status postgresql

输出的最后一行应该告诉您 PostgreSQL 已停止:

Output. . .
Jul 12 15:22:44 ubuntu-512mb-nyc1-01 systemd[1]: Stopped PostgreSQL RDBMS.

现在 PostgreSQL 服务器已关闭,我们将使用 rsync 将现有数据库目录复制到新位置。 使用 -a 标志保留权限和其他目录属性,而 -v 提供详细输出,以便您可以跟踪进度。 我们将从 postgresql 目录启动 rsync,以便在新位置模仿原始目录结构。 通过在挂载点目录中创建 postgresql 目录并保留 PostgreSQL 用户的所有权,我们可以避免未来升级的权限问题。

注意: 确保目录后面没有斜杠,如果使用制表符补全,可能会添加斜杠。 如果您确实包含尾部斜杠,rsync 会将目录的内容转储到安装点,而不是复制目录本身。


版本目录 10 不是绝对必要的,因为我们已经在 postgresql.conf 文件中明确定义了位置,但遵循项目约定肯定不会有什么坏处,尤其是在需要时将来运行多个版本的 PostgreSQL:

sudo rsync -av /var/lib/postgresql /mnt/volume_nyc1_01

复制完成后,我们将使用 .bak 扩展名重命名当前文件夹并保留它,直到我们确认移动成功。 这将有助于避免在新旧位置都有类似名称的目录可能引起的混淆:

sudo mv /var/lib/postgresql/10/main /var/lib/postgresql/10/main.bak

现在我们准备好配置 PostgreSQL 以访问其新位置的数据目录。

第 2 步 — 指向新的数据位置

默认情况下,/etc/postgresql/10/main/postgresql.conf 文件中的 data_directory 设置为 /var/lib/postgresql/10/main。 编辑此文件以反映新的数据目录:

sudo nano /etc/postgresql/10/main/postgresql.conf

找到以 data_directory 开头的行并更改后面的路径以反映新位置。 在本教程的上下文中,更新后的指令将如下所示:

/etc/postgresql/10/main/postgresql.conf

. . .
data_directory = '/mnt/volume_nyc1_01/postgresql/10/main'
. . .

CTRL + XY,然后按 ENTER 保存并关闭文件。 这就是配置 PostgreSQL 以使用新的数据目录位置所需要做的一切。 此时剩下的就是再次启动 PostgreSQL 服务并检查它是否确实指向正确的数据目录。

第三步——重启 PostgreSQL

更改 postgresql.conf 文件中的 data-directory 指令后,继续使用 systemctl 启动 PostgreSQL 服务器:

sudo systemctl start postgresql

要确认 PostgreSQL 服务器已成功启动,请再次使用 systemctl 检查其状态:

sudo systemctl status postgresql

如果服务正确启动,您将在此命令的输出末尾看到以下行:

Output. . .
Jul 12 15:45:01  ubuntu-512mb-nyc1-01[1]: Started PostgreSQL RDBMS.
. . .

最后,要确保新数据目录确实在使用中,请打开 PostgreSQL 命令提示符。

sudo -u postgres psql

再次检查数据目录的值:

SHOW data_directory;
Output            data_directory
-----------------------------------------
/mnt/volume_nyc1_01/postgresql/10/main
(1 row)

这确认 PostgreSQL 正在使用新的数据目录位置。 在此之后,花点时间确保您能够访问数据库并与其中的数据进行交互。 验证任何现有数据的完整性后,您可以删除备份数据目录:

sudo rm -Rf /var/lib/postgresql/10/main.bak

至此,您已成功将 PostgreSQL 数据目录移动到新位置。

结论:

如果您按照此操作,您的数据库应该在其新位置的数据目录中运行,并且您已经完成了能够扩展存储的重要步骤。 您可能还想查看 5 Common Server Setups For Your Web Application,了解如何创建服务器基础架构以帮助您扩展和优化 Web 应用程序。