OpenEuler 安装 PostgreSQL
!
警告:这篇文章创作时长大于 730 天,其内容可能已经过时。
下载
因 PostgreSQL 并未对 OpenEuler 发行版发布打包安装版本,需要下载源码进行编译安装,其他 Linux 发行版如果有打包版,可以自行下载安装。
手动下载
PostgreSQL v13.9 源码下载地址:postgresql-13.9.tar.gz
命令下载
使用 root 进行,在使用 ssh 登录后,默认在 root 用户的根目录,可以创建一个 tools 目录,将下载的源码包放置在该目录下,命令如下:
0
1
2
|
mkdir tools
cd tools
wget https://ftp.postgresql.org/pub/source/v13.9/postgresql-13.9.tar.gz
|
PS:如果是手动下载的源码包,则需要手动放到 tools 目录下
安装依赖工具包
make
一般系统会预装 make,无需手动安装,检查当前系统 make 版本:
gcc
一般系统也会预装 gcc,查看版本:
tar
tar 为解压软件,系统已内置,无需安装;
readline
Readline 库:它允许 psql 记住你输入的每个命令,这样就可以通过上下方向键快速输入之前的命令,默认开启,也可以通过编译参数 --without-readline 来禁止它,建议保留默认。
readline 库系统已经内置,但 OpenEuler 安装 PostgreSQL 还要安装 readline-devel 库。
安装:
0
|
dnf install readline-devel # 或:yum install readline-devel
|
zlib
zlib 为默认的压缩库,同 readline,zlib 系统已默认内置,但需要额外安装 zlib-devel 库。
安装:
0
|
dnf install zlib-devel # 或:yum install zlib-devel
|
编译安装
解压源码包
在 tools 目录下,通过 tar 工具解压源码包到当前目录下:
0
|
tar -xvf postgresql-13.9.tar.gz
|
解压后在当前 tools 下生成一个 postgresql-13.9 的目录。
编译
切换目录
configure 文件是一个可执行的脚本文件,它有很多选项,在待安装的源码目录下使用命令 ./configure –help 可以输出详细的选项列表。
其中 --prefix 选项是配置安装目录,如果不配置该选项,安装后可执行文件默认放在 /usr/local/bin,库文件默认放在 /usr/local/lib,配置文件默认放在 /usr/local/etc,其它 的资源文件放在 /usr/local/share,比较凌乱。如果配置了 --prefix,如: ./configure --prefix=/usr/local/test 安装后的所有资源文件都会被放在 /usr/local/test 目录中,不会分散到其他目录。
这里我们配置的路径为:/opt/pgsql13/postgresql-data
0
|
./configure --prefix=/opt/pgsql13/postgresql-data
|
使用 make 编译
输入 make 后回车,编译过程耗时较长,请耐心等待编译结束:
编译过程未出现 Error 错误字样,代表编译正常结束。
安装
使用 make 安装
安装过程未出现 Error 错误字样,代表编译正常结束。
初始化
创建数据库用户
创建 postgres 用户和用户组,默认密码随机:
创建数据目录
0
|
mkdir -p /opt/pgsql13/postgresql-data/data
|
修改用户组
0
|
chown postgres /opt/pgsql13/postgresql-data/data
|
切换数据库用户
初始化数据库
0
|
/opt/pgsql13/postgresql-data/bin/initdb -D /opt/pgsql13/postgresql-data/data
|
启动数据库
0
|
/opt/pgsql13/postgresql-data/bin/pg_ctl -D /opt/pgsql13/postgresql-data/data -l logfile start
|
创建 test 数据库
0
|
/opt/pgsql13/postgresql-data/bin/createdb test
|
连接 test 数据库
0
|
/opt/pgsql13/postgresql-data/bin/psql test
|
出现 test=# 代表已经成功连接 test 数据库,可以进行相关 SQL 操作了。
至此,PostgreSQL 数据库安装成功。
配置
远程连接
切换到 data 目录
0
|
cd /opt/pgsql13/postgresql-data/data
|
base 目录是表空间目录,global 目录是相关全局变量目录, pg_hba.conf 是访问控制配置文件,postgresql.conf 是 PostgreSQL 主配置文件。我们需要修改的配置文件为 pg_hba.conf 和 postgresql.conf 文件。
接下来以 postgres 用户操作
修改 pg_hba.conf
将以下行:
0
|
host all all 127.0.0.1/32 trust
|
修改为:
0
|
host all all 0.0.0.0/0 md5
|
保存退出:
修改 postgresql.conf
将以下行:
0
|
#listen_address = 'localhost'
|
修改为:
保存退出:
防火墙对数据库端口放行
0
1
2
3
4
5
6
7
8
|
# 退出postgres账号
exit
##以下命令在root账户下执行
# 配置防火墙放行5432端口
sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent
# 防火墙重新加载配置文件
sudo firewall-cmd --reload
|
配置日志
切换到 postgres 用户
停止 PostgreSQL 数据库服务
0
|
/opt/pgsql13/postgresql-data/bin/pg_ctl -D /opt/pgsql13/postgresql-data/data -l logfile stop
|
创建日志相关文件
0
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#退出postgres用户,返回root用户
exit
# 对postgresql-data目录更改用户组为postgres
chown postgres /opt/pgsql13/postgresql-data
# 切换到postgres用户
su - postgres
# 创建日志目录
mkdir /opt/pgsql13/postgresql-data/log
# 创建日志文件
touch /opt/pgsql13/postgresql-data/log/server.log
|
指定日志文件的方式启动 PostgreSQL 数据库
0
|
/opt/pgsql13/postgresql-data/bin/pg_ctl -D /opt/pgsql13/postgresql-data/data -l /opt/pgsql13/postgresql-data/log/server.log start
|
用户名与密码
修改数据库用户 postgres 的默认密码后才能进行连接,先使用本地 postgres 用户连接默认数据库来修改数据库用户 postgres 的密码:
0
1
2
3
4
|
# 使用 postgres 用户连接默认 postgres 数据库
/opt/pgsql13/postgresql-data/bin/psql
# 修改数据库用户 postgres 的密码为 postgres@369;
ALTER USER postgres WITH PASSWORD 'postgres@369';
|
至此,可以使用外部工具连接PostgreSQL数据库
用户名:postgres
密码:postgres@369
性能
以CPU 48核心和内存64GB为例
修改 postgresql.conf
为避免错误,逐条搜索修改,切勿直接覆盖。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
# ===========================
# 内存配置(Memory Settings)
# ===========================
shared_buffers = 24GB
# PostgreSQL 用于缓存数据页的内存空间(数据库自身的缓冲区)。
# 通常建议设置为系统物理内存的 25% 左右。
# 在本例中,24GB 缓冲区意味着大量的表数据将常驻内存,减少磁盘 I/O。
work_mem = 64MB
# 每个排序(Sort)、哈希(Hash)、聚合(Aggregate)等操作使用的内存大小。
# 此参数是“每个操作、每个连接”的独立分配值。
# 对于复杂查询、并行执行或多连接时要谨慎设置,否则可能引发内存爆炸。
# 64MB 是较高的配置,适用于计算密集型 OLAP 查询环境。
maintenance_work_mem = 2GB
# 用于维护操作(如 VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY)的内存大小。
# 值越大,这类操作的速度越快,但同时占用内存也更多。
# 2GB 较大,适合大表和批量操作场景。
effective_cache_size = 45GB
# 用于告知 PostgreSQL 优化器:系统层面可用于缓存数据的总量(包括 OS 页缓存)。
# 并不实际分配内存,而是一个估算值,用于成本模型判断索引扫描 vs 顺序扫描。
# 通常设置为系统内存的 50%~75%,这里为 45GB,表示系统大约有 64GB+ 内存。
# ===========================
# WAL / 日志配置(WAL Settings)
# ===========================
wal_level = replica
# 指定 WAL 日志的详细级别。
# “replica” 允许进行流复制和时间点恢复(PITR)。
# 是生产环境中常见配置。
wal_buffers = 64MB
# 用于缓存 WAL 写入的缓冲区大小。
# 默认通常较小(如 16MB),64MB 可以减少高并发写入时的 WAL flush 次数。
# 适合大量事务写入的负载。
checkpoint_timeout = 15min
# 每次 checkpoint(检查点)之间的最大时间间隔。
# 15 分钟意味着最多 15 分钟触发一次 checkpoint。
# 过短会增加写入压力,过长可能增加恢复时间。
checkpoint_completion_target = 0.9
# 指定 checkpoint 写入的“平滑度”。
# 值越接近 1,系统会更平缓地写 WAL,减少 I/O 峰值。
# 建议值为 0.7~0.9,当前为 0.9,属于良好配置。
max_wal_size = 8GB
# WAL 文件的最大累积大小,超过该值会触发自动 checkpoint。
# 对写入压力较大的系统,可适当增大,减少频繁 checkpoint。
min_wal_size = 1GB
# WAL 文件的最小保留大小,用于防止频繁创建和删除 WAL 文件。
synchronous_commit = off
# 禁用同步提交,事务提交时不等待 WAL 写入磁盘。
# 极大提升写入性能,但在宕机时可能丢失最近 1 秒左右的事务。
# 常用于高吞吐、可容忍少量数据丢失的场景(如日志、统计类系统)。
random_page_cost = 1.1
# 随机磁盘读取成本估计值,默认是 4。
# SSD 环境下随机访问成本很低,将其调低(1.0~1.5)可让优化器更倾向使用索引扫描。
# 1.1 适用于 NVMe / SSD 环境。
effective_io_concurrency = 200
# 用于并发 I/O 请求数估算,针对支持异步 I/O 的系统(如 Linux)。
# 越高表示系统能并发处理更多 I/O。
# 200 表示 I/O 子系统性能较强(例如 NVMe RAID)。
# ===========================
# 并发与并行执行(Concurrency & Parallelism)
# ===========================
max_connections = 500
# 允许的最大数据库连接数。
# 每个连接消耗内存(约 5~10MB),因此要与系统内存平衡。
# 适用于高并发访问场景,但建议搭配连接池(PgBouncer、Pgpool-II)。
max_worker_processes = 48
# PostgreSQL 可用的最大后台工作进程数量。
# 包含并行查询、逻辑复制、后台任务等。
max_parallel_workers = 48
# 系统允许的最大并行工作者(worker)总数。
# 限制整个系统中可并行执行的 worker 总数。
max_parallel_workers_per_gather = 24
# 单个并行查询中允许的最大并行 worker 数。
# 对大型 OLAP 查询或分析任务非常有用。
# ===========================
# 自动清理(Autovacuum)
# ===========================
autovacuum = on
# 启用自动清理(VACUUM ANALYZE)。
# 清理无效行、防止膨胀、统计信息更新。
autovacuum_max_workers = 10
# 同时运行的自动清理进程数。
# 默认是 3,这里提升到 10,适合有多个大表的系统。
autovacuum_naptime = 1min
# 自动清理调度间隔。
# 每分钟检查一次需要清理的表,频率较高,有助于维持数据库健康。
autovacuum_vacuum_scale_factor = 0.1
# 当表中“脏行”(更新或删除的旧版本)达到表总行数的 10% 时,触发 vacuum。
# 数值较低意味着更频繁清理,有助于控制膨胀。
autovacuum_analyze_scale_factor = 0.05
# 当表中有 5% 的行发生变化时,触发 analyze 更新统计信息。
# 较低的值能保持查询优化器信息更准确。
# ===========================
# 日志(Logging)
# ===========================
logging_collector = on
# 启用日志收集器,将标准输出重定向到日志文件。
log_directory = 'pg_log'
# 指定日志文件保存目录(相对于数据目录)。
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 日志文件命名格式,包含日期和时间,方便按天归档。
log_statement = 'none'
# 不记录普通 SQL 语句(仅记录错误或慢查询)。
# 若想调试可设置为 'ddl' 或 'all',但会产生大量日志。
log_min_duration_statement = 1000
# 记录执行时间超过 1000 毫秒(1 秒)的 SQL。
# 可用于慢查询分析与性能优化。
# ===========================
# 其他设置(Miscellaneous)
# ===========================
max_locks_per_transaction = 512
# 每个事务允许的最大锁数量。
# 默认值通常为 64,512 可避免大批量 DDL 或复杂事务时报 “out of shared memory”。
|
自动备份
配置 WAL 日志归档
创建归档目录
以 root 用户操作
0
1
2
3
4
5
6
7
|
# 递归创建目录
sudo mkdir -p /home/postgres/postgresql-backup/wal_archive
# 更改用户组为postgres
sudo chown postgres:postgres /home/postgres/postgresql-backup/wal_archive
# 更改目录权限
chmod 700 /home/postgres/postgresql-backup/wal_archive
|
修改 postgresql.conf
以 postgres 用户操作
为避免错误,逐条搜索修改,切勿直接覆盖。
0
1
2
3
4
5
|
# 开启 WAL 日志归档
archive_mode = on
archive_command = 'test ! -f /home/postgres/postgresql-backup/wal_archive/%f && cp %p /home/postgres/postgresql-backup/wal_archive/%f'
archive_timeout = 60
wal_level = replica
max_wal_senders = 5
|
重启 PostgreSQL
以 postgres 用户操作
0
|
/opt/pgsql13/postgresql-data/bin/pg_ctl -D /opt/pgsql13/postgresql-data/data -l /opt/pgsql13/postgresql-data/log/server.log restart
|
检查归档是否生效
以 postgres 用户操作
0
1
|
/opt/pgsql13/postgresql-data/bin/psql -U postgres -c "SELECT pg_switch_wal();"
ls /home/postgres/postgresql-backup/wal_archive
|
应该能看到归档的 WAL 文件
执行全量物理备份
创建备份目录
以 root 用户操作
0
1
2
3
4
5
6
7
8
9
10
|
# 递归创建目录
mkdir -p /home/postgres/postgresql-backup/full
# 更改用户组为postgres
chown postgres:postgres /home/postgres/postgresql-backup/full
# 切换到postgres用户
su - postgres
# 修改目录权限
chmod 700 /home/postgres/postgresql-backup/full
|
手动使用 pg_basebackup 进行全量备份
以 postgres 用户操作
0
|
/opt/pgsql13/postgresql-data/bin/pg_basebackup -h localhost -U postgres -D /home/postgres/postgresql-backup/full/$(date +%Y%m%d) -Ft -Xs -P -z -Z 9
|
参数说明:
-D 指定备份目录
-Fp 以普通文件形式备份(不是 tar 格式)
-Xs 备份时同时抓取 WAL 日志,保证一致性
-P 显示进度
-R 自动生成 standby.signal 和 recovery.conf 相关配置
备份脚本
以 root 用户操作
0
1
2
3
4
5
6
7
8
9
10
|
# 创建脚本目录
mkdir -p /opt/pgsql13/postgresql-backup/scripts
# 创建备份脚本
touch /opt/pgsql13/postgresql-backup/scripts/pg_basebackup.sh
# 递归更改脚本目录用户组为postgres
chown -R postgres:postgres /opt/pgsql13/postgresql-backup/scripts/
# 修改脚本权限
chmod 700 /opt/pgsql13/postgresql-backup/scripts/pg_basebackup.sh
|
切换到 postgres 用户
0
1
2
3
|
su - postgres
# 编写脚本
vi /opt/pgsql13/postgresql-backup/scripts/pg_basebackup.sh
|
在脚本中写入如下内容:
0
1
2
3
4
5
6
7
8
9
|
#!/bin/bash
export PATH=//opt/pgsql13/postgresql-data/bin:$PATH
BACKUP_DIR="/home/postgres/postgresql-backup/full"
DATE=$(date +%Y%m%d_%H%M%S)
TARGET="$BACKUP_DIR/$DATE"
pg_basebackup -h localhost -U postgres -D "$TARGET" -Ft -Xs -P -z -Z 9
# 保留最近 30 次全量备份
ls -1dt $BACKUP_DIR/* | tail -n +31 | xargs rm -rf
|
保存退出
定时执行
以 root 用户操作
0
1
2
3
4
5
6
7
8
9
10
|
# 创建脚本日志目录
mkdir -p /opt/pgsql13/postgresql-backup/log
# 创建备份脚本
touch /opt/pgsql13/postgresql-backup/log/pg_basebackup.log
# 递归更改脚本目录用户组为postgres
chown -R postgres:postgres /opt/pgsql13/postgresql-backup/log/
# 为postgres用户添加定时执行脚本任务
crontab -u postgres -e
|
写入如下内容:
0
1
2
3
4
|
# 每天凌晨3点执行脚本
0 3 * * * /opt/pgsql13/postgresql-backup/scripts/pg_basebackup.sh >> /opt/pgsql13/postgresql-backup/log/pg_basebackup.log 2>&1
# 删除超过30天的WAL备份
0 4 * * * find /home/postgres/postgresql-backup/wal_archive -type f -mtime +30 -delete
|
保存退出
至此,PostgreSQL自动备份配置成功
恢复备份
停止数据库
0
|
/opt/pgsql13/postgresql-data/bin/pg_ctl -D /opt/pgsql13/postgresql-data/data -l logfile stop
|
清空旧数据
0
1
|
sudo -i -u postgres
rm -rf /opt/pgsql13/postgresql-data/*
|
解压最近的备份
0
1
2
3
4
5
|
LATEST_BACKUP=$(ls -1dt /home/postgres/postgresql-backup/full/* | head -n 1)
cd $LATEST_BACKUP
tar -xzf base.tar.gz -C /opt/pgsql13/postgresql-data
tar -xzf pg_wal.tar.gz -C /opt/pgsql13/postgresql-data
chown -R postgres:postgres /opt/pgsql13/postgresql-data
|
创建恢复配置
0
1
2
|
cd /opt/pgsql13/postgresql-data
echo "restore_command = 'cp /home/postgres/postgresql-backup/wal_archive/%f %p'" >> postgresql.auto.conf
touch recovery.signal
|
可选:加上时间点恢复参数
0
|
echo "recovery_target_time = '2025-10-10 03:15:00'" >> postgresql.auto.conf
|
启动数据库
0
|
/opt/pgsql13/postgresql-data/bin/pg_ctl -D /opt/pgsql13/postgresql-data/data -l /opt/pgsql13/postgresql-data/log/server.log start
|
查看恢复日志
0
|
tail -f /opt/pgsql13/postgresql-data/log/server.log
|
相关文章