PostgreSQL安装

注意
本文最后更新于 2023-12-18,文中内容可能已过时。

postgreSQL是一种先进的对象关系数据库管理系统。它支持SQL标准的扩展子集,包括事务、外键、子查询、触发器、用户定义类型和功能。此发行版还包含C语言绑定。

1
2
3
4
# CentOS
yum install -y gcc make readline-devel openssl-devel zlib-devel systemd-devel uuid-devel
# Ubuntu
apt install -y gcc make libreadline6-dev libssl-dev zlib1g-dev libpam0g-dev libsystemd-dev uuid-dev
1
2
3
4
# wget https://ftp.postgresql.org/pub/source/v13.0/postgresql-13.0.tar.gz
wget https://mirror.tuna.tsinghua.edu.cn/postgresql/source/v14.10/postgresql-14.10.tar.gz
tar -zxf postgresql-14.10.tar.gz
cd postgresql-14.10
1
2
3
4
5
6
7
8
./configure \
--prefix=/usr/local/pgsql \
--with-openssl \
--with-pam \
--with-systemd \
--with-uuid=e2fs

make && make install

pg的扩展插件通常位于目录$PGHOME/share/extension中。编译安装过程中,通常安装PostgreSQL源码文件中的contrib文件夹中安装程序脚本。如果尚未安装,则目录中不会有这些插件。

比如安装 pgcrypto,进入contrib/pgcrypto,执行make && make install

查询到可用的Extension扩展

1
select * from pg_available_extensions;

安装Extension扩展

哪个库需要使用就在哪个库安装,否则会找不到。

1
CREATE EXTENSION pgcrypto;

生成一个uuid

1
select * from gen_random_uuid()

无法使用root初始化数据库,因此需要创建用户

1
2
3
4
5
useradd postgres -m -s /bin/bash
passwd postgres
mkdir -p /data/pgsql/{data,log}
touch /data/pgsql/log/pgsql.log
chown -R postgres:postgres /data/pgsql
1
2
3
4
5
6
7
8
vi /etc/profile

# set postgresql environment
export PGHOME=/data/pgsql
export PGBASE=/usr/local/pgsql
export PATH=$PATH:$PGBASE/bin

source /etc/profile
1
2
3
切换到postgres执行
su - postgres
initdb -D /data/pgsql/data

image-20201028163913488

1
vi /data/pgsql/data/pg_hba.conf

image-20201028164015211

TYPE:

local:使用Unix-domainsocket host:使用TCP/IP连接,可以是SSL的,也可以不是 hostssl:必须是SSL的 hostnossl:必须是非SSL的

DATABASE:

数据库名,可以是"all", “sameuser”, “samerole”, “replication”。all表示所有,但不包括replication。可以通过用逗号分隔的方法声明多个数据库, 也可以通过前缀@来声明一个包含数据库名的文件。

USER:

用户名,可以为"all",表示所有,也可以具体指定一个用户。多个用户名可以通过用逗号分隔的方法声明。一个包含用户名的文件可以通过在文件名前面前缀 @来声明。

ADDRESS:

可以是为一个主机名,或者由IP地址和CIDR掩码组成。掩码可以为0-32(IPv4)或者0-128(IPv6)间的一个整数,32表示子网掩码为255.255.255.255,24表示子网掩码为255.255.255.0。主机名规范以一个点(.)开头,匹配一个实际主机名后缀。samehost可以匹配所有主机、samenet可以匹配同一个掩码内的所有主机。

METHOD:

密码加密策略,password表示以明文方式发送密码,md5和scram-sha-256会以对应的方式加密再发送密码。

更多配置参考:pg_hba.conf文件

1
2
3
4
5
listen_addresses = '*'
log_destination = 'csvlog'
logging_collector = on
log_rotation_age = 1d
log_truncate_on_rotation = on

其他的参数保持默认

切换root用户

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cat > /usr/lib/systemd/system/postgresql.service << 'EOF'
[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking
 
User=postgres
Group=postgres
 
# Port number for server to listen on
#Environment=PGPORT=5432
 
# Location of database directory
Environment=PGDATA=/data/pgsql/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
 
#ExecStartPre=/usr/local/pgsql/bin/postgresql-check-db-dir ${PGDATA}
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} 
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} 
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA}
 
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
 
[Install]
WantedBy=multi-user.target
EOF
1
systemctl enable postgresql.service --now

image-20201028164323098

postgres用某个用户登录,默认登录同名数据库,如果用户名和数据库不同,需要特别指定,否则会报找不到库!

例:

1
psql -U test -d postgres

-U 指定用户

-d 指定数据库

1
2
3
4
5
6
7
8
postgres@server:~$ psql
psql (14.10)
Type "help" for help.

postgres=# \password
Enter new password for user "postgres": 
Enter it again: 
postgres=# \q
1
2
3
4
5
6
7
8
9
docker run -d \
    --name postgres \
    -e POSTGRES_DB=db \
    -e POSTGRES_USER=postgres
    -e POSTGRES_PASSWORD=postgres \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -e TZ=PRC
    -v /data/pgdata:/var/lib/postgresql/data \
    postgres

相关内容