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数据库需要的安装包。

  1. "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

  1. 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 ... ok

initdb: 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/50000D8

postgres=# 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();

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐