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
posted @ 2024-05-24 11:36  立勋  阅读(82)  评论(0)    收藏  举报