安装PG15
shell复制
yum install -y epel-release
yum install -y https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -qy remove postgresql*
yum install -y postgresql15 postgresql15-server
初始化数据库
shell复制
/usr/pgsql-15/bin/postgresql-15-setup initdb
修改配置文件(主数据库)
/var/lib/pgsql/15/data/postgresql.conf
shell复制
listen_addresses = '*'
timezone = 'Asia/Shanghai'
log_timezone = 'Asia/Shanghai'
# 以下是开启主从配置
wal_level = replica # 启用 WAL 日志记录以支持复制
max_wal_senders = 5 # 最大 WAL 发送器数
wal_keep_size = 64 # 保留 WAL 的最小大小(单位MB)
archive_mode = on # 启用归档模式
archive_command = 'cp %p /var/lib/pgsql/15/archive/%f' # 定义归档命令
/var/lib/pgsql/15/data/pg_hba.conf
shell复制
host all all 0.0.0.0/0 md5
# 允许从数据库访问
host replication all 从数据库IP/32 md5
创建归档目录(主数据库)
如果启用了归档模式,则需创建归档目录
shell复制
mkdir /var/lib/pgsql/15/archive
chown postgres:postgres /var/lib/pgsql/15/archive
chmod 700 /var/lib/pgsql/15/archive
开放防火墙
shell复制
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload
启动服务
shell复制
systemctl enable postgresql-15
systemctl start postgresql-15
创建复制用户(主数据库)
shell复制
sudo -i -u postgres psql
CREATE ROLE replica WITH REPLICATION LOGIN PASSWORD 'replica_password';
# 然后重启数据库
systemctl restart postgresql-15
创建用户和数据库(主数据库)
shell复制
# 切换到 PostgreSQL 用户
sudo -i -u postgres
# 创建数据库
createdb smxx
# 进入psql
psql
sql复制
-- 创建用户 smxx 并设置密码
CREATE USER smxx WITH PASSWORD 'mypassword';
-- 切换到 smxx 数据库
\c smxx;
-- 将数据库的所有权限授予用户 smxx
GRANT ALL PRIVILEGES ON DATABASE smxx TO smxx;
-- 授予 schema 的所有权限
GRANT ALL PRIVILEGES ON SCHEMA public TO smxx;
-- 确保 smxx 用户可以在 schema 中创建对象
GRANT CREATE, USAGE ON SCHEMA public TO smxx;
-- 授予当前数据库中所有现有表的所有权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO smxx;
-- 如果需要操作序列和函数,也可以授予权限
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO smxx;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO smxx;
-- 默认授予 smxx 对所有未来表的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO smxx;
-- 默认授予 smxx 对所有未来序列的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO smxx;
-- 默认授予 smxx 对所有未来函数的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON FUNCTIONS TO smxx;
从数据库配置(从数据库)
shell复制
# 停止从数据库服务
systemctl stop postgresql-15
# 清空从数据库数据目录
sudo rm -rf /var/lib/pgsql/15/data/*
# 使用 pg_basebackup 从主数据库同步数据
sudo -i -u postgres
pg_basebackup -h 主数据库IP -D /var/lib/pgsql/15/data -U replica -P -X stream
# 根据提示输入 replica_password
# 创建 standby.signal 文件
sudo -u postgres touch /var/lib/pgsql/15/data/standby.signal
sudo vi /var/lib/pgsql/15/data/postgresql.auto.conf
# 写入如下内容
primary_conninfo = 'host=主数据库IP port=5432 user=replica password=replica_password'
# 配置postgresql.conf
hot_standby = on
# 设置权限和重启 PostgreSQL
sudo chown -R postgres:postgres /var/lib/pgsql/15/data
sudo systemctl start postgresql-15
验证主从同步
shell复制
# 检查主服务器日志
sudo -u postgres psql -c "SELECT * FROM pg_stat_replication;"
# 查到一条数据说明有从数据库在连接中
# 检查从服务器状态
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
# 返回结果为 t 表示从服务器处于恢复模式
从数据库升级成主库
shell复制
# 停止数据库
systemctl stop postgresql-15
# 配置postgresql.conf(将 hot_standby 关闭)
hot_standby = off
# 删除标识为热备模式的文件
rm -rf /var/lib/pgsql/15/data/standby.signal
# 删掉 primary_conninfo
rm -rf /var/lib/pgsql/15/data/postgresql.auto.conf
# 启动数据库
systemctl start postgresql-15