一、环境准备
1、环境信息
192.168.184.181 centos7
2、官网获取在线安装脚本
https://www.postgresql.org/
(1)选择对应的操作系统
例如,选择Linux
(2)获取安装脚本
(3)安装脚本如下
# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
sudo yum install -y postgresql14-server
# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
3、官网获取离线安装包
https://www.postgresql.org/download/
4、也可以在镜像网站进行下载
如果官网下载慢的话,也可以在镜像网站下载
https://mirrors.tuna.tsinghua.edu.cn/postgresql/source/v17.5/
5、网盘地址
我这里提供17.4和17.5版本
链接: https://pan.baidu.com/s/1rMfFUkFpjngSqDWEc2tESw?pwd=rfit
提取码: rfit
二、安装PostgreSQL17.4
这里有两种安装方式,一种是在线安装,一种是离线安装,我习惯离线安装,有网的话也可以进行在线安装。
1、上传安装包
cd /root/
ll
2、解压安装包
cd /root/
tar -xf postgresql-17.4.tar.gz
ll
3、安装依赖
yum -y install gcc gcc-c++ make libicu-devel bison flex readline-devel zlib-devel
4、编译安装
cd /root/
cd postgresql-17.4/
./configure --prefix=/usr/local/pgsql
make
make install
5、添加数据库用户,并创建数据存储目录
useradd postgres
passwd postgres
mkdir /usr/local/pgsql/data
chown postgres:postgres /usr/local/pgsql/data
这里我设置的postgres用户密码也是postgres
6、配置环境变量
vim /etc/profile.d/pgsql.sh
添加如下内容
export PGHOME=/usr/local/pgsql
export PGDATA=/usr/local/pgsql/data
export PATH=$PGHOME/bin:$PATH
使用环境变量生效
source /etc/profile.d/pgsql.sh
7、 系统参数优化
vim /etc/sysctl.conf
添加以下内容
vm.nr_hugepages = 6144
使用参数生效
sysctl -p
8、初始化数据库
(1)切换到postgres用户
su - postgres
(2)执行数据初始化
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
(3)退出postgres用户
exit
9、修改配置文件
vim /usr/local/pgsql/data/postgresql.conf
修改以下配置:
listen_addresses = '*'
max_connections = 300
shared_buffers = 2GB
work_mem = 32MB
maintenance_work_mem = 1GB
effective_cache_size = 12GB
wal_buffers = 8MB
checkpoint_completion_target = 0.9
参数解释:
1、listen_addresses:
监听地址,默认使用localhost,使用'*'表示所有
2、max_connections:
决定允许的最大数据库连接数。
过多的连接会增加系统开销和资源竞争。
通常可以使用连接池工具(如PgBouncer)来控制并发连接数;
3、shared_buffers:
这是PostgreSQL用于缓存表数据的共享内存区域,通常建议设置为物理内存的25%-40%。
如果设置过低,会导致频繁的磁盘访问;设置过高则会占用操作系统内存,减少可用的文件缓存;
4、work_mem:
每个查询操作(如排序、哈希表)所使用的内存。
这个参数是每个查询连接单独分配的,因此需要根据查询复杂度和并发量合理设置。
如果过小,查询需要频繁进行磁盘交换;过大会导致内存不足。
典型值在10MB-100MB之间;
5、maintenance_work_mem:
控制PostgreSQL在执行维护操作时使用的内存大小,比如创建索引、VACUUM。推荐设置为较大的值,尤其是在大规模数据集上操作时;
6、effective_cache_size:
PostgreSQL根据此参数判断系统可用的文件系统缓存大小,从而决定是否使用索引扫描或全表扫描。
建议设置为物理内存的50%-75%;
7、wal_buffers:
建议设置为shared_buffers的1/32,用于缓冲WAL数据,避免频繁写入磁盘;
8、checkpoint_completion_target:
设置为接近1的值可以平滑WAL日志写入压力,减少突发I/O操作。
(1)listen_addresses
(2)max_connections
(3)shared_buffers
(4)work_mem
(5)maintenance_work_mem
(6)effective_cache_size
(7)wal_buffers
(8)checkpoint_completion_target
10、启动服务
(1)使用自带脚本方式启动
复制源码包里的脚本至etc/init.d目录下,并加执行权限
cd /root/postgresql-17.4
cp ./contrib/start-scripts/linux /etc/init.d/postgresql
chmod +x /etc/init.d/postgresql
chown -R postgres:postgres /usr/local/pgsql
启动服务
su - postgres
service postgresql start
service postgresql status
输入密码:
postgres
设置开机启动
chkconfig --add postgresql
(2)使用systemd进行管理
vim /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network-online.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGDATA=/usr/local/pgsql/data
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA}
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -m fast
ExecReload=/home/postgres/bin/pg_ctl reload -D ${PGDATA}
TimeoutSec=300s
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start postgresql
systemctl status postgresql
(3)直接使用命令行启动
su - postgres
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile status
三、常用操作
1、登录数据库
(1)切换到postgres用户
su - postgres
psql
(2)或在root用户下使用以下命令
psql -U postgres
2、查看当前连接用户
\c
select user;
select current_user;
select current_database();
3、创建数据库
create database mydb;
4、切换数据库
\c mydb
\l 列举数据库
\dt 列举表
\d tblname 查看表结构
\di 查看索引
5、创建角色与用户并授权
PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组,这取决于角色被怎样设置。角色可以拥有数据库对象(例如,表和函数)并且能够把那些对象上的权限赋予给其他角色来控制谁能访问哪些对象。此外,还可以把一个角色中的成员资格授予给另一个角色,这样允许成员角色使用被赋予给另一个角色的权限。
角色的概念把“用户”和“组”的概念都包括在内。在PostgreSQL版本 8.1 之前,用户和组是完全不同的两种实体,但是现在只有角色。任意角色都可以扮演用户、组或者两者。
(1)创建用户
CREATE USER pgtest1 with password 'admin';
CREATE USER等同于CREATE ROLE, 但CREATE USER默认包含LOGIN,而CREATE ROLE不包含。
如下两者等价,创建具有登录权限的角色:
CREATE ROLE pgtest2 with password 'admin' LOGIN;
CREATE USER pgtest3 with password 'admin';
(2)查看用户
查看角色信息
\du
\du+
select * from pg_roles;
(3)创建schema(与用户名同名【租户】)
\c mydb;
create schema pgtest1;
create schema pgtest2;
create schema pgtest3;
(4)授权
授权用户的schema所有权限
GRANT ALL PRIVILEGES ON SCHEMA pgtest1 TO pgtest1;
GRANT ALL PRIVILEGES ON SCHEMA pgtest2 TO pgtest2;
GRANT ALL PRIVILEGES ON SCHEMA pgtest3 TO pgtest3;
(5)回收权限
REVOKE ALL PRIVILEGES ON SCHEMA pgtest3 FROM pgtest3;
6、普通用户登录
psql -U pgtest1 -d mydb
四、配置远程访问
1、 编辑配置
su - postgres
vim /usr/local/pgsql/data/pg_hba.conf
添加如下内容:
#添加以下内容,管理员用户postgres不允许远程连接
host all postgres 0.0.0.0/0 reject
host all all 0.0.0.0/0 password
2、重启数据库
service postgresql restart
3、使用客户端工具进行连接
这里我使用navicat进行连接
五、注意
1、系统参数hugepages设置问题
如果hugepages设置超过当前设置的内存会出现如下的问题,例如,当前我的虚拟机设置的是4G内存,而hugepages设置超过4G的内存会出现系统无法登陆的问题,这个要注意!!
vim /etc/sysctl.conf
添加以下内容
vm.nr_hugepages = 6144