更改 PostgreSQL 的数据存储位置

更改 PostgreSQL 的数据存储位置,需要移动整个数据目录并修改相关配置。以下是完整步骤:

1. 停止 PostgreSQL 服务

bash 复制代码
# 使用 systemctl(如果已配置)
systemctl stop postgresql-15

# 或直接使用 postmaster
kill -INT $(head -1 /var/lib/pgsql/15/data/postmaster.pid)

# 或使用 pg_ctl
/usr/pgsql-15/bin/pg_ctl stop -D /var/lib/pgsql/15/data/

2. 创建新数据目录

bash 复制代码
# 例如移动到 /data/pgsql 目录
NEW_DATA_DIR="/data/pgsql/15/data"

# 创建新目录
mkdir -p "$NEW_DATA_DIR"

# 设置正确的权限(postgres 用户)
chown -R postgres:postgres "$NEW_DATA_DIR"
chmod 700 "$NEW_DATA_DIR"

3. 复制(或移动)数据文件

bash 复制代码
# 方法1:移动数据(推荐,更快)
mv /var/lib/pgsql/15/data/* "$NEW_DATA_DIR/"

# 方法2:复制数据(保留原数据)
cp -rp /var/lib/pgsql/15/data/* "$NEW_DATA_DIR/"

4. 修改配置文件

方法A:修改 postgresql.conf

bash 复制代码
# 编辑配置文件
vi "$NEW_DATA_DIR/postgresql.conf"

# 修改或添加以下行
data_directory = '/data/pgsql/15/data'

方法B:使用软链接(不修改配置文件)

bash 复制代码
# 备份原目录
mv /var/lib/pgsql/15/data /var/lib/pgsql/15/data_old

# 创建软链接
ln -s /data/pgsql/15/data /var/lib/pgsql/15/data

# 确保权限正确
chown -R postgres:postgres /var/lib/pgsql/15/data

5. 启动 PostgreSQL

bash 复制代码
# 使用 systemctl
systemctl start postgresql-15

# 或直接启动
/usr/pgsql-15/bin/postmaster -D "$NEW_DATA_DIR" &

# 或使用 pg_ctl
/usr/pgsql-15/bin/pg_ctl start -D "$NEW_DATA_DIR"

6. 验证

bash 复制代码
# 检查数据目录
/usr/pgsql-15/bin/psql -h localhost -p 30004 -U postgres -c "SHOW data_directory;"

# 查看当前配置
/usr/pgsql-15/bin/psql -h localhost -p 30004 -U postgres -c "SELECT * FROM pg_settings WHERE name LIKE '%data_directory%';"

7. 更新 systemd 服务文件(如果使用 systemctl)

bash 复制代码
# 编辑服务文件
vi /etc/systemd/system/postgresql-15.service

# 或编辑 override 文件
mkdir -p /etc/systemd/system/postgresql-15.service.d
cat > /etc/systemd/system/postgresql-15.service.d/override.conf << EOF
[Service]
Environment=PGDATA=/data/pgsql/15/data
EOF

# 重新加载 systemd
systemctl daemon-reload

完整脚本示例

bash 复制代码
#!/bin/bash

# 配置
OLD_DATA="/var/lib/pgsql/15/data"
NEW_DATA="/data/pgsql/15/data"
PG_VERSION="15"
PG_USER="postgres"

# 1. 停止 PostgreSQL
echo "停止 PostgreSQL..."
/usr/pgsql-15/bin/pg_ctl stop -D "$OLD_DATA" -m fast

# 2. 创建新目录
echo "创建新数据目录..."
mkdir -p "$NEW_DATA"
chown -R $PG_USER:$PG_USER "$NEW_DATA"
chmod 700 "$NEW_DATA"

# 3. 移动数据
echo "迁移数据文件..."
rsync -av --progress "$OLD_DATA/" "$NEW_DATA/"
# 验证后可以删除原数据
# rm -rf "$OLD_DATA"

# 4. 更新配置
echo "更新配置文件..."
sed -i "s|data_directory = .*|data_directory = '$NEW_DATA'|" "$NEW_DATA/postgresql.conf"

# 5. 启动 PostgreSQL
echo "启动 PostgreSQL..."
/usr/pgsql-15/bin/pg_ctl start -D "$NEW_DATA"

# 6. 验证
echo "验证数据目录..."
/usr/pgsql-15/bin/psql -h localhost -p 30004 -U postgres -c "SHOW data_directory;"

echo "迁移完成!"

注意事项

  1. 磁盘空间:确保目标目录有足够的磁盘空间

  2. 权限 :数据目录必须属于 postgres 用户

  3. SELinux :如果启用,需要设置正确的 SELinux 上下文

    bash 复制代码
    semanage fcontext -a -t postgresql_db_t "/data/pgsql(/.*)?"
    restorecon -Rv /data/pgsql
  4. 防火墙:如果修改了端口,需要更新防火墙规则

检查当前数据目录

bash 复制代码
# 方法1:通过 SQL
/usr/pgsql-15/bin/psql -h localhost -p 30004 -U postgres -c "SHOW data_directory;"

# 方法2:查看进程
ps aux | grep postmaster | grep -E "\-D"

# 方法3:查看配置文件
grep data_directory /var/lib/pgsql/15/data/postgresql.conf