openEuler23.09安装Postgresql16.3,基于源代码编译安装PostgreSQL的基本步骤
一、PostgreSQL数据库服务环境搭建
操作系统版本
openEuler-23.09-x86_64-dvd.iso ,安装步骤此处省略。。。
最常用且直接的方法来查看openEuler的版本号是查看/etc/os-release文件
[root@openEuler ~]$ cat /etc/os-release
NAME="openEuler"
VERSION="23.09"
ID="openEuler"
VERSION_ID="23.09"
PRETTY_NAME="openEuler 23.09"
ANSI_COLOR="0;31"
1.1、下载及上传Postgresql16.3源代码包
Postgresql16.3 下载地址
https://www.postgresql.org/ftp/source/v16.3/
1.2、关闭防火墙
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
1.3、关闭SELINUX防火墙
vi /etc/selinux/config
将内容
SELINUX=enforcing
更改为
SELINUX=disabled
1.4、安装依赖包
mount /dev/cdrom /mnt
yum install -y cmake make gcc zlib gcc-c++ perl readline readline-devel zlib zlib-devel perl python36 tcl openssl ncurses-devel openldap pam
1.5、创建用户及属组
groupadd -g 61600 pgsql
useradd -u 61600 -g pgsql pgsql
passwd pgsql
1.6、创建目录及授权
mkdir -p /postgresql/pgdata
mkdir -p /postgresql/backup
mkdir -p /postgresql/pgsql16
mkdir -p /postgresql/soft
chown -R pgsql:pgsql /postgresql
chmod -R 775 /postgresql
1.7、解压数据库软件
su - pgsql
cd /postgresql/soft
tar zxvf postgresql-16.3.tar.gz
cd postgresql-16.3
2、从源代码编译和安装PostgreSQL
2.1、编辑环境变量
vi ~/.bash_profile
export LANG=en_US.UTF8
export PGPORT=5432
export PGDATA=/postgresql/pgdata
export PGHOME=/postgresql/pgsql16
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
export DATE=`date +"%Y%m%d%H%M"`
export MANPATH=$PGHOME/share/man:$MANPATH
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
alias psql="rlwrap psql"
source ~/.bash_profile
2.2、从源代码编译和安装PostgreSQL
./configure --prefix=/postgresql/pgsql16 --without-readline
make
make install
1. ./configure --prefix=/postgresql/pgsql16 --without-readline
./configure 是一个脚本,用于检查您的系统以确认是否有编译PostgreSQL所需的所有库和工具。
--prefix=/postgresql/pgsql16 指定了PostgreSQL的安装目录。这意味着当您执行 make install 时,PostgreSQL的文件将被安装到 /postgresql/pgsql16 目录下。
--without-readline 是一个选项,告诉 configure 脚本不要包含 readline 库的支持。readline 是一个库,它允许用户通过命令行界面(CLI)编辑和重新调用命令历史。在某些情况下,为了减小安装大小或避免与系统中的其他库冲突,您可能想要禁用它。
2. make
一旦 ./configure 脚本成功运行,它将生成一个 Makefile 文件,该文件包含了构建PostgreSQL所需的所有命令和设置。
make 命令会读取这个 Makefile 并开始编译源代码。编译过程可能会花费一些时间,具体取决于您的系统性能。
3. make install
当 make 命令成功完成后,您可以使用 make install 命令将编译好的PostgreSQL文件安装到之前通过 --prefix 选项指定的目录中(在这个例子中是 /postgresql/pgsql16)。
这个命令还会安装必要的脚本、配置文件和其他文件,以便您可以轻松地启动、停止和管理PostgreSQL服务器。
2.3、初始化数据库
su - pgsql
/postgresql/pgsql16/bin/initdb -D /postgresql/pgdata -E UTF8 --locale=en_US.utf8 -U postgres
-- 执行命令输入的提示。。。。
The database cluster will be initialized with locale "en_US.utf8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /postgresql/pgdata ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/postgresql/pgsql16/bin/pg_ctl -D /postgresql/pgdata -l logfile start
-- 提示启动数据库服务
[pgsql@openEuler:/postgresql/soft/postgresql-16.3]$/postgresql/pgsql16/bin/pg_ctl -D /postgresql/pgdata -l logfile start
waiting for server to start.... done
server started
-- 检查postgresql 状态
[pgsql@openEuler:/postgresql/soft/postgresql-16.3]$pg_ctl status
pg_ctl: server is running (PID: 12282)
/postgresql/pgsql16/bin/postgres "-D" "/postgresql/pgdata"
这条命令是用于初始化一个新的 PostgreSQL 数据库集群的。这里,我会详细解释这条命令中的每个部分:
-
/postgresql/pgsql16/bin/initdb:
- 这是 initdb 命令的完整路径。initdb 是 PostgreSQL 提供的一个工具,用于创建一个新的数据库集群。
- /postgresql/pgsql16/bin/ 是这个 initdb 命令所在的目录。这通常意味着一个安装在 /postgresql/pgsql16 下的 PostgreSQL 16 版本。
-
-D /postgresql/pgdata:
- -D 选项用于指定数据目录的路径。
- /postgresql/pgdata 是你希望新数据库集群的数据文件存放的位置。
-
-E UTF8:
- -E 选项用于设置新数据库的默认字符编码。
- UTF8 是一种广泛使用的字符编码,可以表示几乎世界上所有的字符。
-
–locale=en_US.utf8:
- –locale 选项用于设置新数据库的区域设置。
- en_US.utf8 表示使用美国英语的区域设置,并使用 UTF-8 字符编码。
-
-U postgres:
- -U 选项用于指定数据库超级用户的名称。
- 在这里,超级用户的名称被设置为 postgres,这是 PostgreSQL 的默认超级用户名称。
执行这条命令后,initdb 会创建一个新的数据库集群在 /postgresql/pgdata 目录下,并配置为使用 UTF8 字符编码和美国英语的区域设置。之后,你可以使用 pg_ctl 或其他 PostgreSQL 工具(如 postgres 命令行工具)来启动这个数据库集群。
注意:在执行这条命令之前,你可能需要确保 /postgresql/pgdata 目录不存在或为空,因为 initdb 不会覆盖现有的数据。同时,你也需要确保有适当的权限来写入 /postgresql/pgdata 目录。
2.3、编辑postgresql.conf
vi /postgresql/pgdata/postgresql.conf
listen_addresses = '*'
port = 5432
max_connections = 512
#logging_collector = off ===>>logging_collector = on
#log_directory = 'log' ===>>log_directory = 'pg_log'
#log_truncate_on_rotation = off ===>> log_truncate_on_rotation = on
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' ===>> log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
shared_buffers = 2048MB # 默认是 128MB
max_wal_size = 1GB
min_wal_size = 256MB # 默认是 80MB
2.4、编辑pg_hba.conf
vi /postgresql/pgdata/pg_hba.conf
在IP v4下增加
host all all 0.0.0.0/0 md5
配置 PostgreSQL 的访问控制。这行配置的含义如下:
- host: 表示这是一个基于主机的认证方法。
- all: 第一个 all 表示允许所有数据库被访问。
- all: 第二个 all 表示允许所有用户进行认证。
- 0.0.0.0/0: 这是一个 CIDR 地址,表示允许来自任何 IP 地址的连接。这通常用于测试或内部网络,但在生产环境中可能会带来安全风险。
- md5: 表示使用 MD5 加密的密码进行认证。
这条配置行允许来自任何 IP 地址的任何用户连接到 PostgreSQL 数据库集群上的任何数据库,并使用 MD5 加密的密码进行认证。
注意:在生产环境中,这样的配置是非常不安全的,因为它允许任何人连接到你的数据库,只要他们知道正确的用户名和密码。你应该根据你的具体需求和安全策略来限制哪些用户可以从哪些 IP 地址访问哪些数据库。
编辑完 pg_hba.conf 文件后,你需要重启 PostgreSQL 服务以使更改生效。
pg_ctl stop
pg_ctl start
-- or
/postgresql/pgsql16/bin/pg_ctl -D /postgresql/pgdata stop
/postgresql/pgsql16/bin/pg_ctl -D /postgresql/pgdata start
3、数据库级别配置及检查
3.1、登陆检查
psql -h 127.0.0.1 -p 5432
=======
查看
\db+ List of tablespaces
\l List of databases
\du+ List of roles
postgres=# select version();
version
-----------------------------------------------------------------------------------------------------------
PostgreSQL 16.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.3.1 (openEuler 12.3.1-16.oe2309), 64-bit
(1 row)
postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+------------+------------+------------+-----------+-----------------------
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(3 rows)
postgres=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------+----------+----------+-------------------+---------+--------+-------------
pg_default | postgres | | | | 22 MB |
pg_global | postgres | | | | 565 kB |
(2 rows)
postgres=# \du+
List of roles
Role name | Attributes | Description
-----------+------------------------------------------------------------+-------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS |
3.2、修改postgres密码
postgres=# alter user postgres with password 'Rootroot@2024';
ALTER ROLE
3.3、创建用户及设置拥有某个数据库上的所有权限
3.3.1、创建用户
这个命令创建了一个名为pgdba_u1的用户,并为其设置了密码pgUps@2024。同时,由于NOCREATEDB选项,这个用户将没有权限创建新的数据库。
create user pgdba_u1 with password 'pgUps@2024' nocreatedb;
3.3.2、创建数据库并设置pgdba_u1为其拥有者
创建了一个名为pgdb01的数据库,并设置pgdba_u1为其拥有者
create database pgdb01 with owner=pgdba_u1;
3.3.3、授予用户所有权限
GRANT ALL PRIVILEGES ON DATABASE pgdb01 to pgdba_u1;
由于pgdba_u1已经是pgdb01的拥有者,默认已经拥有这个数据库上的所有权限。这个GRANT语句实际上在这种情况下是多余的。但是,如果您以后将其他用户设置为拥有者,或者出于某种原因需要明确授予权限,那么这个命令是有用的。
3.3.4、将用户提升为超级用户
ALTER ROLE pgdba_u1 WITH SUPERUSER;
这个命令将pgdba_u1用户提升为超级用户。这意味着该用户可以执行任何操作,包括创建和删除数据库、用户和角色等。
这通常是一个敏感的操作,因为超级用户具有对数据库系统的完全控制权。在生产环境中,应该谨慎授予超级用户权限,并确保只有必要的人员具有这些权限。
3.4、用户pgdba_u1登陆创建测试表及查看相关信息
[pgsql@openEuler:/postgresql/soft/postgresql-16.3]$psql -h 192.168.80.239 -p 5432 -U pgdba_u1 -d pgdb01
Password for user pgdba_u1:
psql (16.3)
Type "help" for help.
pgdb01=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+------------+------------+------------+-----------+-----------------------
pgdb01 | pgdba_u1 | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =Tc/pgdba_u1 +
| | | | | | | | pgdba_u1=CTc/pgdba_u1
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(4 rows)
pgdb01=# select rolname,rolpassword from pg_authid;
rolname | rolpassword
-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------
pg_database_owner |
pg_read_all_data |
pg_write_all_data |
pg_monitor |
pg_read_all_settings |
pg_read_all_stats |
pg_stat_scan_tables |
pg_read_server_files |
pg_write_server_files |
pg_execute_server_program |
pg_signal_backend |
pg_checkpoint |
pg_use_reserved_connections |
pg_create_subscription |
postgres | SCRAM-SHA-256$4096:4xevb/JS9Chmb3wI0JzBLA==$GbYrz3EO1JLuj2rszPFhLztLzpYlMMr3YaEihl4wOKM=:FfC3v/RwnmsXBIeDQ/DUlrcxSHBs51vOA2a9gXgHyR8=
pgdba_u1 | SCRAM-SHA-256$4096:yMyYUPCwuTttLo+6GRUXeQ==$O/e9mimxth+JCmfNw+YeYd+R/Cnm2Prp6gnnhVMuqfE=:RA3PWeVmQa7lk5L3UWZvMMJUP0DDAeCTttNHp1n2wbA=
(16 rows)
pgdb01=# create table t_testpg (name varchar(50));
CREATE TABLE
pgdb01=# insert into t_testpg values('PostgreSQL12');
INSERT 0 1
pgdb01=# insert into t_testpg values('PostgreSQL13');
INSERT 0 1
pgdb01=# insert into t_testpg values('PostgreSQL14');
INSERT 0 1
pgdb01=# insert into t_testpg values('PostgreSQL15');
INSERT 0 1
pgdb01=# insert into t_testpg values('PostgreSQL16');
INSERT 0 1
pgdb01=# select * from t_testpg;
name
--------------
PostgreSQL12
PostgreSQL13
PostgreSQL14
PostgreSQL15
PostgreSQL16
(5 rows)
pgdb01=# \dt t_testpg
List of relations
Schema | Name | Type | Owner
--------+----------+-------+----------
public | t_testpg | table | pgdba_u1
(1 row)
pgdb01=# \du+
List of roles
Role name | Attributes | Description
-----------+------------------------------------------------------------+-------------
pgdba_u1 | Superuser |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS |
3.5、给表和表字段添加备注
pgdb01=# comment on table t_testpg is 'the first table of openEluer os for postgresql';
COMMENT
pgdb01=# comment on column t_testpg.name is 'information name of value';
COMMENT
pgdb01=#
pgdb01=# \dt t_testpg
List of relations
Schema | Name | Type | Owner
--------+----------+-------+----------
public | t_testpg | table | pgdba_u1
(1 row)
pgdb01=# \dt+ t_testpg
List of relations
Schema | Name | Type | Owner | Persistence | Access method | Size | Description
--------+----------+-------+----------+-------------+---------------+------------+------------------------------------------------
public | t_testpg | table | pgdba_u1 | permanent | heap | 8192 bytes | the first table of openEluer os for postgresql
(1 row)
pgdb01=# \d+ t_testpg
Table "public.t_testpg"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+-----------------------+-----------+----------+---------+----------+-------------+--------------+---------------------------
name | character varying(50) | | | | extended | | | information name of value
Access method: heap