openEuler 源码安装 PostgreSQL
- 部署环境说明
- Shell 前端软件包管理器基础概念
- YUM 简介
- DNF 简介
- 源码安装 PostgreSQL
- 环境变量(env)设置
- 临时环境变量设置
- 永久环境变量设置
- 初始化数据库(initdb)
- 数据库基本操作
- 数据库基本配置(postgresql.conf)
- 启动、停止、查看数据库
- 使用 psql 登录数据库
- 查看数据库版本信息
- 更多(postgres/pg_ctl)命令说明
部署环境说明
-
Linux
系统:openEuler 22.03 LTS SP3 x86_64
(下载地址:openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网) -
数据库:
postgresql-15.6
(下载地址:https://ftp.postgresql.org/pub/source/v15.6/postgresql-15.6.tar.gz)
Shell 前端软件包管理器基础概念
YUM 简介
YUM
(全称为 Yellow dog Updater, Modified
)是一个在 Fedora
和 RHEL、CentOS、OEL
中的 Shell
前端软件包管理器。
YUM
本身基于 RPM
包管理,能够从指定的 YUM
源服务器(一个或多个)自动下载 RPM
包并且进行安装和更新,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
要成功的使用 YUM
工具安装更新软件或系统,就需要有一个包含各种 RPM
软件包的 repository
(软件仓库),这个软件仓库我们习惯称为 YUM
源 (可以是本地源、网络源)。
DNF 简介
DNF
(全称为 Dandified yum
)是新一代的 rpm
软件包管理器,他首先出现在 Fedora 18
这个发行版中。而最近,它取代了 yum
,正式成为 Fedora 22
的包管理器。
DNF
在 RHEL、CentOS、OEL
等系统中,从版本 8
开始出现,目前和 YUM
共存。
DNF
克服了 YUM
包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。
DNF
使用 Hawkey
库,该库解析 RPM
依赖性以在客户端计算机上运行查询。 它们基于 libsolv
构建,libsolv
是一种使用可满足性算法的程序包相关性求解器。 您可以在 libsolv
的 GitHub
存储库中找到有关该算法的更多详细信息。
在 openEuler 22.03
系统中默认使用 dnf
作为 rpm
软件包管理器,接下来我们也会使用该命令进行一些相关的操作。
源码安装 PostgreSQL
- 查看
linux
软件源。
vi /etc/dnf/dnf.conf
[repo-id 名称]
name=取个名字随意(通常和 repo-id 名称相同)
baseurl=软件源地址
# 或者
vi /etc/yum.repos.d/openEuler.repo
[OS]
name=OS
baseurl=http://repo.openeuler.org/openEuler-22.03-LTS-SP3/OS/$basearch/
metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/OS&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-22.03-LTS-SP3/OS/$basearch/RPM-GPG-KEY-openEuler
参考:设置 openEuler(欧拉系统)安装源
- 安装编译环境依赖包(推荐使用
dnf
)。
# yum 安装
sudo yum install -y systemtap-sdt-devel.x86_64 perl-ExtUtils-Embed bzip2 readline readline-devel lz4 lz4-devel openssl openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel tcl tcl-devel openldap openldap-devel python3 python3-devel kernel-headers autoconf proj.x86_64 vim nc wget psmisc gcc-c++ gcc lrzsz make cmake telnet net-tools bind-utils tree cifs-utils ntpdate bash-completion sysstat iotop iftop htop unzip nmap bc bind-utils nethogs
# dnf 安装
sudo dnf install -y perl-ExtUtils-Embed readline-devel python3-devel pam-devel libxml2-devel libxslt-devel openldap-devel lz4-devel llvm-devel systemd-devel container-selinux selinux-policy-devel openssl-devel gcc-c++ gcc cmake lsof net-tools
说明:
openEuler
使用dnf
作为默认包管理工具。
- 下载
postgresql
源码。
// 1. 切换到 /opt/postgresql 目录下
cd /opt/postgresql
// 2. 使用命令下载 postgresql
wget https://ftp.postgresql.org/pub/source/v15.6/postgresql-15.6.tar.gz
// 3. 解压文件
sudo tar -zxvf postgresql-15.6.tar.gz
// 4. 创建文件夹目录(用来存放安装 postgresql 的相关文件)
sudo mkdir -p /pgccc/pgdata/data
- 编译和安装
postgresql
。
// 1. 检测系统环境并生成 Makefile 文件,prefix 默认安装路径 /opt/postgresql/pgsql
./configure --prefix=/pgccc/pgdata --with-perl --with-python --with-pam --with-libxml --with-libxslt --with-ldap --with-lz4 --with-llvm --with-systemd --with-selinux --with-openssl
// 2. 编译 & 安装
gmake world && gmake install-world
gmake
与 gmake install
是两个命令,参数说明:
-
gmake
,编译,依据Makefile
文件把源码包编译成二进制可执行文件。 -
gmake install
安装的意思。
gmake && gmake install
的意思就是执行 gmake
如果没有发生错误就执行 gmake install
。
- 查看
postgresql
安装目录。
ls -al /pgccc/pgdata/
输出信息:
[root@euler /]# ls -al /pgccc/pgdata/
总用量 28
drwxr-xr-x. 7 root root 4096 2月 29 20:28 .
drwxr-xr-x. 3 root root 4096 2月 29 20:11 ..
drwxr-xr-x. 2 root root 4096 2月 29 20:17 bin
drwxr-xr-x. 2 root root 4096 2月 29 20:28 data
drwxr-xr-x. 4 root root 4096 2月 29 20:17 include
drwxr-xr-x. 4 root root 4096 2月 29 20:17 lib
drwxr-xr-x. 5 root root 4096 2月 29 20:
文件目录说明:
bin
存放二进制文件;include
存放.h
头文件;lib
存放安装所需的各种依赖库,动态库;share
存放所需的插件(extension
),组件;
环境变量(env)设置
临时环境变量设置
- 编写
shell
脚本:
vi pgsql-15.6-env.sh
# 写入环境变量配置信息
export PGHOME=/pgccc/pgdata
export PGHOST=localhost
export PATH=$PGHOME/bin:$PATH:$HOME/bin
#export PATH=/pgccc/pgdata/bin:$PATH
export LD_LIBRARY_PATH=/pgccc/pgdata/lib:$LD_LIBRARY_PATH
export PGDATA=/pgccc/pgdata/data
export PGPORT=5432
export PGUSER=postgres
- 执行命令,运行该文件(临时生成一下):
source pgsql-15.6-env.sh
- 查看初始化
db
版本信息,目的验证环境变量是否生效:
initdb --version
- 查看当前系统使用编码集:
echo $LANG
永久环境变量设置
环境变量配置文件 profile
(不推荐全局修改)。可以使用命令输出当下用户环境变量信息:
env 或 peintenv
参考:Linux系统中.bash_profile文件详解_Linux_脚本之家 (jb51.net)
初始化数据库(initdb)
注意:源码安装
PostgreSQL
数据库,没有默认的postgres
用户,需自行手动创建用户组和用户,并设置密码。原因:
root
不能执行PostgreSQL
的一些命令,因此要创建postgres
这个用户。
- 初始化数据库
initdb -D /pgccc/pgdata/data
注意:使用非
root
授权用户执行初始化数据库命令。
若出现如下错误信息:
initdb: error: cannot be run as root
initdb: hint: Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.
解决办法:
# 添加非 root 用户 postgres
sudo useradd postgres
# 给 postgres 用户设置密码
sudo passwd postgres
# 在相对应目录创建文件夹
sudo mkdir /pgccc/pgdata/data
# 给 postgres 用户授权 data 目录可执行权限
sudo chown -R postgres:postgres /pgccc/pgdata/data
# 初始化数据库实例
initdb -D /pgccc/pgdata/data -U postgres
# 启动数据库实例
pg_ctl start -D /pgccc/pgdata/data -l logfile
# 查看启动日志文件信息
cat ./logfile
- 查看更多
initdb
命令帮助信息:
initdb --help
数据库基本操作
数据库基本配置(postgresql.conf)
- 配置数据库监听
IP
和端口(port
):
vi /pgccc/pgdata/data/postgresql.conf
修改 listen_addresses
和 port
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)
#superuser_reserved_connections = 3 # (change requires restart)
#unix_socket_directories = '/tmp' # comma-separated list of directories
# (change requires restart)
#unix_socket_group = '' # (change requires restart)
#unix_socket_permissions = 0777 # begin with 0 to use octal notation
# (change requires restart)
#bonjour = off # advertise server via Bonjour
# (change requires restart)
#bonjour_name = '' # defaults to the computer name
# (change requires restart)
修改说明:
-
listen_addresses
默认值localhost
(只允许本地登录),配置为 “*” 代表在本机的所有地址上监听。 -
port
默认值5432
,如果安装了多个数据库实例,则需要为每个实例指定不同的监听端口。
- 配置数据库错误日志
#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------
# - Where to Log -
#log_destination = 'stderr' # Valid values are combinations of
# stderr, csvlog, jsonlog, syslog, and
# eventlog, depending on platform.
# csvlog and jsonlog require
# logging_collector to be on.
# This is used when logging to stderr:
logging_collector = on # Enable capturing of stderr, jsonlog,
# and csvlog into log files. Required
# to be on for csvlogs and jsonlogs.
# (change requires restart)
# These are only used if logging_collector is on:
log_directory = 'pg_log' # directory where log files are written,
# can be absolute or relative to PGDATA
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
# can include strftime() escapes
#log_file_mode = 0600 # creation mode for log files,
# begin with 0 to use octal notation
#log_rotation_age = 1d # Automatic rotation of logfiles will
# happen after that time. 0 disables.
#log_rotation_size = 10MB # Automatic rotation of logfiles will
# happen after that much log output.
# 0 disables.
修改说明:
-
logging_collector = on
,默认为off
。 -
log_directory = 'pg_log'
,默认为log
(相对路径,即${PGDATA}/pg_log
)。也可以改为绝对路径,还可以定义在其他目录或者分区,但是必须先创建此目录,并且该目录有修改权限。 -
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
。
参考:PostgreSQL 日志参数解释 常用环境日志参数配置_log_min_duration_statement-CSDN博客
启动、停止、查看数据库
可能出现类似的异常信息
- 异常一:
pg_ctl: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will
own the server process.
解决方案,改用非 root
账号执行 pt_ctl
相关命令即可。
su postgres
- 异常二:
[jeff@euler ~]$ pg_ctl --help
-bash: pg_ctl:未找到命令
解决方案,由于上面 postgresql
环境变量配置过程中使用的临时方式,切换用户后请重新执行下该命令。
source pgsql-15.6-env.sh
- 启动数据库
pg_ctl start -D /pgccc/pgdata/data
输出信息:
waiting for server to start....2024-02-29 22:15:38.584 CST [125692] LOG: redirecting log output to logging collector process
2024-02-29 22:15:38.584 CST [125692] HINT: Future log output will appear in directory "pg_log".
done
server started
- 停止数据库
pg_ctl stop -D /pgccc/pgdata/data
pg_ctl stop
命令语法说明:
pg_ctl stop [-D DATADIR] [-m SHUTDOWN-MODE]
参数说明:-m
是指数据库的停止方式,可选 3
种方式:
-
smart
,待所有连接终止后关闭数据库。 -
fast
,快速断开连接并关闭数据库。 -
immediate
,立刻关闭数据库,下次启动数据库需要进行恢复。
如果不指定 -m
,则默认使用 fast
方式关闭数据库。
- 重启数据库
pg_ctl restart -D /pgccc/pgdata/data
- 查看数据库运行状态
- 方法一:
pg_ctl status
命令查看
pg_ctl status -D /pgccc/pgdata/data
输出信息:
pg_ctl: server is running (PID: 125692)
/pgccc/pgdata/bin/postgres "-D" "/pgccc/pgdata/data"
- 方法二:查看
postgres
进程信息
ps -ef | grep postgres
# (推荐)使用下面方式可以清晰看出层级结构
ps -axjf | grep postgres
# 查看指定进程相关信息
lsof -p pid
输出 pid=1814
(此处为 postgres
实例)的进程信息:
[root@euler ~]# lsof -p 1814
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 1814 postgres cwd DIR 253,0 4096 1447087 /pgccc/pgdata/data2
postgres 1814 postgres rtd DIR 253,0 4096 2 /
postgres 1814 postgres txt REG 253,0 9363776 1444452 /pgccc/pgdata/bin/postgres
postgres 1814 postgres DEL REG 0,1 1025 /dev/zero
postgres 1814 postgres mem REG 253,0 19037712 3016591 /usr/lib/locale/locale-archive
postgres 1814 postgres mem REG 253,0 157976 3019397 /usr/lib64/libgpg-error.so.0.33.1
postgres 1814 postgres mem REG 253,0 223368 3018526 /usr/lib64/libcrypt.so.1.1.0
postgres 1814 postgres mem REG 253,0 63984 3018081 /usr/lib64/libresolv.so.2
postgres 1814 postgres mem REG 253,0 30840 3019511 /usr/lib64/libcap-ng.so.0.0.0
postgres 1814 postgres mem REG 253,0 1333016 3019544 /usr/lib64/libgcrypt.so.20.4.2
postgres 1814 postgres mem REG 253,0 43240 3030139 /usr/lib64/libcap.so.2.61
postgres 1814 postgres mem REG 253,0 117616 3020069 /usr/lib64/libsasl2.so.3.0.0
postgres 1814 postgres mem REG 253,0 68040 3027871 /usr/lib64/liblber.so.2.0.200
postgres 1814 postgres mem REG 253,0 133256 3019522 /usr/lib64/libaudit.so.1.0.0
postgres 1814 postgres mem REG 253,0 161992 3018465 /usr/lib64/liblzma.so.5.2.5
postgres 1814 postgres mem REG 253,0 2055336 3018072 /usr/lib64/libc.so.6
postgres 1814 postgres mem REG 253,0 812088 3030154 /usr/lib64/libsystemd.so.0.32.0
postgres 1814 postgres mem REG 253,0 397056 3027873 /usr/lib64/libldap.so.2.0.200
postgres 1814 postgres mem REG 253,0 891176 3018075 /usr/lib64/libm.so.6
postgres 1814 postgres mem REG 253,0 100552 3018407 /usr/lib64/libz.so.1.2.11
postgres 1814 postgres mem REG 253,0 3047192 3035664 /usr/lib64/libcrypto.so.1.1.1wa
postgres 1814 postgres mem REG 253,0 628816 3035666 /usr/lib64/libssl.so.1.1.1wa
postgres 1814 postgres mem REG 253,0 67784 3031855 /usr/lib64/libpam.so.0.85.1
postgres 1814 postgres mem REG 253,0 1492264 3015964 /usr/lib64/libxml2.so.2.9.14
postgres 1814 postgres mem REG 253,0 133240 3019814 /usr/lib64/liblz4.so.1.9.3
postgres 1814 postgres mem REG 0,23 26976 2 /dev/shm/PostgreSQL.2062550190
postgres 1814 postgres mem REG 253,0 199960 3018068 /usr/lib64/ld-linux-x86-64.so.2
postgres 1814 postgres DEL REG 0,1 0 /SYSV001614af
postgres 1814 postgres 0r CHR 1,3 0t0 4 /dev/null
postgres 1814 postgres 1w FIFO 0,12 0t0 20345 pipe
postgres 1814 postgres 2w FIFO 0,12 0t0 20345 pipe
postgres 1814 postgres 3r FIFO 0,12 0t0 20344 pipe
postgres 1814 postgres 4w FIFO 0,12 0t0 20344 pipe
postgres 1814 postgres 5r FIFO 0,12 0t0 20345 pipe
postgres 1814 postgres 6u IPv4 20349 0t0 TCP *:personal-agent (LISTEN)
postgres 1814 postgres 7u IPv6 20350 0t0 TCP *:personal-agent (LISTEN)
postgres 1814 postgres 8u unix 0x0000000009ef7753 0t0 20351 /tmp/.s.PGSQL.5555 type=STREAM (LISTEN)
说明:
linux
系统中lsof
命令加-p
是指定进程,不加-p
的是线程。
- 方法三:查看数据库状态
pg_isready -p 5432
- 方法四:判断监听端口
# 安装 net-tools
dnf install -y net-tools
# 监听端口
netstat -nutlp | grep 5432
输出信息:
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1814/postgres
tcp6 0 0 :::5432 :::* LISTEN 1814/postgres
使用 psql 登录数据库
psql
是一个客户端命令工具,可以对数据库实例执行相关操作。
说明:
psql
连接数据库,不指定的情况下,默认连接5452
端口,且使用当前用户查找同名 DB 实例。
- 登录方式一:
psql postgresql://postgres:pg123@172.17.0.3:5432/postgres
参数说明:
-
postgresql
,协议名称。 -
postgres
,数据库用户名。 -
pg123
,用户密码。 -
172.17.0.3
,数据库IP
地址。 -
5432
,数据库实例监听端口。 -
postgres
,需要访问的数据库名称。
- 登录方式二:
psql -U postgres -h 172.17.0.3 -p 5432 -d postgres
参数说明:
-
-U
,postgresql
用户名。 -
-h
,数据库IP
地址。 -
-p
,数据库实例监听端口。 -
-d
,需要访问的数据库名称。
- 登录方式三:使用
psql
直接连接数据库,需要通过设置postgres
用户的环境变量(env
)来实现。
psql
参考:PostgreSQL psql两种登录方式_postgresql登录-CSDN博客
- 查看 pgsql 更多帮助信息:
psql --help
查看数据库版本信息
- 登录数据库后,查看数据库(服务端)版本信息:
[postgres@euler /]$ psql -U postgres -p 5432 -d postgres
psql (15.6)
Type "help" for help.
postgres=# select version();
version
------------------------------------------------------------------------------
PostgreSQL 15.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 10.3.1, 64-bit
(1 row)
postgres=# SHOW server_version;
server_version
----------------
15.6
(1 row)
postgres=# SHOW server_version_num;
server_version_num
--------------------
150006
(1 row)
- 推出
psql
查看数据库(服务端)版本信息:
postgres-# \q
[postgres@euler /]$ postgres --version
postgres (PostgreSQL) 15.6
- 查看数据库客户端工具版本信息
psql --version
注意:
psql --version
返回的是psql
工具的版本,而不是服务器版本。
更多(postgres/pg_ctl)命令说明
说明:
pg_ctl
命令本质上是包装了postgres
的命令操作,推荐使用pg_ctl
命令。
pg_ctl --help
[postgres@euler /]$ pg_ctl --help
pg_ctl is a utility to initialize, start, stop, or control a PostgreSQL server.
Usage:
pg_ctl init[db] [-D DATADIR] [-s] [-o OPTIONS]
pg_ctl start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]
[-o OPTIONS] [-p PATH] [-c]
pg_ctl stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]
pg_ctl restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]
[-o OPTIONS] [-c]
pg_ctl reload [-D DATADIR] [-s]
pg_ctl status [-D DATADIR]
pg_ctl promote [-D DATADIR] [-W] [-t SECS] [-s]
pg_ctl logrotate [-D DATADIR] [-s]
pg_ctl kill SIGNALNAME PID
Common options:
-D, --pgdata=DATADIR location of the database storage area
-s, --silent only print errors, no informational messages
-t, --timeout=SECS seconds to wait when using -w option
-V, --version output version information, then exit
-w, --wait wait until operation completes (default)
-W, --no-wait do not wait until operation completes
-?, --help show this help, then exit
If the -D option is omitted, the environment variable PGDATA is used.
Options for start or restart:
-c, --core-files allow postgres to produce core files
-l, --log=FILENAME write (or append) server log to FILENAME
-o, --options=OPTIONS command line options to pass to postgres
(PostgreSQL server executable) or initdb
-p PATH-TO-POSTGRES normally not necessary
Options for stop or restart:
-m, --mode=MODE MODE can be "smart", "fast", or "immediate"
Shutdown modes are:
smart quit after all clients have disconnected
fast quit directly, with proper shutdown (default)
immediate quit without complete shutdown; will lead to recovery on restart
Allowed signal names for kill:
ABRT HUP INT KILL QUIT TERM USR1 USR2
Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>
- postgres --help
[postgres@euler /]$ postgres --help
postgres is the PostgreSQL server.
Usage:
postgres [OPTION]...
Options:
-B NBUFFERS number of shared buffers
-c NAME=VALUE set run-time parameter
-C NAME print value of run-time parameter, then exit
-d 1-5 debugging level
-D DATADIR database directory
-e use European date input format (DMY)
-F turn fsync off
-h HOSTNAME host name or IP address to listen on
-i enable TCP/IP connections
-k DIRECTORY Unix-domain socket location
-l enable SSL connections
-N MAX-CONNECT maximum number of allowed connections
-p PORT port number to listen on
-s show statistics after each query
-S WORK-MEM set amount of memory for sorts (in kB)
-V, --version output version information, then exit
--NAME=VALUE set run-time parameter
--describe-config describe configuration parameters, then exit
-?, --help show this help, then exit
Developer options:
-f s|i|o|b|t|n|m|h forbid use of some plan types
-n do not reinitialize shared memory after abnormal exit
-O allow system table structure changes
-P disable system indexes
-t pa|pl|ex show timings after each query
-T send SIGSTOP to all backend processes if one dies
-W NUM wait NUM seconds to allow attach from a debugger
Options for single-user mode:
--single selects single-user mode (must be first argument)
DBNAME database name (defaults to user name)
-d 0-5 override debugging level
-E echo statement before execution
-j do not use newline as interactive query delimiter
-r FILENAME send stdout and stderr to given file
Options for bootstrapping mode:
--boot selects bootstrapping mode (must be first argument)
--check selects check mode (must be first argument)
DBNAME database name (mandatory argument in bootstrapping mode)
-r FILENAME send stdout and stderr to given file
Please read the documentation for the complete list of run-time
configuration settings and how to set them on the command line or in
the configuration file.
Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>