【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开始。

最后

非常感谢您观看到最后。

每次都在意的是,在构建数据库方面,是由基础设施团队还是应用团队负责呢?
虽然我是基础设施工程师,但是我还没有参与数据库的构建过呢。。

无论哪种情况,如果可能的话,我想继续学习,因为我可能会在未来做这件事情!

广告
将在 10 秒后关闭
bannerAds