PostgreSQL安装
postgreSQL是一种先进的对象关系数据库管理系统。它支持SQL标准的扩展子集,包括事务、外键、子查询、触发器、用户定义类型和功能。此发行版还包含C语言绑定。
1 编译安装
1.1 安装依赖
# 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-dev1.2 下载解压
# wget https://ftp.postgresql.org/pub/source/v14.10/postgresql-14.10.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.101.3 安装
./configure \
--prefix=/usr/local/pgsql \
--with-openssl \
--with-pam \
--with-systemd \
--with-uuid=e2fs
make && make install1.4 EXTENSION扩展
pg的扩展插件通常位于目录$PGHOME/share/extension中。编译安装过程中,通常安装PostgreSQL源码文件中的contrib文件夹中安装程序脚本。如果尚未安装,则目录中不会有这些插件。
比如安装 pgcrypto,进入contrib/pgcrypto,执行make && make install。
查询到可用的Extension扩展
select * from pg_available_extensions;安装Extension扩展
哪个库需要使用就在哪个库安装,否则会找不到。
CREATE EXTENSION pgcrypto;生成一个uuid
select * from gen_random_uuid()1.5 添加用户并授权
无法使用root初始化数据库,因此需要创建用户
useradd postgres -m -s /bin/bash
mkdir -p /data/pgsql/data
chown -R postgres:postgres /data/pgsql1.6 添加环境变量
vi /etc/profile
# set postgresql environment
export PGHOME=/data/pgsql
export PGBASE=/usr/local/pgsql
export PATH=$PATH:$PGBASE/bin
source /etc/profile1.7 初始化数据
su - postgres -c "initdb -D /data/pgsql/data"
1.8 修改pg_hba.conf文件
vi /data/pgsql/data/pg_hba.conf
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.9 修改postgresql.conf配置文件
vi /data/pgsql/data/postgresql.conflisten_addresses = '*'
timezone = 'Asia/Shanghai'
log_destination = 'csvlog'
logging_collector = on
log_filename = 'postgresql-%d.log'
log_truncate_on_rotation = on
log_timezone = 'Asia/Shanghai'其他的参数保持默认
1.10 添加systemctl管理
切换root用户
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
EOF1.11 启动并自启
systemctl enable postgresql.service --now1.12 登录数据库并设置密码

postgres用某个用户登录,默认登录同名数据库,如果用户名和数据库不同,需要特别指定,否则会报找不到库!
例:
psql -U test -d postgres-U 指定用户
-d 指定数据库
postgres@server:~$ psql
psql (14.10)
Type "help" for help.
postgres=# \password
Enter new password for user "postgres":
Enter it again:
postgres=# \q2 容器启动
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