安装 PostgreSQL12 在 CentOS 7.5 上

环境

这是关于在CentOS 7.5上安装PostgreSQL12的备忘录。
环境如下:

    • CentOS 7.5(firewalldは無効化しています)

 

    Postgres 12

在以下的 PostgreSQL11.2的情况下,安装步骤几乎与上述相同。

    CentOS 7にPostgreSQL11をインストールする

[2020/6/10补充]
由于本操作没有指定次要版本号,将安装最新版本的PostgreSQL。截至2020年6月,将安装版本12.3。

安装PostgreSQL的yum库。

我們將安裝CentOS版本適用的PostgreSQL存儲庫套件。
不同操作系統對應的存儲庫套件URL列表可在以下網站中找到。

# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
~省略~
Running transaction
  Installing : pgdg-redhat-repo-42.0-5.noarch                                                                                      1/1 
  Verifying  : pgdg-redhat-repo-42.0-5.noarch                                                                                      1/1 

Installed:
  pgdg-redhat-repo.noarch 0:42.0-5                                                                                                     

Complete!

安装PostgreSQL

请安装PostgreSQL。
※为了编译扩展功能,建议同时安装”postgresql12-devel”。

# yum -y install postgresql12-server postgresql12-contrib

~省略~
Installed:
  postgresql12-contrib.x86_64 0:12.0-1PGDG.rhel7           postgresql12-server.x86_64 0:12.0-1PGDG.rhel7          

Dependency Installed:
  libicu.x86_64 0:50.2-3.el7                                 libtirpc.x86_64 0:0.2.4-0.16.el7                     
  libxslt.x86_64 0:1.1.28-5.el7                              postgresql12.x86_64 0:12.0-1PGDG.rhel7               
  postgresql12-libs.x86_64 0:12.0-1PGDG.rhel7                python3.x86_64 0:3.6.8-10.el7                        
  python3-libs.x86_64 0:3.6.8-10.el7                         python3-pip.noarch 0:9.0.3-5.el7                     
  python3-setuptools.noarch 0:39.2.0-10.el7                 

Dependency Updated:
  python.x86_64 0:2.7.5-86.el7                          python-libs.x86_64 0:2.7.5-86.el7                         

Complete!

PostgreSQL将安装在“/usr/pgsql-12/”目录下。

# ls -l /usr/pgsql-12/
total 16
drwxr-xr-x. 2 root root 4096 Oct 10 13:42 bin
drwxr-xr-x. 3 root root   23 Oct 10 13:42 doc
drwxr-xr-x. 3 root root 4096 Oct 10 13:42 lib
drwxr-xr-x. 8 root root 4096 Oct 10 13:42 share

在中文中,可以将 “PostgreSQLの自動起動” 改写为 “PostgreSQL的自动启动”。

为了自动启动PostgreSQL,执行以下命令。

# systemctl enable postgresql-12.service

创建数据库集群

创建数据库集群。
正在以root用户身份执行。
数据库文件默认情况下将被创建在“/var/lib/pgsql/12/data/”,但现在将其更改为“/data/”下。
可以通过postgresql-12.service文件中的“PGDATA”环境变量进行指定。

# vi /usr/lib/systemd/system/postgresql-12.service

変更前)
Environment=PGDATA=/var/lib/pgsql/12/data/
変更後)
Environment=PGDATA=/data/

# systemctl daemon-reload

接下来,执行以下命令以创建数据库集群。

# PGSETUP_INITDB_OPTIONS="-E UTF8 --no-locale" /usr/pgsql-12/bin/postgresql-12-setup initdb
Initializing database ... OK

确认下面的「/data/」是否已生成。

# cat /data/PG_VERSION 
12

启动PostgreSQL。

在启动之前,将PostgreSQL的bin目录添加到路径中。

# su - postgres

/var/lib/pgsql/.pgsql_profileにパスを追加します。

# vi /var/lib/pgsql/.pgsql_profile
PATH=/usr/pgsql-12/bin:$PATH
export PATH

PGDATAを修正します。

# vi /var/lib/pgsql/.bash_profile
#PGDATA=/var/lib/pgsql/12/data
PGDATA=/data

# source ~/.bash_profile

PostgreSQL的启动可以使用“pg_ctl start”命令完成。

$ pg_ctl start
waiting for server to start....2019-10-10 13:54:19.061 CEST [12763] LOG:  starting PostgreSQL 12.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
2019-10-10 13:54:19.063 CEST [12763] LOG:  listening on IPv6 address "::1", port 5432
2019-10-10 13:54:19.063 CEST [12763] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2019-10-10 13:54:19.065 CEST [12763] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2019-10-10 13:54:19.067 CEST [12763] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2019-10-10 13:54:19.073 CEST [12763] LOG:  redirecting log output to logging collector process
2019-10-10 13:54:19.073 CEST [12763] HINT:  Future log output will appear in directory "log".
 done
server started

可以使用”systemctl start postgresql-12″启动。

数据库确认

我要确认已创建的数据库集群。
我要尝试显示版本和数据库列表。

$ psql -V
psql (PostgreSQL) 12.0
$ psql -l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     | 
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
(3 rows)

创建用户和数据库

创建一个用户(”testuser”)和一个数据库(”testdb”)。

$ createuser --login --pwprompt testuser
Enter password for new role: 
Enter it again:

$ createdb --owner=testuser testdb

允许来自外部的连接

因为默认情况下,PostgreSQL无法进行远程连接,所以需要更改设置。

# vi /data/postgresql.conf
※デフォルトでは「/var/lib/pgsql/12/data/postgresql.conf」

変更前)
#listen_addresses = 'localhost'
変更後)
listen_addresses = '*'

接下来需要修改pg_hba.conf文件。

# vi /data/pg_hba.conf
※デフォルトでは「/var/lib/pgsql/12/data/pg_hba.conf」

# "local" is for Unix domain socket connections only
local   testdb          testuser                                md5
→ローカルからtestdbへtestuserでmd5接続できるように1行追加。
local   all             all                                     peer
# IPv4 local connections:
host    all             all             192.168.10.0/24         md5
→192.168.10.0/24から接続できるように1行追加。
host    all             all             127.0.0.1/32            ident

重新加载设置更改。

$ pg_ctl reload
※ もしくはsystemctl reload postgresql-12でもいいはず。

更改postgres用户的密码(不更改也可)。

$ psql
alter role postgres with password 'postgres';

我会从远程进行连接确认(A5:已从SQL进行连接确认,但省略了说明)。

请按照以下方式执行对本地连接的确认。

$ psql testdb testuser

Password for user testuser: 
psql (12.0)
Type "help" for help.

testdb=> 

创建表格

我会创建一个表格并插入数据来试试。

testdb=> create table test (id int, value text);
CREATE TABLE
testdb=> insert into test (id, value) values (1, 'test text');
INSERT 0 1
testdb=> select * from test;
 id |   value   
----+-----------
  1 | test text
(1 row)

使用「\d」查看表格列表,使用「\du」查看角色列表。

testdb=> \d
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | test | table | testuser
(1 row)

testdb=> \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testuser  |                                                            | {}

其他设置更改

我觉得PostgreSQL的各种参数似乎都设置得比较小。我试着把共享缓冲区从128MB改成了512MB(总内存的20%至40%似乎是不错的选择)。虽然还有很多其他参数也应该修改,包括共享缓冲区,但因为这些参数是系统相关的,所以我本次不做更改。

共享缓冲区的更改方法如下所示。

# vi /data/postgresql.conf
※デフォルトでは「/var/lib/pgsql/12/data/postgresql.conf」

変更前)
shared_buffers = 128MB
変更後)
shared_buffers = 512MB

只需要重新启动PostgreSQL。

日志设定

我已将日志设置更改如下。

$ vi /data/postgresql.conf

在此之前的变动如下所示。

log_filename = 'postgresql-%a.log'
log_rotation_size = 0
#log_min_duration_statement = -1
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_lock_waits = off

修改后如下所示。

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_size = 1GB
log_min_duration_statement = 500ms
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0

使用pgbench进行基准测试

在PostgreSQL中,包含了用于基准测试的工具pgbench。首先,使用pgbench创建用于基准测试的表和数据。

$ pgbench -i -s 10 testdb
dropping old tables...
creating tables...
generating data...
100000 of 1000000 tuples (10%) done (elapsed 0.11 s, remaining 1.00 s)
200000 of 1000000 tuples (20%) done (elapsed 0.22 s, remaining 0.88 s)
300000 of 1000000 tuples (30%) done (elapsed 0.35 s, remaining 0.83 s)
400000 of 1000000 tuples (40%) done (elapsed 0.49 s, remaining 0.73 s)
500000 of 1000000 tuples (50%) done (elapsed 0.60 s, remaining 0.60 s)
600000 of 1000000 tuples (60%) done (elapsed 0.74 s, remaining 0.49 s)
700000 of 1000000 tuples (70%) done (elapsed 0.88 s, remaining 0.38 s)
800000 of 1000000 tuples (80%) done (elapsed 1.05 s, remaining 0.26 s)
900000 of 1000000 tuples (90%) done (elapsed 1.22 s, remaining 0.14 s)
1000000 of 1000000 tuples (100%) done (elapsed 1.37 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.

当准备好数据后,接下来需要运行基准测试。

$ pgbench -c 10 -j 10 -t 2000 -N testdb
starting vacuum...end.
transaction type: <builtin: simple update>
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 2000
number of transactions actually processed: 20000/20000
latency average = 2.408 ms
tps = 4152.303167 (including connections establishing)
tps = 4159.985652 (excluding connections establishing)

“-c 10” 表示客户端数为 “10”,”-t 1000″ 表示每个客户端的交易数量。

可以从执行基准测试后的缓存命中率来看,如下所示。

select relname,
   round(heap_blks_hit * 100 / (heap_blks_hit+heap_blks_read), 2)
   as cache_hit_ratio from pg_statio_user_tables
     where heap_blks_read > 0 order by cache_hit_ratio;

     relname      | cache_hit_ratio 
------------------+-----------------
 test             |           50.00
 pgbench_accounts |           96.00
 pgbench_history  |           99.00
 pgbench_tellers  |           99.00
 pgbench_branches |           99.00
(5 rows)

索引缓存命中率如下。

select relname, indexrelname,
   round(idx_blks_hit * 100 / (idx_blks_hit + idx_blks_read), 2)
   as cache_hit_ratio from pg_statio_user_indexes
     where idx_blks_read > 0 order by cache_hit_ratio;

     relname      |     indexrelname      | cache_hit_ratio 
------------------+-----------------------+-----------------
 pgbench_tellers  | pgbench_tellers_pkey  |           94.00
 pgbench_branches | pgbench_branches_pkey |           99.00
 pgbench_accounts | pgbench_accounts_pkey |           99.00
(3 rows)

如果要指定要安装的次要版本

执行以下命令后,您将看到可以安装的所有版本的显示如下。
您只需从中找到所需的版本并进行安装即可。

# yum --showduplicates search postgresql12-server
~省略~
postgresql12-server-12.0-1PGDG.rhel7.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server-12.1-1PGDG.rhel7.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server-12.1-2PGDG.rhel7.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server-12.2-1PGDG.rhel7.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server-12.2-2PGDG.rhel7.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server-12.3-1PGDG.rhel7.x86_64 : The programs needed to create and run a PostgreSQL server

如果是PostgreSQL 12.3版本或以上的情况下。

从12.3开始,安装postgresXX-devel需要LLVM相关的库。

# yum -y install postgresql12-devel
~省略~
Error: Package: postgresql12-devel-12.3-1PGDG.rhel7.x86_64 (pgdg12)
           Requires: llvm-toolset-7-clang >= 4.0.1
Error: Package: postgresql12-devel-12.3-1PGDG.rhel7.x86_64 (pgdg12)
           Requires: llvm5.0-devel >= 5.0

据说添加EPEL、SCL仓库就可以解决这个问题。

# yum -y install epel-release centos-release-scl

请参考

    • PostgreSQL を CentOS にインストールするには

 

    • PostgreSQL 12.0 Documentation

 

    pgbenchの使いこなし by Let’s Postgres
广告
将在 10 秒后关闭
bannerAds