内核参数
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
- 初始化报错
initdb: error: invalid locale name "en_US.utf8"
Ubuntu
解决办法:安装 language-pack-en
包,查看所有 locales 方法 locale --all-locales
- 初始化报错
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具