PostgreSQL01-安装
卸载apt安装的postgresql
停止pg服务
# 停止服务
sudo systemctl stop postgresql
# 禁止开机自启,目的是确保卸载后不会残留服务
sudo systemctl disable postgresql
卸载所有pg安装包
# 方法1:卸载所有版本的主包+自动移除未使用的依赖
sudo apt purge postgresql* -y
sudo apt autoremove --purge -y
# 方法2:卸载指定版本,保留其他版本
# sudo apt purge postgresql-18 postgresql-client-18 postgresql-common
# sudo apt autoremove --purge
// 检查是否有包残留,也可以在卸载前执行,用于查看要卸载的包名
dpkg -l | grep postgresql
清理残留的配置 / 数据目录
# 删除PostgreSQL数据目录(核心,包含所有数据库数据)
sudo rm -rf /var/lib/postgresql/
# 删除配置文件目录
sudo rm -rf /etc/postgresql/
sudo rm -rf /etc/postgresql-common/
# 删除日志目录
sudo rm -rf /var/log/postgresql/
# 删除残留的用户/组(若确认无需保留)
# 注意:仅当无其他应用使用postgres用户时执行!
sudo userdel postgres
sudo groupdel postgres
使用apt安装postgresql(二进制安装)
配置apt仓库
apt install curl ca-certificates
install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
# $VERSION_CODENAME是ubuntu的环境变量,显示系统版本。可通过/etc/os-release查看
sh -c "echo 'deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $VERSION_CODENAME-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
apt update
安装
- 使用apt安装postgresql无需再初始化数据库
- 默认安装目录/var/lib/postgresql/<PG版本号>/main/
# 替换16为你想安装的版本
apt install postgresql-16 -y
目录用途
/var/lib/postgresql/16/main/
├── base/ # 存放各数据库的实际数据文件(每个数据库一个子目录)
├── global/ # 集群级的系统表(如用户、权限)
├── pg_wal/ # WAL日志(事务日志,保障数据一致性)
/etc/postgresql/16/main/
├── pg_hba.conf # 访问控制配置文件
├── pg_ident.conf # 身份映射配置文件
├── pg_ctl.conf # 数据库服务控制参数,通常无需修改,默认使用系统配置
├── postgresql.conf # 控制数据库的核心运行参数
# /etc/postgresql/,存放 PostgreSQL 的全局通用配置(所有版本 / 集群共享)
# /etc/postgresql-common/,存放按版本 + 集群划分的 PostgreSQL 实例专属配置
服务启动文件
postgresql.service # 统管所有 PostgreSQL 集群
postgresql@16-main.service # 仅管控 16 版本 main 集群
源码安装postgresql
获取源码
访问 https://www.postgresql.org/ftp/source/ 下载对应版本的源码文件
安装
# 安装依赖
apt install -y gcc make build-essential
apt install -y libreadline-dev zlib1g-dev libssl-dev libpam0g-dev
# 解压
tar -xf postgresql-16.8.tar.gz -C /opt
# 检查系统环境(如编译器、依赖库),根据参数(如--prefix)生成适配当前系统的编译规则
# icu可以使pg支持多语言的精准排序,可以兼容更多Unicode 字符集,避免乱码、排序异常。日常中英环境可以不使用icu
cd /opt/postgresql-16.8
./configure \
--prefix=/usr/local/postgresql-16.8 \
--without-icu
# make按照configure生成的规则,编译源代码为可执行程序
# make install把make编译好的程序文件,复制到configure指定的目录
make && make install
创建用户、数据目录
- 上一步中/usr/local/postgresql-16.8路径下存放是安装的程序文件,还需要创建数据存放目录,即下面的/var/lib/pgsql/16/data
adduser postgres
mkdir -p /var/lib/pgsql/16/data
chown -R postgres:postgres /var/lib/pgsql/16/data
设置postgres用户环境变量
cat > /etc/profile.d/postgresql.sh << EOF
export PGPORT=5432
export PGUSER=postgres
export PGDATA=/var/lib/pgsql/16/data
export LANG=en_US.utf8
export PGHOME=/usr/local/postgresql-16.8
export LD_LIBRARY_PATH=\$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export PATH=\$PGHOME/bin:\$PATH
export MANPATH=\$PGHOME/share/man:\$MANPATH
EOF
--with-blocksize=BLOCKSIZE :指定数据文件的块大小,默认的是8K,在OLAP场景下可适当增至32K,OLTP场景下建议使用8K
--with-segsize=SEGSIZE :指定单个数据文件的大小,默认是1GB
--with-wal-blocksize=BLOCKSIZE :指定 WAL 文件的块大小,默认是 8kB
--with-wal-segsize=SEGSIZE :指定单个 WAL 文件的大小,默认是 16MB
这4个参数只能在编译的时候指定,所以在修改它们之前,请提前做好规划和严格的测试,否则后期想再做调整 ,只能将数据导出重新导人
初始化数据库
- 因为上面已经设置了环境变量,可以直接使用initdb和pg_ctl。两个命令的绝对路径是
- /usr/local/postgresql-16.8/bin/initdb
- /usr/local/postgresql-16.8/bin/pg_ctl
su - postgres
initdb -D /var/lib/pgsql/16/data
启动数据库
- 官网的例子中需要使用 -l 指定日志输出到哪个文件,下面的命令表示输出到当前目录的logfile文件中。也可以执行其他绝对路径
pg_ctl -D /var/lib/pgsql/16/data -l logfile start
- 开启postgresql的日志收集进程,可以不使用-l参数启动PG
vim $PGDATA/postgresql.conf
logging_collector = on # 开启日志收集
- 启动PG数据库
pg_ctl start
使用pg_ctl管理数据库启停
# 切换至postgres用户
su - postgres
# 启动/运行状态/停止
pg_ctl -D /path/to/pgdata start/status/stop -m STOP_MODE
# -D 指定操作的数据库目录
# -m 指定停止模式(简写 -ms -mf -mi)
# smart模式会等待活动的事务提交结束,并等待客户端主动断开连接之后关闭数据库
# fast模式则会回滚所有活动的事务,并强制断开客户端的连接之后关闭数据库
# immediate模式立即终止所有服务器进程,当下一次数据库启动时它会首先进入恢复状态,一般不推荐使用
安装后的账号设置
- 禁止postgres无密码登录
vim $PGDATA/pg_hba.conf
local all all trust # 本地用户无条件登录,注释这行
local all all password # 本地用户明文密码登录
- 修改postgres密码
ALTER USER postgres WITH PASSWORD '123456';
设置pg开机自启
- $MAINPID是systemd的内置环境变量,它代表由该service启动的主进程的PID,这个service启动的是pg,所以它就是pg的PID

浙公网安备 33010602011771号