Zeuk, Zozo's father

Ubuntu Server 编译安装 PostgreSQL

2019.03.01

因为最近个人项目尝试使用 PostgreSQL 数据库,所以自己也开始学习 PostgreSQL,当然安装好 PostgreSQL 是第一步,下面是安装记录。

系统:Ubuntu Server 18.04.2(LTS) 数据库:PostgreSQL 11.2

安装编译所需依赖

GNU make

要求 make 版本 >= 3.80,使用以下命令查看版本

make --version

如果系统没有安装过,则使用以下命令进行安装

sudo apt install make

GCC

sudo apt install gcc

GNU Readline

sudo apt install libreadline7 libreadline-dev

Zlib

sudo apt install zlib1g zlib1g-dev

Openssl

sudo apt install openssl libssl-dev

Systemd

sudo apt install libsystemd0 libsystem-dev

开始安装

首先从 PostgreSQL 官网下载源码包 postgresql-11.2.tar.gz,将源码包上传到服务器 /tmp 目录。

创建安装目录

sudo mkdir /usr/local/pgsql

解压源码包

# 进入 /tmp 目录
cd /tmp
# 解压源码包
tar zxvf postgresql-11.2.tar.gz

编译安装

安装 PostgreSQL

cd /tmp/postgresql-11.2
./configure --prefix=/usr/local/pgsql/ --with-openssl --with-systemd --with-segsize=4 --with-blocksize=16 --with-wal-blocksize=32 --enable-debug
sudo make && sudo make install

安装第三方扩展包

cd /tmp/postgresql-11.2/contrib
sudo make && sudo make install

创建用户

root 用户不能启动 PostgreSQL,所以创建一个 postgres 普通用户来启动和管理

sudo adduser postgres
# 按照系统提示完成用户的新增
Adding user `postgres' ...
Adding new group `postgres' (1001) ...
Adding new user `postgres' (1001) with group `postgres' ...
Creating home directory `/home/postgres' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for postgres
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] y

创建相关目录及授权

# 创建数据库数据存放位置
sudo mkdir /usr/local/pgsql/data
# 创建数据库日志存放位置
sudo mkdir /usr/local/pgsql/logs
# 赋予 postgres 用户文件夹所有权
sudo chown -R postgres:postgres /usr/local/pgsql

配置 postgres 用户的环境变量

# 切换至 postgres 用户
su - postgres
# 修改配置文件
nano ~/.profile
# 添加以下内容到文件末尾
export PGHOME=/usr/local/pgsql
export PGDATA=$PGHOME/data
export PATH="$PGHOME/bin:$PATH"
export MANPATH=$PGHOME/share/man:$MANPATH
export LANG=en_US.utf8
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

# 使修改后的配置文件生效
source ~/.profile

启动数据库

# 初始化数据库
initdb -D /usr/local/pgsql/data
# 启动数据库
pg_ctl -D /usr/local/pgsql/data/ -l logfile start

安装后的配置

开机自启动

/etc/systemd/system/ 目录下新建 postgresql.service 服务单元文件

sudo nano /etc/systemd/system/postgresql.service

# postgresql.services 内容如下
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)

[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0

[Install]
WantedBy=multi-user.target

设置开机自启动

# 开机自启动
systemctl enable postgresql.services
# 关闭自启动
systemctl disable postgresql.services
# 查看服务状态
systemctl status postgresql.services
# 开启数据库
systemctl start postgresql.services
# 重启数据库
systemctl restart postgresql.services
# 停止数据库
systemctl stop postgresql.services

postgresql.conf 文件配置

该文件是 PostgreSQL 的核心配置文件,位于数据库 data 目录下

# 切换至 postgres 用户
su - postgres
nano /usr/local/pgsql/data/postgresql.conf

# 配置监听所有网络
listen_addresses = '*'
# 配置监听端口,默认为 5432,自定义配置如下
port = 5432
# 配置最大连接数
max_connections = 1000
# 缓存数据内存(推荐内存的1/4)
shared_buffers = 4096MB
# 开启日志收集 (以下日志配置为只保留7天的日志)
logging_collector = on
# 日志存放位置,默认为 $PGDADA 目录下的 log 目录
log_directory = 'log'
# 日志名称
log_filename = 'postgresql-%a.log'
# 当日志文件已存在时,新生成的日志将在会覆盖原来的日志
log_truncate_on_rotation = on
# 一天生成一个日志文件
log_rotation_age = 1d 
# 关闭日志文件大小限制
log_rotation_size = 0
# 日志时区
log_timezone = 'PRC'
# 数据库时区
timezone = 'PRC'

修改配置文件需重启数据库

systemctl restart postgresql.services

pg_hba.conf 文件配置

该文件用于控制访问安全性,管理客户端对Postgresql服务器的访问权限,内容包括:允许哪些用户连接到哪个数据库,允许哪些IP或者哪个网段的IP连接到本服务器,以及指定连接时使用的身份验证模式。该文件位于数据库 data 目录下

# 切换至 postgres 用户
su - postgres
nano /usr/local/pgsql/data/pg_hba.conf

# 在文件末尾添加如下行,允许所有远程主机的访问
host    all             all             0.0.0.0/0               md5

结语

PostgreSQL 的体验很不错,作为学院派的代表,系统上也非常的严谨,而且功能非常的丰富强大,后续我将抛弃 MySQL 转向 PostgreSQL,当然需要学习踩坑的地方还有很多。

发表评论