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 PIDCommon 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 necessaryOptions for stop or restart:-m, --mode=MODE MODE can be "smart", "fast", or "immediate"Shutdown modes are:smart quit after all clients have disconnectedfast quit directly, with proper shutdown (default)immediate quit without complete shutdown; will lead to recovery on restartAllowed signal names for kill:ABRT HUP INT KILL QUIT TERM USR1 USR2Report 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 exitDeveloper 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 debuggerOptions 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 fileOptions 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 filePlease 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/>