为初学者到有追求的人提供RPM到PostgreSQL的引入
首先
如果使用rpm,您可以轻松地安装PostgreSQL。
但是由于rpm会自动处理许多事情,所以在注重细节时可能无法如您所愿。
因此,我将与您分享使用rpm进行安装的简单步骤以及当您想要更加注重细节时的附加信息。
本次主要考虑的环境如下。
如果操作系统是Linux 6系列,服务(自动启动/停止脚本)的设置会有所不同。
简单的安装步骤
通过RPM进行基本安装。
在线环境的情况下 de xià)
请按照以下网站的步骤建立仓库,并安装RPM。
如果要在CentOS 7(64位)上安装PostgreSQL 10(以root用户执行全过程)。
(1) 安装用于 Yum 的软件仓库。
yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-redhat10-10-1.noarch.rpm
(2) 安装客户端功能。
yum install postgresql10
安装服务器功能。
yum install postgresql10-server
如果是离线环境
您可以直接从以下网站获取RPM包。
根据版本和环境选择相关链接,选择“Available Groups”中的“PostgreSQL Database Server XX PGDG”。
(XX代表版本的值)
这些是安装PostgreSQL所需的基本RPM包。
如果要在64位的CentOS 7上安装PostgreSQL 10。
将上述的RPM传输到目标环境中。
由于可能需要安装操作系统的软件包,需要挂载安装介质。
mount /dev/sr0 /media
如果找不到的话,请输入”mount” 并确认。
编辑媒体资料库并添加挂载包路径。
vi /etc/yum.repos.d/CentOS-Media.repo
# ----------変更前----------
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
# ----------変更後----------
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
file:///media # これを追加する
对于RHEL而言,需要创建repo文件,因为该文件不存在。请参考详细说明。
移至PostgreSQL的RPM安装位置,并按以下顺序进行安装。
cd <PostgreSQLのRPM配置先>
yum --disablerepo=\* --enablerepo=c7-media install postgresql10-libs-10.1-1PGDG.rhel7.x86_64.rpm
yum --disablerepo=\* --enablerepo=c7-media install postgresql10-10.1-1PGDG.rhel7.x86_64.rpm
yum --disablerepo=\* --enablerepo=c7-media install postgresql10-contrib-10.1-1PGDG.rhel7.x86_64.rpm
yum --disablerepo=\* --enablerepo=c7-media install postgresql10-server-10.1-1PGDG.rhel7.x86_64.rpm
※yum命令的详细信息已在我刚刚补充的“/etc/yum.repos.d/CentOS-Media.repo”文件中记录。
确认管理PostgreSQL的操作系统用户
在通过rpm安装PostgreSQL时,默认创建的操作系统用户是:用户名:postgres,组名:postgres。
这些用户和组会在安装PostgreSQL的rpm时自动创建。
然而,由于未设置密码,建议在此时设置密码。
passwd postgres
postgres用户的主目录是”/var/lib/pgsql”,环境变量PGDATA已经设置在.bash_profile中。
[ -f /etc/profile ] && source /etc/profile
PGDATA=/var/lib/pgsql/10/data
export PGDATA
# 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
如果已设置环境变量,则在连接时可以省略指定所需的信息。 (取而代之,在连接时会参考环境变量的值)。
- PostgreSQLの環境変数
-
- 環境変数の詳細
- https://www.postgresql.jp/document/current/html/libpq-envars.html
数据库集群的配置
因为准备工作已经完成,所以我们将构建PostgreSQL数据库集群。
集群的构建位置是默认设置的PGDATA数值,即“/var/lib/pgsql/XX/data”。
通过以root用户身份执行以下命令,您可以构建默认设置的数据库集群。
/usr/pgsql-10/bin/postgresql-10-setup initdb
然而,如果保持现状,地区设置和字符编码将取决于环境。(特别是地区设置在集群构建后无法更改,所以需要注意。)
为了达到以上目的,可以使用环境变量PGSETUP_INITDB_OPTIONS来将区域设置和字符编码设置为任意值。
export PGSETUP_INITDB_OPTIONS="--encoding=UTF8 --no-locale"
/usr/pgsql-10/bin/postgresql-10-setup initdb
有时候我们想要以与默认设置不同的配置来构建数据库集群,比如想要指定其他数据库集群的目录或更改端口号等。在这种情况下,我们可以使用环境变量PGSETUP_INITDB_OPTIONS来自定义构建配置。实际上,可以指定的值与initdb命令可用的选项是相同的。
-
- initdbで指定可能なオプション
- https://www.postgresql.jp/document/current/html/app-initdb.html
然而,通过RPM安装时,默认的设置将会构建数据库集群。因此,如果进行了自定义选项,将需要进行一些配置更改。有关详细信息,请参阅下文,关于如何构建与默认设置不同的PostgreSQL。
请确认数据库的状态并启动/停止。
通过rpm安装的PostgreSQL默认以“postgresql-XX”命名的形式注册为服务。(其中XX是主要版本的值)
因此可以使用root用户从服务启动/停止。
在数据库集群构建后,由于PostgreSQL处于停止状态,需要将其启动。
- 「pg_ctl」コマンドによる起動/停止も可能ですが、サービスとの関係が切れてしまうため推奨しません。
systemctl status postgresql-10
● postgresql-10.service - PostgreSQL 10 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-10.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://www.postgresql.org/docs/10/static/
…
systemctl start postgresql-10
systemctl status postgresql-10
● postgresql-10.service - PostgreSQL 10 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-10.service; disabled; vendor preset: disabled)
Active: active (running) since 水 2018-10-17 09:44:59 JST; 15s ago
Docs: https://www.postgresql.org/docs/10/static/
…
如果要停止PostgreSQL,请执行以下命令。
systemctl stop postgresql-10
请确认数据库自动启动/停止脚本
在安装时,RPM会自动在/lib/systemd/system目录下创建postgresql-XX.service的启动/停止脚本。
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades. If you want to customize, the
# best way is to create a file "/etc/systemd/system/postgresql-10.service",
# containing
# .include /usr/lib/systemd/system/postgresql-10.service
# ...make your changes here...
# For more info about custom unit files, see
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# 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-setup.
[Unit]
Description=PostgreSQL 10 database server
Documentation=https://www.postgresql.org/docs/10/static/
After=syslog.target
After=network.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/10/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-10/bin/postgresql-10-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-10/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
[Install]
WantedBy=multi-user.target
请注意,由于上述脚本未启用,我们将启用自动启动/停止如下所示。
systemctl list-unit-files -t service | grep postgres
postgresql-10.service disabled
systemctl enable postgresql-10
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-10.service to /usr/lib/systemd/system/postgresql-10.service.
systemctl list-unit-files -t service | grep postgres
postgresql-10.service enabled
如果要禁用自动启动/停止脚本,则可以按照以下方式进行。
systemctl disable postgresql-10
Removed symlink /etc/systemd/system/multi-user.target.wants/postgresql-10.service.
顺便说一下,如果从源代码手动安装PostgreSQL,自动启动脚本是不会被创建的。但是,你可以在相同的目录下放置一个类似于由RPM创建的脚本,然后进行相似的激活以实现自动启动/停止。然而,请注意,这种情况下需要注意脚本的创建/修改的反映以及将文件权限设置为644。
chmod 644 /lib/systemd/system/postgresql-10.service
systemctl daemon-reload
登录数据库
通过之前的步骤,已成功完成了PostgreSQL的安装。因此我们将尝试确认是否可以实际登录。在PostgreSQL中,可以通过操作系统的postgres用户,并使用psql命令进行登录。
# su - postgres
$ psql
=# SELECT now();
now
-------------------------------
2018-10-17 10:14:40.802799+09
(1 行)
这次是为了本地连接,(默认设置下)不需要密码。
然而,由于密码本来就未设置,所以无法输入正确的密码。
因此需要设置密码。
=# ALTER ROLE postgres PASSWORD '<任意のパスワード>';
登录时原本需要使用环境变量或psql选项来指定连接用户名和连接的数据库名。
但是由于本次安装采用了默认配置,因此可以使用psql的默认值登录。
如果自定义了端口号、连接用户名和数据库名,则需要使用环境变量或psql选项。
有关PostgreSQL环境变量的内容,请参考前面所述的管理PostgreSQL的操作系统用户。
可以确认能够登录。
这表明PostgreSQL已成功从RPM安装完成。
我想要建立与默认设置不同的PostgreSQL。
使用RPM可以轻松安装PostgreSQL而无需进行详细设置。然而,有时我们需要在不同的目录下构建数据库集群或者进行其他与默认配置不同的设置。因此,下面将介绍与默认设置不同的PostgreSQL构建方法。
我想要更改数据目录。
数据目录(PGDATA)的自动启动/停止脚本已经设置了默认值。
因此,在构建集群之前需要编辑自动启动/停止脚本。
下面给出一个假设数据目录为”/pg10/pgdata”的步骤示例。
# [変更前]
Environment=PGDATA=/var/lib/pgsql/10/data
# [変更後:任意のディレクトリ]
Environment=PGDATA=/pg10/pgdata
然后,登录postgres用户,并将环境变量PGDATA从默认值更改。
# ----------変更前----------
PGDATA=/var/lib/pgsql/10/data
# ----------変更後----------
PGDATA=/pg10/pgdata
之后按照正常流程,执行数据库集群的配置以及后续操作。
想要在不同的操作系统用户之间安装
以下是将PostgreSQL的OS管理用户从postgres更改为任意用户的步骤:
1. 运行“/usr/pgsql-10/bin/postgresql-10-setup”脚本以进行PostgreSQL的安装。此脚本在设置PostgreSQL的OS管理用户时使用了postgres的硬编码。
2. 因此,您需要执行initdb命令、设置环境变量,并编辑自动启动/停止脚本。
3. 在本例中,我们将使用用户pg10(组名仍为postgres)作为PostgreSQL的OS管理用户,并且数据目录将被创建在/home/pg10/data下。
记住按照以上步骤进行操作即可。
(1) 创建任意的用户。
useradd -g postgres -d /home/pg10 pg10
passwd pg10
(2) 事先由root用户创建数据目录,并将其所有权更改为pg10用户
mkdir -p /home/pg10/data
chown -R pg10:postgres /home/pg10/data
chmod -R 700 /home/pg10/data
(3) 在第10页设置用户的环境变量。
vi .bash_profile
export PGHOST=localhost
export PGDATA=/home/pg10/data
export PGDATABASE=postgres
- ↑RPM導入においては、ローカル接続はpostgresユーザで実施することが前提となっているため、接続先を明示的にしておきます。
. .bash_profile
(4) 编辑自动启动/停止脚本。
# ----------変更前----------
[Service]
Type=notify
User=postgres
Group=postgres
…(中略)…
Environment=PGDATA=/var/lib/pgsql/10/data/
# ----------変更後----------
[Service]
Type=notify
User=pg10
Group=postgres
…(中略)…
Environment=PGDATA=/home/pg10/data
用pg10用户运行initdb。
/usr/pgsql-10/bin/initdb --encoding=UTF8 --no-locale
更改设置文件。
# ----------変更前----------
unix_socket_directories = '/var/run/postgresql, /tmp'
# ----------変更後----------
unix_socket_directories = '/tmp'
- ↑これもRPM導入においてローカル接続がpostgresユーザで実施することが前提となっているための措置です。
接下来按照正常的步骤,进行数据库状态确认、启动/停止及其他操作。
如之前所述,在RPM中,假设PostgreSQL的操作系统管理员用户是postgres进行配置。
因此,如果想要使用除postgres用户以外的用户进行管理,则使用源代码安装而不是RPM也是适当的方法。