postgresql 14 编译安装

内核参数

cat <<'EOF' | sudo tee /etc/sysctl.d/postgresql.conf >> /dev/null
# 表示内核所允许的最大共享内存段的大小。推荐设置物理内存的一半
kernel.shmmax = 4294967296
# 共享内存的个数。推荐值:物理内存 / 页大小,查看页大小命令(getconf PAGE_SIZE)
kernel.shmall = 2097152
# Hugepage个数,推荐值:kernel.shmmax / Hugepagesize;查看Hugepagesize(grep Hugepage /proc/meminfo)
vm.nr_hugepages = 1024
EOF

sudo sysctl -p /etc/sysctl.d/postgresql.conf

安装编译依赖

Ubuntu

sudo apt install -y gcc make pkg-config liblz4-dev zlib1g-dev libssl-dev

CentOS

sudo yum install -y gcc make lz4-devel openssl-devel

下载postgresql源码

curl -O  https://ftp.postgresql.org/pub/source/v14.10/postgresql-14.10.tar.gz
tar xvf postgresql-14.10.tar.gz 
cd postgresql-14.10

配置编译参数

./configure --prefix=/app/postgresql --with-openssl --without-readline --with-lz4 --with-blocksize=8 --with-wal-blocksize=8

编译以及安装

# 编译
make
# 安装
sudo make install

创建运行用户

sudo useradd -m -s /bin/bash postgres
sudo passwd postgres

用户添加sudo权限

cat <<EOF | sudo tee /etc/sudoers.d/postgres > /dev/null 
postgres    ALL=(ALL)       ALL
EOF

创建存储目录

sudo mkdir -p /data/{pg_data,pg_wal}
sudo chown -R postgres. /data/{pg_data,pg_wal}
sudo chmod 700 /data/{pg_data,pg_wal}

设置环境变量

sudo su - postgres

cat <<'EOF' | tee -a ~/.bashrc >>/dev/null
# Postgresql Service Environment variable
export PGHOME=/app/postgresql
export PGDATA=/data/pg_data
export LD_LIBRARY=$PGHOME/lib
export PATH=$PGHOME/bin:$PATH
EOF

source ~/.bashrc

初始化数据库

sudo su - postgres

initdb --pgdata=/data/pg_data --waldir=/data/pg_wal --encoding=UTF8 --locale=en_US.utf8 --auth=scram-sha-256 --username=postgres --pwprompt
  1. 初始化报错 initdb: error: invalid locale name "en_US.utf8"
    Ubuntu 解决办法:安装 language-pack-en 包,查看所有 locales 方法 locale --all-locales
  1. 初始化报错 initdb: error: invalid locale name "zh_CN.utf8"
    Ubuntu 解决办法:安装 language-pack-kde-zh-hans 包,查看所有 locales 方法 locale --all-locales

添加postgresql配置

cat <<'EOF' | tee -a $PGDATA/postgresql.conf > /dev/null
# 服务监听相关配置
listen_addresses = '*' # 监听地址
port = 5432 # 监听端口

# 设置时区
timezone = 'Asia/Shanghai'
log_timezone = 'Asia/Shanghai'

# WAL相关配置
wal_level = replica # 该参数决定了系统生成和记录 WAL 日志的程度 logical>replica>minimal
full_page_writes = on # 控制是否在 WAL(Write-Ahead Logging)记录中包括整个页面的副本,而不仅仅是被修改的部分【优点】可以提高崩溃恢复的可靠性【缺点】WAL日志的空间使用高
wal_log_hints = on # 控制是否在 WAL 中记录对表的索引的更改操作的提示信息【优点】有助于在崩溃时加速恢复过程【缺点】增加 WAL 记录的生成量

# 服务日志配置参数
log_directory = 'logs' # 日志目录 $PGDATA/log_directory
logging_collector = on # 开启日志采集
log_destination = stderr # 日志输出格式
log_filename = 'postgresql-%Y-%m-%d.log' # 日志文件名称
log_truncate_on_rotation = on # 可重用同名日志文件
log_rotation_age = 1d # 多长时间轮换文件记录日志
log_rotation_size = 0 # 日志轮换大小的参数,当设置为0时不轮换

# 记录慢SQL日志设置 
log_statement = all # 需设置跟踪所有语句,否则只能跟踪出错信息,设置跟踪的语句类型,有4种类型:none(默认), ddl, mod, all。跟踪所有语句时可设置为 "all"。
log_min_duration_statement = 5000 # milliseconds,记录执行5秒及以上的语句,跟踪慢查询语句,单位为毫秒。如设置 5000,表示日志将记录执行5秒以上的SQL语句

EOF

启动服务

手工启动服务

pg_ctl start

systemd启动

cat <<'EOF' | sudo tee /usr/lib/systemd/system/postgresql.service >> /dev/null
[Unit]
Description=Postgresql Server
Documentation=https://www.postgresql.org/docs/14/index.html
Wants=network.service
After=network.service

[Service]
Type=forking
User=postgres
Environment=PGDATA=/data/pg_data
ExecStart=/app/postgresql/bin/pg_ctl -D ${PGDATA} start
ExecStop=/app/postgresql/bin/pg_ctl -D ${PGDATA} stop
ExecReload=/app/postgresql/bin/pg_ctl -D ${PGDATA} reload
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl start postgresql

查看日志

cd $PGDATA/logs/
tail -f postgresql-`date "+%Y-%m-%d"`.log
posted @   jiaxzeng  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示