【DB】从安装到启动PostgreSQL-14的过程
首先
因为想要获得OSS-DB的资格,所以我开始学习数据库。
既然要学习,为了备忘起见,我想在Qiita上发布一篇文章。
这次我们使用了VMWare Workstation 17 Player来构建数据库服务器。
关于服务器的构建步骤,我们将略过。
操作系统为CentOS,版本如下所示。
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
从安装到启动Postgresql-14
PostgreSQL 安装
以下是安装到启动的一系列步骤的说明。本次将介绍 PostgreSQL-14 的操作步骤。
安装仓库包。
执行以下命令以安装存储库软件包。
如果输出显示”完成!”表示OK。
[root@localhost ~]# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
更新 yum
我要进行yum的更新。
[root@localhost ~]# yum -y update
确认可用的软件包
获取当前可用的软件包列表。
从中选择喜欢的版本。
这次我选择postgresql14-server。
[root@localhost ~]# yum list available | grep postgresql | grep server
postgresql-server.x86_64 9.2.24-8.el7_9 updates
postgresql11-server.x86_64 11.20-1PGDG.rhel7 pgdg11
postgresql12-server.x86_64 12.15-1PGDG.rhel7 pgdg12
postgresql13-server.x86_64 13.11-1PGDG.rhel7 pgdg13
postgresql14-server.x86_64 14.8-1PGDG.rhel7 pgdg14
postgresql15-server.x86_64 15.3-1PGDG.rhel7 pgdg15
安装
从之前确认过的包中安装所需的版本。
[root@localhost ~]# yum install -y postgresql14-server
版本确认
我会确认是否已安装。
[root@localhost ~]# psql --version
psql (PostgreSQL) 14.8
其他确认
首先确认是否存在 postgres 用户。
[root@localhost ~]# cat /etc/passwd | grep postgres
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
由于主目录已设为/var/lib/pgsql,因此需要确认该位置。所有者和群组都是postgres。
[root@localhost ~]# ls -ld /var/lib/pgsql
drwx------. 3 postgres postgres 37 Jul 17 16:30 /var/lib/pgsql
启动数据库
因为顺利安装完成,我打算启动数据库。
这次我们不打算在/var/lib/pgsql下创建数据库集群,而是想尝试在/database下创建。
创建目录
创建数据库目录区域。
[root@localhost ~]# mkdir /database
挂载磁盘
根据需要,参考此处的指南,在/database上挂载磁盘。
创建目录
创建 /database/data 和 /database/backup 文件夹。
前者将用作数据库集群。
后者将用作数据库备份。
[root@localhost ~]# mkdir /database/{data,backup}
变更所有者、团体
由于使用root进行创建,所以我们会改成使用postgres。
[root@localhost ~]# chown -R postgres:postgres /database/
只要满足以下条件就可以了。
[root@localhost ~]# ls -ld /database/
drwxr-xr-x. 4 postgres postgres 32 Jul 17 16:39 /database/
[root@localhost ~]#
[root@localhost ~]# ls -la /database/
total 0
drwxr-xr-x. 4 postgres postgres 32 Jul 17 16:39 .
dr-xr-xr-x. 18 root root 240 Jul 17 16:39 ..
drwxr-xr-x. 2 postgres postgres 6 Jul 17 16:39 backup
drwxr-xr-x. 2 postgres postgres 6 Jul 17 16:39 data
创建数据库集群
首先,切换到postgres用户。
[root@localhost ~]# su - postgres
成功。您现在可以使用以下命令启动数据库服务器:如果出现“OK”的消息,表示成功。如果出现“bash: initdb: command not found”的错误提示,请参考“command not found”的解决方法。
[postgres@localhost ~]# initdb -D /database/data
确认创建数据库集群。
我会确认是否按照正确的步骤进行了制作。
[postgres@localhost ~]$ ls -al /database/data/
total 60
drwx------. 19 postgres root 4096 Jul 17 16:50 .
drwxr-xr-x. 4 postgres root 32 Jul 17 16:39 ..
drwx------. 5 postgres postgres 41 Jul 17 16:50 base
drwx------. 2 postgres postgres 4096 Jul 17 16:50 global
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_commit_ts
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_dynshmem
-rw-------. 1 postgres postgres 4789 Jul 17 16:50 pg_hba.conf
-rw-------. 1 postgres postgres 1636 Jul 17 16:50 pg_ident.conf
drwx------. 4 postgres postgres 68 Jul 17 16:50 pg_logical
drwx------. 4 postgres postgres 36 Jul 17 16:50 pg_multixact
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_notify
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_replslot
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_serial
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_snapshots
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_stat
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_stat_tmp
drwx------. 2 postgres postgres 18 Jul 17 16:50 pg_subtrans
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_tblspc
drwx------. 2 postgres postgres 6 Jul 17 16:50 pg_twophase
-rw-------. 1 postgres postgres 3 Jul 17 16:50 PG_VERSION
drwx------. 3 postgres postgres 60 Jul 17 16:50 pg_wal
drwx------. 2 postgres postgres 18 Jul 17 16:50 pg_xact
-rw-------. 1 postgres postgres 88 Jul 17 16:50 postgresql.auto.conf
-rw-------. 1 postgres postgres 28782 Jul 17 16:50 postgresql.conf
修改单元文件
首先,需要更改用于启动postgresql-14的单位文件的设置。
首先,返回到root用户。
[postgres@localhost ~]# exit
接下来是单位文件的修改。
[root@localhost ~]# vi /usr/lib/systemd/system/postgresql-14.service
修订部分如下所示。
我所改变的是环境变量PGDATA的值。
PGDATA的值定义了数据库群集的路径。
这次我们在initdb时指定了/database/data/路径,所以需要更改为该路径。
Environment=PGDATA=/var/lib/pgsql/14/data/ ★ 修正前
Environment=PGDATA=/database/data/ ★ 修正後
改变后,将呈现如下所示的状态。
[root@localhost ~]# cat /usr/lib/systemd/system/postgresql-14.service
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades. It is recommended to use systemd
# "dropin" feature; i.e. create file with suffix .conf under
# /etc/systemd/system/postgresql-14.service.d directory overriding the
# unit's defaults. You can also use "systemctl edit postgresql-14"
# Look at systemd.unit(5) manual page for more info.
# Note: changing PGDATA will typically require adjusting SELinux
# configuration as well.
# Note: do not use a PGDATA pathname containing spaces, or you will
# break postgresql-14-setup.
[Unit]
Description=PostgreSQL 14 database server
Documentation=https://www.postgresql.org/docs/14/static/
After=syslog.target
After=network-online.target
[Service]
Type=notify
User=postgres
Group=postgres
# Note: avoid inserting whitespace in these Environment= lines, or you may
# break postgresql-setup.
# Location of database directory
#Environment=PGDATA=/var/lib/pgsql/14/data/ ★ 修正前
Environment=PGDATA=/database/data/ ★ 修正後
# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog
# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0
ExecStartPre=/usr/pgsql-14/bin/postgresql-14-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-14/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
# Do not set any timeout value, so that systemd will not kill postmaster
# during crash recovery.
TimeoutSec=0
# 0 is the same as infinity, but "infinity" needs systemd 229
TimeoutStartSec=0
TimeoutStopSec=1h
[Install]
WantedBy=multi-user.target
重新加载守护进程
在更改单元文件后执行以下命令。
可能在首次启动时不执行也没关系吧?
[root@localhost ~]# systemctl daemon-reload
服务启动
启动PostgreSQL。
[root@localhost ~]# systemctl start postgresql-14
确认启动状态
确认是否正常启动。
如果输出为“active: active (running)”,则表示正常。
[root@localhost ~]# systemctl status postgresql-14
连接数据库
我会尝试连接到数据库。首先,我会更改用户。
[root@localhost ~]# su - postgres
数据库连接 (DB连接)
[postgres@localhost ~]$ psql
psql (14.8)
Type "help" for help.
postgres=#
退出只需点击\q。
添加备注
2023年7月17日 更新
postgresql-14 的自動启动设置
如果按照上述步骤进行操作,服务器在重新启动时会导致数据库停止。
如果要将postgresql-14设置为自动启动,请执行以下命令。
[root@localhost ~]# systemctl enable postgresql-14
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-14.service to /usr/lib/systemd/system/postgresql-14.service.
为了确保,可以使用以下命令进行确认。如果输出为 enabled,则表示正常。
[root@localhost ~]# systemctl is-enabled postgresql-14
修改 .bash_profile 文件
我将修改.bash_profile文件的一部分内容。
即使不进行修改,启动等操作也可以正常进行。
首先,将用户更改为postgres。
[root@localhost ~]# su - postgres
编辑 .bash_profile
这是类似于编辑单元文件的修正。
修改前:PGDATA=/var/lib/pgsql/14/data
修改后:PGDATA=/database/data
[postgres@localhost ~]# vi ~/.bash_profile
修正后的感觉如下所示
[postgres@localhost ~]$ cat ~/.bash_profile
[ -f /etc/profile ] && source /etc/profile
# PGDATA=/var/lib/pgsql/14/data ★ 修正前
PGDATA=/database/data ★ 修正後
export PGDATA
export PATH=/usr/pgsql-14/bin:$PATH
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile
PS1='[\u@\h \W]\$'
以上
2023/07/18 补充
由于在VMWare上可以添加磁盘,因此我们将添加的磁盘用作数据库区域。
请确认磁盘
首先,检查操作系统是否能够识别到已经添加的磁盘。sdb 是添加的磁盘,目前尚未挂载。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
tqsda1 8:1 0 300M 0 part /boot
tqsda2 8:2 0 2G 0 part [SWAP]
mqsda3 8:3 0 17.7G 0 part /
sdb 8:16 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
检查磁盘是否存在文件系统。
如果输出只显示数据,则表示设备上不存在文件系统。
[root@localhost ~]# file -s /dev/sdb
/dev/sdb: data
创建文件系统。
[root@localhost ~]# mkfs -t xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
再次检查磁盘的文件系统。
这次可以确认文件系统为XFS。
[root@localhost ~]# file -s /dev/sdb
/dev/sdb: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
我傲慢自大。
[root@localhost ~]# mount /dev/sdb /database
确认是否已经挂载。
由于sdb的挂载点是/database,所以OK。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
tqsda1 8:1 0 300M 0 part /boot
tqsda2 8:2 0 2G 0 part [SWAP]
mqsda3 8:3 0 17.7G 0 part /
sdb 8:16 0 20G 0 disk /database
sr0 11:0 1 1024M 0 rom
顺便检查一下/database的容量。
看起来可用空间有20GB,所以可以。
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 481864 0 481864 0% /dev
tmpfs 497732 0 497732 0% /dev/shm
tmpfs 497732 8480 489252 2% /run
tmpfs 497732 0 497732 0% /sys/fs/cgroup
/dev/sda3 18555904 4929884 13626020 27% /
/dev/sda1 303780 195500 108280 65% /boot
tmpfs 99548 12 99536 1% /run/user/42
tmpfs 99548 0 99548 0% /run/user/0
/dev/sdb 20961280 32992 20928288 1% /database
由于当前的情况下,在服务器重新启动时,会导致挂载的状态丢失,因此我们需要添加一个在启动时自动挂载的设置。
显示磁盘的UUID
复制1d26f0c5-92f9-4094-9940-db62a98732a2。
[root@localhost ~]# blkid
/dev/sda1: UUID="c750867f-9e22-4d79-a2cf-79460c5f3372" TYPE="xfs"
/dev/sda2: UUID="675936fb-5c98-47e6-adff-78b404129196" TYPE="swap"
/dev/sda3: UUID="ad6eccd5-21b5-491b-af15-8d8a9b8dbe51" TYPE="xfs"
/dev/sdb: UUID="1d26f0c5-92f9-4094-9940-db62a98732a2" TYPE="xfs"
请将以下内容添加到/etc/fstab的末尾。
请将UUID的值更改为您自己磁盘的ID。
其他内容保持不变,暂时可以使用OK。
[root@localhost ~]# vi /etc/fstab
[root@localhost ~]# cat /etc/fstab
UUID=ad6eccd5-21b5-491b-af15-8d8a9b8dbe51 / xfs defaults 0 0
UUID=c750867f-9e22-4d79-a2cf-79460c5f3372 /boot xfs defaults 0 0
UUID=675936fb-5c98-47e6-adff-78b404129196 swap swap defaults 0 0
UUID=1d26f0c5-92f9-4094-9940-db62a98732a2 /database xfs defaults 0 0
只要重新启动且已经挂载,就可以了。
错误处理
在步骤中,将记录出现错误的地方的解决方法。
找不到命令
如果在创建数据库集群时发生以下错误。
[postgres@localhost ~]$ initdb -D /database/data
bash: initdb: command not found...
用户更改 hù
将用户更改为postgres。
su - postgres
修改 .bash_profile
修改 .bash_profile 文件。
.bash_profile 是在登录时加载的设置文件。
vi ~/.bash_profile
不论哪一行,都请添加以下内容。
export PATH=/usr/pgsql-14/bin:$PATH
追加后的感觉如下。
[postgres@localhost ~]$ cat ~/.bash_profile
[ -f /etc/profile ] && source /etc/profile
PGDATA=/var/lib/pgsql/14/data
export PGDATA
export PATH=/usr/pgsql-14/bin:$PATH ★追加
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile
PS1='[\u@\h \W]\$ '
.bash_profile 的生效
由于仅进行设置无法生效,因此需手动进行反映。
source ~/.bash_profile
由于前面的内容已完成,因此需要重新从initdb开始。
最后
非常感谢您观看到最后。
每次都在意的是,在构建数据库方面,是由基础设施团队还是应用团队负责呢?
虽然我是基础设施工程师,但是我还没有参与数据库的构建过呢。。
无论哪种情况,如果可能的话,我想继续学习,因为我可能会在未来做这件事情!