Skip to main content

如何在22.04版本的Ubuntu中将PostgreSQL数据挪至新位置

作者:Melissa Anderson,Mark Drake,Jeanelle Horcasitas

导语

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

RAID,网络模块存储以及一些其它设备可以提高可扩展性,并提供冗余以及其它理想功能。本教程将介绍如何将PostgreSQL的数据移至其它位置,无论您想要添加更多空间,还是想优化性能,亦或是希望利用其它存储功能,本教程都能提供帮助。

前期准备

本教程需要:

  • 22.04版本的Ubuntu服务器,非root用户但有 sudo 权限。
  • 服务器中安装了PostgreSQL

本教程中的示例会将数据移动到安装在 /mnt/volume_nyc1_01 目录下的存储设备上。但无论您使用什么存储设备,以下步骤都可以帮助您将数据目录移动到新位置。

第一步:移动PostgreSQL数据目录

在移动PostgreSQL数据目录前,需要先开启一个交互式PostgreSQL界面来验证当前的位置。在以下命令中,psql 是输入控制器的实际命令,-u postgres 则会指挥 sudo 以系统的postgres用户身份执行 psql 命令。

 $ sudo -u postgres psql

当PostgreSQL提示符出现后,使用以下命令查看当前的数据目录:

 postgres=# SHOW data_directory;

Output

       data_directory
-----------------------------
/var/lib/postgresql/14/main
(1 row)

这个输出表明,目前PostgreSQL使用的是默认数据路径 /var/lib/postgresql/14/main,而这就是需要移动的路径。当在系统内确认完毕后,可以用元命令 \q 关闭 psql 提示符:

 postgres=# \q

为了保证数据的完整性,在改变数据路径前需关闭PostgreSQL:

 $ sudo systemctl stop postgresql

systemctl 不会显示所有服务管理命令的结果,为了验证是否成功关闭了PostgreSQL,需使用以下命令:

 $ sudo sudo systemctl status postgresql

该命令的输出应该显示PostgreSQL已经 inactive (dead) ,表明它已经停止:

Output

○ postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor>
Active: inactive (dead) since Thu 2022-06-30 18:46:35 UTC; 27s ago
Process: 4588 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 4588 (code=exited, status=0/SUCCESS)
CPU: 1ms

现在PostgreSQL已不再运行,可以使用 rsync 命令将现有数据库路径复制到新位置。 -a 标记用于保留权限及其它目录属性,-v 标记则用于提供详细输出,以便追踪进度。下一步需要从 postgresql 路径下启动 rsync,以便在新位置模仿原目录结构。通过在挂载点目录中创建 postgresql 路径并保留PostgreSQL用户所有权,可以避免未来升级的权限问题。

注:请确保路径中没有尾部斜杠。使用TAB补全时可能会出现尾部斜杠。而如果出现了,rsync 会将路径下的类容储存到挂载点,而不是复制路径本身。

目录版本 14 并不是必要的,因为已经在 postgresql.conf 文件中明确定义了位置。但遵循规定也没有坏处,还能为将来运行不同版本的PostgreSQL做准备:

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

复制完成后,在现在文件夹的名字后加一个 .bak,并保留到确认移动成功后。这可以避免因新旧路径下有类似名称目录而产生的困惑:

 $ sudo mv /var/lib/postgresql/14/main /var/lib/postgresql/14/main.bak

第二步:指向新位置

默认情况下,data_directory 配置指令在 /etc/postgresql/14/main/postgresql.conf 文件中会设置为 /var/lib/postgresql/14/main。需要修改文件,让它指向新位置:

 $ sudo nano /etc/postgresql/14/main/postgresql.conf

找到由 data_directory 开始的一行,将后面的路径改为新的。在这个例子中,更新过后的路径应为:

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

CTRL + X 键,Y 键,然后按 ENTER 即可保存并关闭文件。现在已经完成将PostgreSQL配置到新路径,只需重启PostgreSQL服务并检查它是否指向了正确的数据目录。

第三步:重启PostgreSQL

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

 $ sudo systemctl start postgresql

为确认服务器是否成功启动,再次用 systemctl 命令检查服务器状态:

 $ sudo systemctl status postgresql

如果服务器成功启动,指令输出中的 Active 行会显示 active (exited)

Output

● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor>
Active: active (exited) since Thu 2022-06-30 18:50:18 UTC; 3s ago
Process: 4852 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 4852 (code=exited, status=0/SUCCESS)
CPU: 1ms

最后,为了确认新的路径已经投入使用,打开PostgreSQL命令提示符:

 $ sudo -u postgres psql

再次检查数据目录:

 postgres=# SHOW data_directory;

Output

             data_directory
----------------------------------------
/mnt/volume_nyc1_01/postgresql/14/main
(1 row)

这个输出确认了PostgreSQL正在使用新的数据路径。在此之后,还需花点时间确保能访问数据库并于其中的数据交互。验证现有数据完整性后,可以删除备份的数据目录:

 $ sudo rm -Rf /var/lib/postgresql/14/main.bak

由此,PostgreSQL数据目录已经移到了新位置。

结语

如果跟随本教程完成了所有步骤,数据库应该已经能在新路径下运行,并且您已完成了能扩展存储的重要步骤。