centos7 下安装postgresql数据库

张彤 2022年03月28日 70次浏览

最近打算写一个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

  1. 安装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
  1. 创建数据存储目录
    大部分数据库服务器是系统盘和数据盘分离的,一般是需要制定数据目录的
# 创建目录
mkdir /mnt/pgdata/
# 赋权
chown postgres:postgres /mnt/pgdata/
  1. 修改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
  1. 安装pg-10
    创建数据库集群包括
    • 创建数据库数据所在的目录、
    • 生成共享目录表(属于整个集群而不属于任何特定数据库的表)
      这里的集群可以理解为数据库簇,是一个集合概念,不是通常意义下的分布式概念。一个服务器上,同一个数据库服务可以管理此服务器上多个同类型数据库。
    • 创建 template1和 postgres 数据库。
sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
sudo systemctl enable postgresql-10
sudo systemctl start postgresql-10

至此数据库启动,安装完毕,下面介绍需要进行更改的相关配置项


配置pg10

  1. 修改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
  1. 修改密码
psql
Type "help" for help.

postgres=# \password
Enter new password for user "postgres": 
Enter it again: 
postgres=# 
  1. 变更配置文件,主要是端口,日志和远程登陆
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是日志前缀,可以使用以下参数进行设置
    日志前缀.png

  • 日志里写点什么
    log_statement 记录了日志里具体写点什么,它有四个参数

    • 'off'
    • 'ddl'
      记录所有数据定义语句,例如CREATEALTERDROP语句
    • 'mod'
      mod记录所有ddl语句,外加数据修改语句例如INSERT, UPDATEDELETETRUNCATE, 和COPY FROM。 如果PREPAREEXECUTEEXPLAIN ANALYZE包含合适类型的命令,它们也会被记录
    • 'all'
      all这个参数看似很香,在生产环境中却不是那么ok。它将记录所有的select语句,加重没有必要的服务器负担