PG数据库管理-数据库单实例源码安装以及后期配置
本文介绍了PostgreSQL 18.3的完整安装流程:1)从官网下载源码包并解压;2)安装必要的开发工具和依赖包(Development Tools、bison、flex等);3)通过configure配置安装参数,可自定义数据块大小;4)编译安装并创建postgres用户和数据目录;5)初始化数据库并设置密码;6)配置pg_hba.conf文件设置访问权限。安装过程中需注意以postgres用
1 数据库软件下载
在PostgreSQL官方主页https://www.postgresql.org/ftp/latest下载

2 上传解压安装包
[root@db1 postgresql-18.3]# tar -xvf postgresql-18.3.tar.gz
3 操作系统配置


yum -y install telnet-server
yum -y install gcc
yum -y install gcc-c++
yum -y inatall perl
yum -y install perl-ExtUtils-Embed
yum -y install readline
yum -y install readline-devel *
yum -y install zlib
yum -y install zlib-devel
yum -y install python
yum -y install python-devel *
yum -y install libxml2
yum -y install libxml2-devel
环境变量。

4 三板斧
1 运行configure
运行configure之前,需要安装PG数据库需要的安装包。
- "Development Tools"
简单来说,在 Linux 中安装 "Development Tools" 就如同为你的系统安装了一个编译器工具箱。它为你提供了从源代码“制造”软件的基础能力。没有它,很多需要编译的软件安装过程会失败,并提示类似 “gcc: command not found” 或 “make: command not found” 的错误。这是进行后续任何底层开发或软件编译的首要前提。
基于 RHEL/CentOS/Fedora/AlmaLinux/Rocky Linux:
sudo yum groupinstall "Development Tools" # 旧版 yum
sudo dnf groupinstall "Development Tools" # 新版 dnf
基于 Debian/Ubuntu:
sudo apt update
sudo apt install build-essential
openSUSE:
sudo zypper install -t pattern devel_basis
- bison
bison是一个元编程工具。它本身不直接解析文本,而是帮助你自动生成一个能完成复杂解析任务的程序。它是开发编程语言、复杂解析器时不可或缺的专业级工具,是编译原理理论在实践中的关键体现。对于普通用户来说,只有在从源代码编译某些依赖它的软件(如 PHP、Bash 本身)时,才需要确保系统已安装 bison
flex
flex是 Linux/Unix 系统中另一个关键的开发工具,与 bison是黄金搭档。它的全称是 Fast Lexical Analyzer Generator
readline-devel
readline-devel是 Linux 系统中的一个开发包,它包含了使用 GNU Readline 库进行软件开发所必需的头文件和链接库
zlib-devel
zlib-devel是 Linux 系统中一个非常重要的开发包,它提供了使用 zlib 压缩库进行软件开发所需的头文件和链接库
命令合集:
yum install libicu-devel
yum install readline-devel
yum install zlib-devel
./configure --prefix=/pg18 --可以指定数据文件大小和数据块大小。
./configure --prefix=/pg18 --with-blocksize=8
./configure --prefix=/pg18 --with-blocksize=8 --with-segsize=1
# 使用默认 8KB 块大小
./configure --prefix=/pg18 --with-blocksize=8# 使用 16KB 块大小(适合 OLAP/数据仓库)
./configure --prefix=/pg18 --with-blocksize=16# 使用 32KB 块大小(适合大型分析查询)
./configure --prefix=/pg18 --with-blocksize=32
2 编译和安装
make
make install
[root@db1 pg18]# ls -rlt
total 12
drwxr-xr-x. 3 root root 24 Mar 7 07:05 share
drwxr-xr-x. 4 root root 4096 Mar 7 07:05 include
drwxr-xr-x. 4 root root 4096 Mar 7 07:05 lib
drwxr-xr-x. 2 root root 4096 Mar 7 07:05 bin
[root@db1 pg18]#
# 4. 创建数据目录和用户
sudo useradd postgres
sudo mkdir -p /pg18/data
sudo chown -R postgres:postgres /pg18
# 5. 配置环境变量
export PATH
export PATH=$PATH:/pg18/bin
export PGBASE=/pg18
export PGDATA=/pg18/data
# 6. 初始化数据库
[root@db1 bin]# ./initdb --help
sudo -u postgres /pg18/bin/initdb -D /pg18/data -E UTF8 --locale=en_US.utf8 -W

[root@db1 bin]# sudo -u postgres /pg18/bin/initdb -D /pg18/data -E UTF8 --locale=en_US.utf8 -W
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.The database cluster will be initialized with locale "en_US.utf8".
The default text search configuration will be set to "english".Data page checksums are enabled.
Enter new superuser password:
Enter it again:fixing permissions on existing directory /pg18/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... PRC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... okinitdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.Success. You can now start the database server using:
/pg18/bin/pg_ctl -D /pg18/data -l logfile start
[root@db1 bin]# cd ..
[root@db1 pg18]# ls
bin data include lib share
[root@db1 pg18]#
[root@db1 pg18]# /pg18/bin/pg_ctl -D /pg18/data -l logfile start
pg_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.
[root@db1 pg18]#
cd /pg18/bin/
./pg_ctl -D /pg18/data -l logfile start
此时数据库已经安装完成。
# 7. 启动与关闭/reload
pg_ctl -D $PGDATA -l (log输出的位置) start
pg_ctl -D $PGDATA -l /home/postgres/1.log start
pg_ctl -D $PGDATA -l (log输出的位置)stop -m(f/s)
pg_ctl reload -l /home/posgres/1.log
类似oracle的对比。
s:shutdown 等待全部完成,在断开。
f shutdown immediate 回滚,断开链接。
i:shutdown abort
#8 配置链接pg_hba.cnf
# 备份原文件
cp /pg18/data/pg_hba.conf /pg18/data/pg_hba.conf.backup[postgres@db1 data]$ more pg_hba.conf
# DATABASE CAN BE "all", "sameuser", "samerole", "replication", OR A NAME
# USER CAN BE "all", "sameuser", "samerole", "replication", OR A NAME
# ADDRESS CAN BE "all", "samehost", "samenet", OR A CIDR ADDRESS
# METHOD CAN BE "trust", "reject", "md5", "password", "scram-sha-256", "gss", "sspi", "ident", "peer", "pam", "ldap", "radius", "cert"
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Unix socket connections:
local all all peer
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
# 如果你的业务需要允许特定网段远程访问,添加类似下面这行:
host all all 192.168.1.0/24 scram-sha-256
#9 配置数据库运行日志
alter system set logging_collector=on;
alter system set log_directory='/home/postgres';
alter system set log_filename='postgresql-%Y-%m-%d_%H%M%S.log';
alter system set log_rotation_age='1d';
alter system set log_rotation_size= 1024000; 1G、
select pg_reload_conf();
#9 PG_WAL LOG
1 查看wal日志
postgres=# select * from pg_ls_waldir();
name | size | modification
--------------------------+----------+------------------------
000000010000000000000001 | 16777216 | 2026-03-07 23:36:27+08
000000010000000000000002 | 16777216 | 2026-03-07 23:38:10+08
000000010000000000000003 | 16777216 | 2026-03-07 23:51:22+08
000000010000000000000004 | 16777216 | 2026-03-08 06:57:49+08
2 当前正在使用的wal文件
--查看当前的lsn
postgres=# SELECT * FROM pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/50000D8postgres=# select pg_walfile_name(pg_current_wal_lsn());
pg_walfile_name
--------------------------
000000010000000000000004
(1 row)
3 切换wal日志
postgres=# select * from pg_ls_waldir();
name | size | modification
--------------------------+----------+------------------------
000000010000000000000001 | 16777216 | 2026-03-07 23:36:27+08
000000010000000000000002 | 16777216 | 2026-03-07 23:38:10+08
000000010000000000000003 | 16777216 | 2026-03-07 23:51:22+08
000000010000000000000004 | 16777216 | 2026-03-08 07:06:18+08
000000010000000000000005 | 16777216 | 2026-03-08 07:10:56+08
000000010000000000000006 | 16777216 | 2026-03-08 07:11:00+08
000000010000000000000007 | 16777216 | 2026-03-08 07:11:18+08
(7 rows)postgres=# SELECT PG_SWITCH_WAL();
pg_switch_wal
---------------
0/7000078
(1 row)postgres=# select * from pg_ls_waldir();
name | size | modification
--------------------------+----------+------------------------
000000010000000000000001 | 16777216 | 2026-03-07 23:36:27+08
000000010000000000000002 | 16777216 | 2026-03-07 23:38:10+08
000000010000000000000003 | 16777216 | 2026-03-07 23:51:22+08
000000010000000000000004 | 16777216 | 2026-03-08 07:06:18+08
000000010000000000000005 | 16777216 | 2026-03-08 07:10:56+08
000000010000000000000006 | 16777216 | 2026-03-08 07:11:00+08
000000010000000000000007 | 16777216 | 2026-03-08 07:11:31+08
000000010000000000000008 | 16777216 | 2026-03-08 07:11:38+08
(8 rows)postgres=#
分析wal log日志
pg_waldump 000000010000000000000008

#10 PG archivelog
archive_mode = on
archive_command = 'test ! -f /pg18/data/pg_archivelog/%f && cp %p /pg18/data/pg_archivelog/%f'
#11 数据库备份与恢复
物理备份+归档日志。
pg_basebackup: error: connection to server at "192.168.58.130", port 5432 failed: FATAL: no pg_hba.conf entry for replication connection from host "192.168.58.130", user "postgres", no encryption
1 host replication postgres 192.168.58.0/24 md5
--备份服务器要加载replication
[postgres@db1 data]$ pg_basebackup -D /home/postgres -Ft -Pv -Upostgres -h 192.168.58.130 -p 5432 -R
Password:
pg_basebackup: error: directory "/home/postgres" exists but is not empty
恢复案例1
支持远程备份
pg_basebackup -D /home/postgres/backup_`date +%Y%m%d` -Ft -Pv -Upostgres -h 192.168.58.130 -p 5432 -R
pg_basebackup -D "/home/postgres/backup_$(date +%Y%m%d_%H%M%S)" -Ft -Pv -Upostgres -h 192.168.58.130 -p 5432 -R
(一)备份时间点恢复
rm -rf /pgdata/12/data/*
rm -rf /archive/*1恢复备份
tar xf base.tar -C /pgdata/12/data/
tar xf pg_wal.tar -C /archive/
2 编辑文件
postgresql.auto.conf其中primary_conninfo类似change master的mysql数据库。
添加:
restore_command='cp /archive/%f %p' ---将归档目录中归档的日志拷贝到pg_wal目录中
recovery_target='immediate'创建文件记录恢复过程。
touch /pgdata/12/data/recovery.signal
(创建或编辑recovery.conf文件: 你需要在 PostgreSQL 的数据目录中创建或编辑recovery.conf文件。如果使用的是 PostgreSQL 12 或更高版本,可以使用pg_rewind和recovery.signal文件来管理恢复过程,但recovery.conf仍然适用。)
登录psql执行。
pg_ctl start --已经恢复完成。
psql
select pg_wal_replay_resume();---需要执行不执行数据库是只读的
恢复案例2
(二)PITR时间点恢复(下午2点)
每天23:00通过bg_basebackup备份,周二下午2点误删除数据,如何恢复。1 恢复全备份。
2 归档恢复:备份归档+23点-下午14点之间的wal归档日志+在线wal日志(14点之前的)把wal日志切一下不就行了吗。cp base.tar $PGDATA/
cp 16392.tar /tbs/ --这是手工创建的表空间
pg_waldump确定时间点pgwaldump 00000010000000000000008
编辑postgresql.auto.conf文件
restore_command='cp /archive/%f %p'
recovery_target_xid='533' 到533为止recover_end_command = 'echo "Recovery completed" >> /var/log/postgresql/recovery.log'
#recovery_target_lsn
创建文件记录恢复过程。
touch /pgdata/12/data/recovery.signal
启动数据库恢复,登录并执行:
select pg_wal_replay_resume();
更多推荐

所有评论(0)