如何在Ubuntu16.04上将PostgreSQL数据目录移动到新位置
介绍
数据库随着时间的推移而增长,有时会超过其原始文件系统上的空间。 当它们与操作系统的其余部分位于同一分区时,您也可能会遇到 I/O 争用。 RAID、网络块存储和其他设备可以提供冗余和其他理想的功能。 无论您是要添加更多空间、评估优化性能的方法,还是希望利用其他存储功能,本教程都将指导您重新定位 PostgreSQL 的数据目录。
先决条件
要完成本指南,您需要:
- 具有非 root 用户且具有 sudo 权限的 Ubuntu 16.04 服务器。 您可以在我们的 Initial Server Setup with Ubuntu 16.04 指南中了解有关如何设置具有这些权限的用户的更多信息。
- 一个 PostgreSQL 服务器。 如果您还没有设置,如何在 Ubuntu 16.04 上安装和使用 PostgreSQL 指南可以为您提供帮助。
在此示例中,我们将数据移动到安装在 /mnt/volume-nyc1-01
上的块存储设备。 如果您在 DigitalOcean 上使用块存储,本指南 可以帮助您在继续本教程之前安装卷。
无论您使用什么底层存储,以下步骤都可以帮助您将数据目录移动到新位置。
第 1 步 — 移动 PostgreSQL 数据目录
为了准备移动 PostgreSQL 的数据目录,让我们通过启动一个交互式 PostgreSQL 会话来验证当前位置。 在下面一行中,psql
是进入交互式监视器的命令,-u postgres
告诉 sudo 以系统的 postgres 用户执行 psql
:
sudo -u postgres psql
进入监视器后,选择数据目录:
SHOW data_directory;
Output data_directory ------------------------------ /var/lib/postgresql/9.5/main (1 row)
此输出确认 PostgreSQL 已配置为使用默认数据目录 /var/lib/postgresql/9.5/main
,因此这是我们需要移动的目录。 确认系统上的目录后,键入 \q
退出。
为了确保数据的完整性,我们将在实际更改数据目录之前关闭 PostgreSQL:
sudo systemctl stop postgresql
systemctl
不显示所有服务管理命令的结果。 要验证您是否成功,请使用以下命令:
sudo systemctl status postgresql
如果输出的最后一行告诉您服务器已停止,您可以确认它已关闭:
Output. . . Jul 22 16:22:44 ubuntu-512mb-nyc1-01 systemd[1]: Stopped PostgreSQL RDBMS.
现在服务器已关闭,我们将使用 rsync
将现有数据库目录复制到新位置。 使用 -a
标志保留权限和其他目录属性,而 -v
提供详细输出,以便您可以跟踪进度。
注意: 确保目录后面没有斜杠,如果使用制表符补全,可能会添加斜杠。 当有斜杠时,rsync
会将目录的内容转储到挂载点,而不是将其传输到包含 PostgreSQL
的目录中:
我们将从 postgresql
目录启动 rsync
,以便在我们的新位置模仿原始目录结构。 通过在挂载点目录中创建 postgresql
目录并保留 PostgreSQL 用户的所有权,我们可以避免未来升级的权限问题。 版本目录 9.5
不是绝对必要的,因为我们已经在 postgresql.conf
文件中明确定义了位置,但是遵循项目约定肯定不会有什么坏处,特别是如果需要未来运行多个版本的 PostgreSQL。
sudo rsync -av /var/lib/postgresql /mnt/volume-nyc1-01
复制完成后,我们将使用 .bak 扩展名重命名当前文件夹并保留它,直到我们确认移动成功。 通过重新命名它,我们将避免新旧位置的文件可能引起的混淆:
sudo mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main.bak
现在我们准备将注意力转向配置。
第 2 步 — 指向新的数据位置
PostgreSQL 有几种方法可以覆盖配置值。 默认情况下,/etc/postgresql/9.5/main/postgresql.conf
文件中的 data_directory
设置为 /var/lib/postgresql/9.5/main
。 编辑此文件以反映新的数据目录:
sudo nano /etc/postgresql/9.5/main/postgresql.conf
找到以 data_directory
开头的行并更改后面的路径以反映新位置。
在我们的例子中,更新后的文件如下所示:
/etc/postgresql/9.5/main/postgresql.conf
. . . data_directory = '/mnt/volume-nyc1-01/postgresql/9.5/main' . . .
第三步——重启 PostgreSQL
我们已准备好启动 PostgreSQL。
sudo systemctl start postgresql sudo systemctl status postgresql
要确保新数据目录确实在使用中,请启动 PostgreSQL 监视器。
sudo -u postgres psql
再次查看数据目录的值:
SHOW data_directory;
Output data_directory ----------------------------------------- /mnt/volume-nyc1-01/postgresql/9.5/main (1 row)
现在您已重新启动 PostgreSQL 并确认它正在使用新位置,请借此机会确保您的数据库功能齐全。 验证任何现有数据的完整性后,您可以删除备份数据目录:
sudo rm -Rf /var/lib/postgresql/9.5/main.bak
最后一次重新启动 PostgreSQL 以确保它按预期工作:
sudo systemctl restart postgresql sudo systemctl status postgresql
结论:
如果您按照此操作,您的数据库应该在其新位置的数据目录中运行,并且您已经完成了能够扩展存储的重要步骤。 您可能还想查看 5 Common Server Setups For Your Web Application,了解如何创建服务器基础架构以帮助您扩展和优化 Web 应用程序。