CentOS系统下迁移PostgreSQL 9.2.18数据目录问题求助
你遇到的问题其实很典型——迁移数据目录后服务启动失败,核心原因基本是权限不足或者SELinux限制,毕竟PostgreSQL默认用postgres系统用户运行,而个人主目录的权限设置和SELinux上下文都不兼容默认的PostgreSQL运行环境。下面是一步步的解决流程:
1. 先确认基础信息
首先停掉当前运行的PostgreSQL服务(如果还能启动的话):
service postgresql stop
然后查看默认的data_directory路径(可以在服务正常时用命令查,或者直接找配置文件):
psql -U postgres -c "show data_directory;"
默认路径一般是/var/lib/pgsql/9.2/data/,同时确认PostgreSQL的运行用户:
ps aux | grep postgres
你会看到进程都是以postgres用户运行的,这很关键。
2. 完整迁移数据目录
假设你的个人主目录是/home/yourname,要把数据目录迁到/home/yourname/pg_data:
- 用
cp命令完整复制(保留所有权限和文件属性):
cp -a /var/lib/pgsql/9.2/data /home/yourname/pg_data
- 或者用
rsync更稳妥(适合大目录,能断点续传):
rsync -av /var/lib/pgsql/9.2/data/ /home/yourname/pg_data/
3. 修复目录权限
这是最容易踩的坑:个人主目录默认权限是700,只有你自己能访问,postgres用户根本进不去。
- 先给你的主目录加一个其他用户可进入的权限:
chmod o+x /home/yourname
- 然后把新数据目录的所有者改成
postgres用户和组:
chown -R postgres:postgres /home/yourname/pg_data
4. 处理SELinux限制(CentOS必做)
CentOS默认开启SELinux,它会阻止postgres用户访问非默认路径的目录,必须设置正确的SELinux上下文:
- 先确认SELinux状态:
getenforce
如果输出是Enforcing,就继续下面的操作:
- 给新数据目录添加PostgreSQL专属的SELinux上下文:
semanage fcontext -a -t postgresql_db_t "/home/yourname/pg_data(/.*)?"
- 应用上下文到目录:
restorecon -Rv /home/yourname/pg_data
如果你只是做个人测试嫌麻烦,可以临时关闭SELinux(不推荐长期使用):
setenforce 0,重启后会恢复,长期关闭需要修改/etc/selinux/config文件。
5. 修改PostgreSQL配置
编辑postgresql.conf文件(默认路径是/var/lib/pgsql/9.2/data/postgresql.conf,或者你可以在新目录里编辑),找到data_directory项,改成绝对路径:
data_directory = '/home/yourname/pg_data'
注意:必须写绝对路径,不能用
~/pg_data,因为~代表的是postgres用户的家目录,不是你的主目录。
如果你的系统用systemd管理服务(CentOS 7及以上),还要检查服务配置文件:
vi /usr/lib/systemd/system/postgresql-9.2.service
找到Environment=PGDATA=...这一行,改成新的路径,然后重载systemd:
systemctl daemon-reload
6. 验证启动
现在尝试启动服务:
# CentOS 6 service postgresql start # CentOS 7+ systemctl start postgresql-9.2
查看服务状态:
# CentOS 6 service postgresql status # CentOS 7+ systemctl status postgresql-9.2
如果启动成功,登录数据库验证路径是否正确:
psql -U postgres
然后执行:
show data_directory;
输出应该是你设置的新路径,就说明迁移成功了。
常见坑提醒
- 复制数据时必须用
cp -a或rsync -av,否则文件权限、属性会丢失,导致数据库损坏。 - 绝对不能直接修改
data_directory后就启动,必须先处理权限和SELinux。 - 如果还是启动失败,可以查看日志文件(默认在
/var/lib/pgsql/9.2/pg_log/或者新目录的pg_log下),日志会明确告诉你是权限问题还是SELinux问题,方便排查。
内容的提问来源于stack exchange,提问作者Mayak

