简介

随着数据库容量的增长,需要将数据库迁移到其它目录,本文将基于CentOS 7和PostgreSQL 10介绍具体操作方法

需求

环境准备:

  • CentOS 7 系统,以及具有sudo权限的非root用户
  • 已正常安装的 Postgresql 10

因涉及到多个目录和文件配置,这里提统一列出:

  • 旧数据库目录: /var/lib/pgsql/10/data/
  • 系统级配置文件目录: /etc/systemd/system/postgresql-10.service.d
  • 新数据库目录(示例): /data/postgresql-10/10/data

    步骤1: 移动数据库文件

    首先确认目前的数据库文件目录

    $ sudo -u postgres psql
    

    在pgsql中查询

    postgres=# SHOW data_directory;
    

    结果

         data_directory       
    ------------------------------
    /var/lib/pgsql/10/data
    (1 row)
    

    输入 \q 断开连接,并关闭数据库服务

    $ sudo systemctl stop postgresql
    $ sudo systemctl status postgresql
    

    确认关闭后开始迁移数据库,先确认旧目录的具体结构

    $ ls /var/lib/pgsql/10/data
    

    注意用rsync -av 在新旧目录之间同步数据库文件,-a 表示完整保留文件权限设置,-v 便于观察进度

    注意:确保 rsync 命令中新目录路径尾部没有反斜杠 /,特别是按tab使用自动补全可能会添加反斜杠。有无反斜杠的具体的区别详见参考3

创建新目录

$ mkdir /data/postgresql-10

有时候一台服务器上会有多种版本的postgresql,可以只移动指定版本对应的路径,也可以将原目录整体迁移,我这里选择整体迁移

$ sudo rsync -av /var/lib/postgresql /data/postgresql-10

复制完成后,先不要急着删除或移动旧的数据库文件,以防数据库不能正常启动

步骤2: 指定数据库新路径

修改新目录中的配置文件

$ vim /data/postgresql-10/10/data/postgresql.conf

修改 data_directory 的值为新数据目录:

data_directory = '/data/postgresql-10/10/data'

然后要修改系统中数据库服务的配置,你可以直接修改原始配置文件,但由于数据库升级时这个文件会可能会被覆盖导致问题,所以这里推荐用新建覆写配置文件的方法 先新建一个 .conf 后缀的文件,例如

$ cd /etc/systemd/system/postgresql-10.service.d
$ mkdir override.conf

编辑 override.conf 新增以下内容

[Service]
Environment=PGDATA=/data/postgresql-10/10/data

注意,这里修改的是操作系统级别的服务配置,而非数据库本身的配置文件

步骤3: 重启数据库服务

重新载入配置

$ systemctl daemon-reload

重启数据库,检查状态

$ systemctl restart postgresql-10
$ sudo systemctl status postgresql

确认数据库服务完全正常后,再处理旧目录中的文件

参考
  1. How To Move a PostgreSQL Data Directory to a New Location on Ubuntu 16.04
  2. CentOS7系统下PostgreSQL数据库数据目录指定与迁移
  3. rsync命令中的路径反斜杠