在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录
在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录,需遵循以下步骤。假设原数据目录为“/var/lib/pgsql/12/data”,目标目录为“/new/path/pgdata”。
1、步骤概览
- 停止PostgreSQL服务
- 创建新目录并设置权限
- 复制数据文件(保留权限)
- 修改配置文件指向新目录
- 启动服务并验证
2、详细操作
2.1、创建目标目录并设置权限
sudo mkdir -p /new/path/pgdata
sudo chown -R postgres:postgres /new/path/pgdata # 确保属主正确
sudo chmod 700 /new/path/pgdata # 安全权限
2.2、初始化PostgreSQL数据库到自定义目录(如果尚未初始化)
“-D /data/pgsql”这条命令的含义是:指定PostgreSQL数据库的数据存储目录(该目录用于存放所有数据库的相关数据)
sudo -u postgres initdb -D /data/pgsql
2.3、停止PostgreSQL服务
sudo systemctl stop postgresql
2.4、复制数据文件(保留权限)
sudo rsync -av /var/lib/pgsql/data/ /new/path/pgdata/
- -av:保留权限、属主等属性并显示进度
- 源目录末尾的“/”:确保复制内容而非目录本身
2.5、修改PostgreSQL配置
2.5.1、编辑服务单元文件
sudo vi /usr/lib/systemd/system/postgresql.service
找到“Environment=PGDATA=…”行,修改为:
Environment=PGDATA=/new/path/pgdata
2.5.2、重载systemd配置
sudo systemctl daemon-reload
2.6、启动服务并验证
sudo systemctl start postgresql # 启动PostgreSQL
sudo systemctl status postgresql # 检查PostgreSQL状态
2.7、验证数据目录
sudo -u postgres psql -c "SHOW data_directory;" # 应输出:“/new/path/pgdata”# 查看存储每个数据库的唯一数字标识符(OID)和系统表,包含所有数据库的元数据
sudo -u postgres psql -c "SELECT oid, datname FROM pg_database;"
3、故障排查
- 权限问题:确保“/new/path/pgdata”属主为“postgres”且权限为“700”
- SELinux 错误:检查日志“/var/log/audit/audit.log”,临时测试可“setenforce 0”(生产环境不推荐)
- 服务启动失败:查看日志“journalctl -u postgresql -xe”
- 路径错误:确认“postgresql.service”中的“PGDATA”路径正确
4、注意事项
- 备份优先:操作前务必备份数据(“pg_dumpall”或文件级备份)
- 磁盘空间:确保目标目录有足够空间
- 路径一致性:自定义路径需永久挂载(避免重启后丢失)
完成迁移后,可删除原数据目录释放空间(确认服务运行正常后):
sudo rm -rf /var/lib/pgsql/12/data.old