首页 > 技术文章 > centos 6.x 编译安装 pgsql 9.6

hmwh 2019-09-21 15:19 原文

文章结构如下:

 

 

一. 环境配置

 

1. 配置防火墙

查看IPTABLES 当前状态与关闭过程

chkconfig --list|grep iptables

 关闭iptables

service iptables stop

chkconfig iptables off

 

关闭selinux

setenforce 0

vi /etc/sysconfig/selinux

将SELINUX值改为disabled

 

2.禁用Linux透明大页

 

1.查看透明大页是否启用

 

   RHEL  6:

 

# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

 

[oracle@rhel 6 ~]$ cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

[always] madvise never

 

  RHEL  7:

# cat /sys/kernel/mm/transparent_hugepage/enabled

[root@rhel 7 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled

 

[always] madvise never

 

2.禁用透明大页

 

RHEL 6:

 

(1).编辑 /etc/grub.conf 文件,在kernel 那一行后面追加 transparent_hugepage=never

 

例如:

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux 6 (2.6.32-642.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/rootvg-lvroot rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_LVM_LV=rootvg/lvswap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=rootvg/lvroot rd_NO_DM rhgb quiet transparent_hugepage=never

initrd /initramfs-2.6.32-642.el6.x86_64.img

 

(2).重启系统生效。

 

RHEL 7:

(1).编辑/etc/sysconfig/grub 文件,在 GRUB_CMDLINE_LINUX 那一行后面追加 transparent_hugepage=never

例如:

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"

GRUB_DEFAULT=saved

GRUB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rootvg/root rd.lvm.lv=rootvg/swap rhgb quiet transparent_hugepage=never"

GRUB_DISABLE_RECOVERY="true"

 

(2).再使用 grub2-mkconfig 生成grub.cfg配置文件。

# grub2-mkconfig -o /boot/grub2/grub.cfg

(3).重启系统使配置生效。

认为最简单方便的:查询大页配置

 

grep Huge /proc/meminfo

AnonHugePages:         0 kB  与透明大页有关,透明大页关闭,则显示0

HugePages_Total:   65560      大页总数量

HugePages_Free:    65560     

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

 

 

3.选择deadline IO调度

 

修改I/O调度器;需要在 /etc/grub.conf 加入elevator=deadline

 

kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/rootvg-lvroot rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_LVM_LV=rootvg/lvswap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=rootvg/lvroot rd_NO_DM rhgb quiet transparent_hugepage=never elevator=deadline rhgb quiet

 

重启后查看:

 

cat /sys/block/sda/queue/scheduler

 

 

 

 

二. 编译安装PG

 

1.安装依赖包

 利用yum安装所需的源码包:

 

rm -f /etc/yum.repos.d/*

mount /dev/cdrom /mnt

 

vi /etc/yum.repos.d/rhel-debuginfo.repo

 

[rhel-debuginfo]

name=rhel-debuginfo

baseurl=file:///mnt/

enabled=1

gpgcheck=0

 

 

yum clean all

yum -y install readline readline-develbison bison-devel flex flex-develzlib-devel gcc* c* lrzsz wget readline-devel uuid uuid-devel zlib* bison zlib-static readline-devel   --skip-broken

或者

yum -y install readline readline-develbison bison-devel flex flex-develzlib-devel gcc* c* lrzsz wget readline-devel uuid uuid-devel zlib* bison zlib-static readline-devel lib* rtld* e2fsprogs-deve*  --skip-broken

 

 

(yum一定要弄好,不行的话,建议网络yum)

 

 

2.下载源码

 

cd /usr/local/src

wget https://ftp.postgresql.org/pub/source/v9.6.3/postgresql-9.6.3.tar.gz

 

编译安装

 

mkdir -p /usr/local/pgsql

tar -zxvf postgresql-9.6.3.tar.gz

cd postgresql-9.6.3   

 

./configure --with-ossp-uuid --prefix=/usr/local/pgsql

或者是:

 ./configure --prefix=/usr/pgsql-9.6 --with-perl --with-tcl --with-python --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --with-uuid=ossp

 

 

gmake world    

gmake install-world

 

3.新建普通用户

 

groupadd postgres

useradd -g postgres postgres

 

创建数据库目录并授权

mkdir -p /pgsql/pg_data

mkdir -p /pgsql/pg_archive

mkdir -p /pgsql/pg_log

chown -R postgres:postgres /pgsql/pg_*

 

4. 配置环境变量

 

/home/postgres/.bash_profile

 

export PGHOME=/usr/local/pgsql

export PGDATA=/pgsql/pg_data

export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH

export DATE=`date +"%Y%m%d%H%M"`

export PATH=$PGHOME/bin:$PATH:.

export MANPATH=$PGHOME/share/man:$MANPATH

export PGUSER=postgres

export PGDATABASE=postgres

alias rm='rm -i'

alias ll='ls -lh'

export LANG="zh_CN.UTF8"

 

5.初始化数据库

su - postgres

source .bash_profile

 

initdb -D $PGDATA -E UTF-8 --locale=C -U postgres -W

 

 

6.postgresql.conf参数就设置

 

- 修改pg数据库配置文件,修改完成后如下(我的是虚拟机 8g内存):

 

 cat /pgsql/pg_data/postgresql.conf | egrep -v '^#|^$' | grep '^[a-zA-Z]'

                              

                  listen_addresses = '192.168.10.11'# what IP address(es) to listen on;  --监听IP

                  port = 5432# (change requires restart)

                  max_connections = 200# (change requires restart)

                  shared_buffers = 2GB# min 128kB  --建议为内存的1/4--1/2

                  temp_buffers = 256MB# min 800kB  --用于数据库会话访问临时表数据,可以在单独的session中对该参数进行设置,尤其是需要访问比较大的临时表时,将会有显著的性能提升。

                  work_mem = 12MB# min 64kB  --可以称之为工作内存或者操作内存。其负责内部的sort和hash操作,max_connections*work_mem+shared_buffers+temp_buffers+maintenance_work_mem+操作系统所需内存不能够超过整个的RAM大小,这是非常重要的

                  maintenance_work_mem = 512MB# min 1MB 要针对VACUUM,CREATE INDEX,REINDEX等操作。在对整个数据库进行VACUUM或者较大的index进行重建时,适当的调整该参数非常必要。

                  shared_preload_libraries = 'pg_stat_statements'# (change requires restart)

                  pg_stat_statements.max = 100

                  pg_stat_statements.track = all

                  wal_level = hot_standby # minimal, archive, or hot_standby

                  checkpoint_segments = 90 # in logfile segments, min 1, 16MB each  表示自动触发检查点时,当前最大的WAL日志文件段的数量

                  checkpoint_timeout = 5min # range 30s-1h 表示自动触发检查点的时间间隔。增大这个参数同样会延长系统崩溃后恢复的时间。

                  checkpoint_completion_target = 0.8# checkpoint target duration, 0.0 -1.0  该参数表示checkpoint的完成目标,系统默认值是0.5,也就是说每个checkpoint需要在checkpoints间隔时间的50%内完成

                  checkpoint_warning = 0# 0 disables 系统默认值是30秒,如果checkpoints的实际发生间隔小于该参数,将会在server log中写入写入一条相关信息。可以通过设置为0禁用信息写入。

                  archive_mode = on# allows archiving to be done

                  archive_command = 'test ! -f /pgsql/pg_archive/%f && cp %p /pgsql/pg\_archive/%f'# command to use to archive a logfile segment

                  archive_timeout = 0# force a logfile segment switch after this 这个参数只能在postgresql.conf文件中被设置。默认值是0。一般情况下,数据库只有在一个事务日志文件写满以后,才会切换到下一个事务日志文件,设定这个参数可以让数据库在一个事务日志文件尚未写满的情况下切换到下一个事务日志文件。

                  max_wal_senders = 6# max number of walsender processes  也就是说,max_wal_senders是为了让一个master端,带多个slave端用的,基本上每一对master--slave用一个链接。但是,还需要注意,pg_basebackup也会用到一个。

                  wal_keep_segments = 512 # in logfile segments, 16MB each; 0 disables WAL日志设置

                  synchronous_standby_names = ''# standby servers that provide sync rep

                  hot_standby = on# "on" allows queries during recovery

                  max_standby_streaming_delay = 30s# max delay before canceling queries

                  wal_receiver_status_interval = 10s# send replies at least this often 声明 pg_xlog 目录下所能保留的旧日志文件段的最小数目,备服务器需要获 取它们进行流复制

                  effective_cache_size = 5GB 优化器假设一个查询可以使用的最大内存(包括pg使用的和操作系统缓存),和shared_buffer等内存无关,只是给优化器生成计划使用的一个假设值。

                  log_destination = 'csvlog'# Valid values are combinations of stderr – 保存到.csv文件

                  logging_collector = on# Enable capturing of stderr and csvlog 是否将日志重定向至文件中,默认是off(该配置修改后,需要重启DB服务)

                  log_directory = '/pgsql/pg_log'# directory where log files are written,

                  log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'# log file name pattern,

                  log_rotation_age = 7d# Automatic rotation of logfiles will  单个日志文件的生存期,默认1天,在日志文件大小没有达到

                  log_rotation_size = 500MB# Automatic rotation of logfiles will 单个日志文件的大小,如果时间没有超过log_rotation_age

                  log_statement = 'mod'# none, ddl, mod, all 控制记录哪些SQL语句。将此配置设置为all可跟踪整个数据库执行的SQL语句。

                  log_timezone = 'America/Manaus' #日志时区 'Asia/Shanghai' 最好和服务器设置同一个时区,方便问题定位

                  track_activity_query_size = 3096 # (change requires restart)指定跟踪每个活动会话当前执行命令所保留的字节数,它们被用于pg_stat_activity.query域。默认值是1024。这个参数只能在服务器启动时被设置。

                  datestyle = 'iso, mdy'

                  timezone = 'America/Manaus'

                  lc_messages = 'C'# locale for system error message

                  lc_monetary = 'C'# locale for monetary formatting

                  lc_numeric = 'C'# locale for number formatting

                  lc_time = 'C'# locale for time formatting

                  default_text_search_config = 'pg_catalog.english'

 

7.pg_hba.conf 参数配置

 

 

TYPE 参数设置

TYPE 表示主机类型,值可能为:

若为 `local` 表示是unix-domain的socket连接,

若为 `host` 是TCP/IP socket

若为 `hostssl` 是SSL加密的TCP/IP socket 只能使用SSL TCP/IP连接,

 

DATABASE 参数设置

DATABASE 表示数据库名称,值可能为:

`all` ,`sameuser`,`samerole`,`replication`,`数据库名称` ,或者多个

数据库名称用 `逗号`,注意ALL不匹配 replication

 

USER 参数设置

 USER 表示用户名称,值可以为:

 `all`,`一个用户名`,`一组用户名` ,多个用户时,可以用 `,`逗号隔开,

 或者在用户名称前缀 `+` ;在USER和DATABASE字段,也可以写一个单独的

 文件名称用 `@` 前缀,该文件包含数据库名称或用户名称

 

ADDRESS 参数设置

该参数可以为 `主机名称` 或者`IP/32(IPV4) `或 `IP/128(IPV6)`,主机

名称以 `.`开头,`samehost`或`samenet` 匹配任意Ip地址

 

METHOD 参数设置

该值可以为"trust", "reject", "md5", "password", "scram-sha-256",

"gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert"

注意 若为`password`则发送的为明文密码

 

ident是Linux下PostgreSQL默认的local认证方式,凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。用户映射文件为pg_ident.conf,这个文件记录着与操作系统用户匹配的数据库用户,如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。比如,服务器上有名为user1的操作系统用户,同时数据库上也有同名的数据库用户,user1登录操作系统后可以直接输入psql,以user1数据库用户身份登录数据库且不需密码。很多初学者都会遇到psql -U username登录数据库却出现“username ident 认证失败”的错误,明明数据库用户已经createuser。原因就在于此,使用了ident认证方式,却没有同名的操作系统用户或没有相应的映射用户。解决方案:1、在pg_ident.conf中添加映射用户;2、改变认证方式。

md5是常用的密码认证方式,如果你不使用ident,最好使用md5。密码是以md5形式传送给数据库,较安全,且不需建立同名的操作系统用户。

password是以明文密码传送给数据库,建议不要在生产环境中使用。

trust是只要知道数据库用户名就不需要密码或ident就能登录,建议不要在生产环境中使用。

reject是拒绝认证。

 

注意

修改该配置文件中的参数,必须重启 `postgreSql`服务,若要允许其它IP地址访问

该主机数据库,则必须修改 `postgresql.conf` 中的参数 `listen_addresses` 为 `*`

重启:pg_ctl reload 或者 执行 SELECT pg_reload_conf()

 

配置以下参数

# TYPE  DATABASE        USER            ADDRESS                 METHOD

host    all            all             10.10.56.17/32             md5

 

"pg_hba.conf" 99L, 4720C

 

参数说明

host   参数表示安装PostgreSQL的主机

all    第一个all 表示该主机上的所有数据库实例

all    第二个all 表示所有用户

10.10.56.17/32  表示需要连接到主机的IP地址,32表示IPV4

md5    表示验证方式 

 

即上述表示允许IP地址为10.10.56.17的所有用户可以通过MD5的密码验证方式连接主机上所有的数据库

也可以指定具体的数据库名称和 用户

# TYPE  DATABASE        USER            ADDRESS                 METHOD

host    test            pgtest           10.10.56.17/32             md5

 

即表示允许地址为 10.10.56.17 的用户 pgtest通过 MD5方式 加密的密码方式连接主机上的 test 数据库

 

也可以指定整个网段

# TYPE  DATABASE        USER            ADDRESS                 METHOD

host    test            pgtest           0.0.0.0/0               md5

 

即表示允许 任意iP 通过用户名为 pgtest 和md5的 密码 验证方式连接主机上 test 的数据库

 

不进行密码验证

# TYPE  DATABASE        USER            ADDRESS                 METHOD

host    test            pgtest           0.0.0.0/0               trust

 

表示任意IP地址的用户 pgtest 无需密码验证可直接连接访问该主机的 test 数据库

 

8.开启数据库

 

pg_ctl start -D $PGDATA -l /home/pg_log/pgsql.log

 

 

 pg_ctl -D /pgsql/pg_data/ reload

 

9. 其他参数修改

由于安装需要进行热备份,且归档模式开启

 

开启WAL归档进行热备

创建归档目录

目录已经创建并且权限已经修改:/pgsql/pg_archive/

 

修改WAL_LEVEL参数

Wal_level 参数可选值有 minimal,replica,logical 级别依次增高,在WAL中包含的信息越多,minimal 这一级别的无法开启WAL归档。所以WAL归档至少设置为replica。

 

alter system set wal_level='replica';

select * from pg_settings where name='wal_level';

需要重启生效。

 

修改ARCHIVE_MODE参数

select * from pg_settings where name='archive_mode';

 

 

 

该参数值为on,off,always,默认为off,开启归档需要修改为on

 

 

重启后:

 

修改ARCHIVE_COMMAND参数

 

 

Archive_mode值可以是一条shell命令或者一个复杂的脚本,默认值为空。修改archive_command不需要重启,只需要reload,如果命令设置不成功,他会周期性的重试,再次期间已有的WAL文件将不会被重复。

 

pg_basebackup的命令行参数:

 

 

 

-D指定吧备份写道那个目录。

-F指定输出格式,其中,format为p(plain) 或者t(tar)。

-x或者--xlog:备份时会把备份中产生的xlog文件也自动备份出来,这样在恢复数据库时,应用这些xlogs文件把数据库推到一个一致的时间点,然后正真打开这个备份的数据库。这个与”-X fetch” 完全一样的。使用时需要设置”wal_keep_segments” 参数,以保证备份的过程中,WAL日志不会被覆盖。

-P 允许在备份过程中实时打印备份进度。

-v 详细模式,使用-P后,还会打印出正在备份的具体文件的信息。

 

有关pg_basebackup创建基础备份

修改:pg_hba.conf

 

postgresql.conf文件中,修改max_wal_senders参数:

 

max_wal_senders = 2

重启生效。

 

11以前这个参数要初始化的时候,才能设置wal大小。

 

wal_keep_segments 参数,wal日志,默认16M,修改完后要重启生效。

wal_keep_segments=128  --即设置WAL生成的XLOG日志为128M

 

WAL日志维护

1. 参数max_wal_size/min_wal_size

  9.5以前: (2 + checkpoint_completion_target) * checkpoint_segments + 1

  9.5:PostgreSQL 9.5 将废弃checkpoint_segments 参数, 并引入max_wal_size 和 min_wal_size 参数,

   通过max_wal_size和checkpoint_completion_target 参数来控制产生多少个XLOG后触发检查点,

   通过min_wal_size和max_wal_size参数来控制哪些XLOG可以循环使用。

2. 参数wal_keep_segments

   在流复制的环境中。使用流复制建好备库,如果备库由于某些原因接收日志较慢。导致备库还未接收到。就被覆盖了。导致主备无法同步。这个需要重建备库。

   避免这种情况提供了该参数。每个日志文件大小16M。如果参数设置64. 占用大概64×16=1GB的空间。根据实际环境设置。

3. pg_resetxlog

  在前面参数设置合理的话。是用不到pg_resetxlog命令。

 

推荐阅读