最近打算写一个pg主-备的文章,结果就到了这个节点上,一直犹豫要不要写pg的安装,因为如果新手入门,按官方文档两三步就装好了,但是官方文档好多细节也没体现出来,今天权当重复一下这个简单的过程。
- 本文以centos7下安装pg-10 为例
- 本文是以腾讯云为例进行安装,默认yum源已经配置好。
- 离线部署后期会在此文中追加
删除原有系统中的pg
- 此段可选,如果你想在系统中保留两个版本的pg,请跳过此步骤
yum remove postgresql*
# rm -rf /var/lib/pgsql/{pg_version}
rm -rf /var/lib/pgsql/10
第一句的 yum remove
是删除所有安装的pg服务
第三局则是删除旧有版本的数据库
- 注:
/var/lib/pgsql/10
是默认的postgresql 安装位置,里面包含了数据库数据,删除前注意备份。
安装pg10
- 安装pg10 服务
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql10-server
- 创建数据存储目录
大部分数据库服务器是系统盘和数据盘分离的,一般是需要制定数据目录的
# 创建目录
mkdir /mnt/pgdata/
# 赋权
chown postgres:postgres /mnt/pgdata/
- 修改pg的安装环境变量
这步是关键,pg在centos7下默认使用systemctl 配置文件中的环境变量,而不是bash_profile 中的环境变量,所以这里需要修改
sudo vim /usr/lib/systemd/system/postgresql-10.service
# 修改以下变量
#Environment=PGDATA=/var/lib/pgsql/10/data/
Environment=PGDATA=/mnt/pgdata/
wq
保存退出,重载配置,使之生效
systemctl daemon-reload
- 安装pg-10
创建数据库集群包括- 创建数据库数据所在的目录、
- 生成共享目录表(属于整个集群而不属于任何特定数据库的表)
这里的集群可以理解为数据库簇,是一个集合概念,不是通常意义下的分布式概念。一个服务器上,同一个数据库服务可以管理此服务器上多个同类型数据库。 - 创建 template1和 postgres 数据库。
sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
sudo systemctl enable postgresql-10
sudo systemctl start postgresql-10
至此数据库启动,安装完毕,下面介绍需要进行更改的相关配置项
配置pg10
- 修改postgresql 用户的环境变量
su - postgres
vim .bash_profile
# 修改$PGDATA变量
#PGDATA=/var/lib/pgsql/10/data
PGDATA=/mnt/pgdata
# set path
PATH="$PATH://usr/pgsql-10/bin/"
wq
退出,从文件中加载环境变量
source .bash_profile
- 修改密码
psql
Type "help" for help.
postgres=# \password
Enter new password for user "postgres":
Enter it again:
postgres=#
- 变更配置文件,主要是端口,日志和远程登陆
vim /mnt/pgdata/postgresql.conf
# 修改如下内容
#listen_addresses = 'localhost' # what IP address(es) to listen on;
listen_addresses = '*' # what IP address(es) to listen on;
# 共享缓冲区大小,官方建议是RAM的 1/4
shared_buffers = 1GB
#port = 5432 # (change requires restart)
port = 15432 # (change requires restart)
修改 pg_hba.conf
vim /mnt/pgdata/pg_hba.conf
# remote access
host all all 0.0.0.0/0 md5
# 重启生效
systemctl restart postgresql-10
至此,可以远程可以访问postgresql-10了。
日志项配置
日志部分的配置也很重要,因为日志是我们排错的重要依据
- 日志的位置
一般而言,日志需要备份到其他磁盘,保证故障时,日志可读。
log_directory
指定日志路径
log_filename
指定日志格式
比如你可以将其设置为
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
则日志名称显示postgresql-2022-03-28_000000.log
- 日志目标设置
log_destination
配置项有如下四个选项- stderr
- syslog
- csv
- eventlog
除非有充分的理由将日志事件以逗号分隔的格式保存或Windows中的事件日志保存,否则建议将此参数设置为stderr
。这是因为对于CSV文件目标,自定义的log_line_prefix
参数值(文本类型的行前缀)将没有任何效果,但是可以使前缀包含有价值的信息。
但是,另一方面,CSV日志可以轻松导入数据库表中,然后使用标准SQL查询。一些PostgreSQL用户发现它比处理原始日志文件更方便。稍后我们将看到,现代的日志管理解决方案可以本地解析PostgreSQL日志并自动从中创建有意义的见解。使用CSV,报告和可视化必须由用户手动完成。
最终,它取决于您的选择。如果您愿意创建自己的数据接收管道以将CSV日志加载到数据库表中,清理和转换数据以及创建适合您的业务需求的自定义报告,那么请确保将log_destination
设置为CSV
。
-
日志前缀,使日志更有意义
log_line_prefix
是日志前缀,可以使用以下参数进行设置
-
日志里写点什么
log_statement
记录了日志里具体写点什么,它有四个参数- 'off'
- 'ddl'
记录所有数据定义语句,例如CREATE
、ALTER
和DROP
语句 - 'mod'
mod记录所有ddl语句,外加数据修改语句例如INSERT
,UPDATE
、DELETE
、TRUNCATE
, 和COPY FROM
。 如果PREPARE
、EXECUTE
和EXPLAIN ANALYZE
包含合适类型的命令,它们也会被记录 - 'all'
all
这个参数看似很香,在生产环境中却不是那么ok。它将记录所有的select
语句,加重没有必要的服务器负担