centos7下安装PostgreSQL(源码安装)

获取源码

安装PostgreSQL的方法有很多,我们可以使用centos下的包管理器安装,也可以从官网下载二进制压缩包安装,但是很多时候包管理器的仓库和官网的二进制压缩包提供的版本过少,不能完全满足我们的需求。这时候我们可以选择从官网下载源码,自己编译安装。
从官网下载PostgreSQL源代码 https://www.postgresql.org/download/,选择source选项,下载对应版本的源码压缩包即可,根据自己的喜爱,可以选择下载tar.gz格式或者tar.bz2格式的压缩包。

前期准备

在编译之前,我们需要先新增一个操作pg的用户postgres,以后所有关于数据库的操作都会使用这个用户。

#添加新的用户组
groupadd develop
useradd -d /home/postgres -m -g develop postgres
#为用户增加密码
passwd postgres

编译

安装过程第一步,我们要配置一些安装信息,通过解压后文件夹里的configure文件实现的。如果我们想采用默认的安装,只需要执行这个脚本即可,如果我们想自定义安装过程,那么我们在执行脚本的时候需要加上一下参数,部分参数如下:

  • --prefix=PREFIX_DIR: 加上这个参数,pg会把所有的编译后的文件放到这个文件夹中。默认情况下,系统会把这个值设置成usr/local/pgsql。所以我们要是想把pg安装到其他文件夹下,只需要在执行脚本的时候加上这个参数即可。(一般来说,自定义安装只需要用到这个选项)
  • --exec-prefix=EXEC-PREFIX:可以通过该选项,将相关的文件安装到EXEC-PREFIX文件夹下,而不使用--prefix设置的地方。这样做可以比较方便地在不同主机之间共享体系相关的文件。
  • --bindir=DIRECTORY:可执行程序的目录,如果不指定,默认是EXEC-PREFIX/bin,如果使用默认的--exec-prefix选项,则默认是PREFIX_DIR/bin
  • --sysconfdir=DIRECTORY:各种配置文件的目录,默认是PREFIX_DIR/etc
./configure --prefix=/home/postgres/pgsql

上面例子,会把编译后的文件全部放到/home/postgres/pgsql目录下,包括可执行程序等文件也会放到这个目录下。
执行问configure脚本后,我们就可以执行 make命令执行源码。在执行源码之前我们需要检查是否有c编译器,如果没有,我们可以执行下面命令进行安装。

yum -y install gcc

有时候一些系统还缺少readlinezlib库,这时候我们还要执行下面命令安装。

yum -y install readline-devel
yum install zlib-devel

安装缺失的包之后就可以编译源码,安装。依次执行以下命令:

#这里选择将pg安装到这个目录下面,指定了--prefix之后,pg安装后文件会全部放到这里
./configure --prefix=/home/postgres/pgsql
make
make install

用户环境变量

为之前新建的用户添加环境变量,这样该用户就能够直接执行命令去操作pg,而不是使用绝对路径去操作命令。打开新建用户的.bash_profile文件并在文件后面加入以下内容:

#表示pg安装的目录,和--prefix的目录一致
PGHOME=/home/postgres/pgsql
export PGHOME
#pg数据目录,在初始化数据库时如果没有指定目录,则选择环境变量中的目录
PGDATA=/home/postgres/pgsql/data
export PGDATA

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

初始化数据库

由于配置了环境变量,所以此处我们直接执行initdb即可完成pg初始化。我们先键入initdb --help看一下命令相关的参数信息:

tomcat@hw-hadoop1-> initdb --help
initdb initializes a PostgreSQL database cluster.

Usage:
  initdb [OPTION]... [DATADIR]

Options:
  -A, --auth=METHOD         default authentication method for local connections
      --auth-host=METHOD    default authentication method for local TCP/IP connections
      --auth-local=METHOD   default authentication method for local-socket connections
 [-D, --pgdata=]DATADIR     location for this database cluster
  -E, --encoding=ENCODING   set default encoding for new databases
      --locale=LOCALE       set default locale for new databases
      --lc-collate=, --lc-ctype=, --lc-messages=LOCALE
      --lc-monetary=, --lc-numeric=, --lc-time=LOCALE
                            set default locale in the respective category for
                            new databases (default taken from environment)
      --no-locale           equivalent to --locale=C
      --pwfile=FILE         read password for the new superuser from file
  -T, --text-search-config=CFG
                            default text search configuration
  -U, --username=NAME       database superuser name
  -W, --pwprompt            prompt for a password for the new superuser
  -X, --xlogdir=XLOGDIR     location for the transaction log directory

Less commonly used options:
  -d, --debug               generate lots of debugging output
  -k, --data-checksums      use data page checksums
  -L DIRECTORY              where to find the input files
  -n, --noclean             do not clean up after errors
  -N, --nosync              do not wait for changes to be written safely to disk
  -s, --show                show internal settings
  -S, --sync-only           only sync data directory

Other options:
  -V, --version             output version information, then exit
  -?, --help                show this help, then exit

通过这些参数后面的介绍,我们可以在数据库初始化的时候指定数据目录、编码和日志等信息。

#初始化时指定了数据库的编码和数据目录
initdb  -E utf8 -D /home/postgres/pgsql/data

启动和连接

在初始化数据库之后我们要考虑启动数据库,pg则是使用pg_ctl命令来控制数据库的启动和关闭。

postgres@hw-hadoop1-> pg_ctl --help
pg_ctl is a utility to initialize, start, stop, or control a PostgreSQL server.

Usage:
  pg_ctl init[db]               [-D DATADIR] [-s] [-o "OPTIONS"]
  pg_ctl start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "OPTIONS"]
  pg_ctl stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
  pg_ctl restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
                 [-o "OPTIONS"]
  pg_ctl reload  [-D DATADIR] [-s]
  pg_ctl status  [-D DATADIR]
  pg_ctl promote [-D DATADIR] [-s]
  pg_ctl kill    SIGNALNAME PID

Common options:
  -D, --pgdata=DATADIR   location of the database storage area
  -s, --silent           only print errors, no informational messages
  -t, --timeout=SECS     seconds to wait when using -w option
  -V, --version          output version information, then exit
  -w                     wait until operation completes
  -W                     do not wait until operation completes
  -?, --help             show this help, then exit
(The default is to wait for shutdown, but not for start or restart.)

If the -D option is omitted, the environment variable PGDATA is used.

Options for start or restart:
  -c, --core-files       allow postgres to produce core files
  -l, --log=FILENAME     write (or append) server log to FILENAME
  -o OPTIONS             command line options to pass to postgres
                         (PostgreSQL server executable) or initdb
  -p PATH-TO-POSTGRES    normally not necessary

Options for stop or restart:
  -m, --mode=MODE        MODE can be "smart", "fast", or "immediate"

从帮助文档我们可以看到,使用pg_ctl命令可以帮我们启动、重启和关闭数据库。同时我们可以在启动的时候使用-D来指定数据库数据的目录,在下面的介绍我们可以看到,如果我们没有指定这个选项,那么就会使用环境变量中配置的目录,也就是我们之前在环境变量中配置PGDATA;我们也可以使用-l选项来指定日志的存储地点,以便我们方便查看数据库的日志信息。
启动数据库之后我们就可以使用psql命令连入数据库中,进入数据库我们首先要做的就是设置postgres用户的密码,键入\password,输入密码即可。
做完这些基本上就能够使用了,但是这样只能够允许我们在本机使用数据库,其他的网络是不能够连接到我们数据库的,所以我们要设置数据库允许远程访问。

  • 修改postgresql.conf文件
    找到安装目录下的postgresql.conf文件,并且在文件中找到listen_addresses选项,将其改成如下所示内容:
listen_addresses = '*'
  • 修改pg_hba.conf文件
    在与postgresql.conf文件相同的目录下找到该配置文件,打开该文件,编辑或添加下面一行。(也可以改成你允许连接的ip)
# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD
host  all  all 0.0.0.0/0 md5

重启数据库即可。

配置主从

主/从数据库复制是将数据从主数据库复制到另外一个或者多个数据库的过程。主要好处是能够将数据分发到不同的数据库中,当主数据库出现故障时,可以请求从数据库中的数据,保证不会出现请求的中断。同样,我们也可以使用从数据库来分担主数据库的压力,加快数据的处理速度。
postgres9.0之后引入了主从流复制机制,从数据库通过tcp流从主数据库中同步相应的数据。
配置主从前我们要准备两台装了相同版本的 postgresql的服务器,假设我们有两台装了pg的服务器,ip分别为172.30.20.1172.30.20.2,我们规定172.30.20.1上面装的数据库为主库,172.30.20.2上面的数据库为从库。

配置主数据库

1、首先在数据库安装目录下创建一个存放归档的文件夹

#数据库安装目录为/home/postgres/pgsql
mkdir /home/postgres/pgsql/archive

2、我们需要一个数据库用户进行主从同步。在主数据创建用户,赋予登录和复制的权限

#密码根据个人自己定义
create role replica login replication encrypted password '123456'

3、允许新建的用户进行同步
data目录下找到配置文件pg_hba.conf,在配置文件中加入如下两行

host     all             all          172.30.20.2/32          trust   #允许从服务器连接到主服务器
host   replication      replica       172.30.20.2/32          md5   #允许从服务器使用replica用户来复制

4、修改postgresql.conf配置文件
找到配置文件postgresql.conf,修改配置文件,如下所示的选项进行修改

listen_addresses = '*'   # 监听所有IP
archive_mode = on  # 允许归档
archive_command = 'cp %p /home/postgres/pgsql/archive/%f'  # 用该命令来归档logfile segment
wal_level = hot_standby 
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的

配置完上面选项之后就可以重启数据库,接着配置从数据库。

从数据库配置

1、为了保证基础数据的一致,我们先从主数据库将起data目录下的数据复制到从数据库的data目录下

#先将data目录下的数据都清空
rm -rf /home/postgres/pgsql/data/* 
# 从主数据库拷贝数据到从数据库(基础备份)
pg_basebackup -h 172.30.20.1 -U replica -D /home/postgresql/pgsql/data -X stream -P  
#新建归档存储的文件夹
mkdir /home/postgres/pgsql/archive

2、配置recovery.conf
将安装目录下share目录下的recovery.conf.sample文件复制到data目录下,并改名为recovery.conf,修改文件。

standby_mode = on    # 说明该节点是从服务器
primary_conninfo = 'host=172.30.20.1 port=5432 user=replica password=123456'  # 主数据库的信息以及连接的用户
recovery_target_timeline = 'latest'

3、配置postgresql.conf
找到配置文件postgresql.conf,修改配置文件,如下所示的选项进行修改

wal_level = hot_standby
max_connections = 1000 # 一般查多于写的应用从库的最大连接数要比较大
hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 10s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈

配置完就可以重启从服务器。

验证主从是否配置成功

1、在主数据库上执行一下sql,即可查看相应的从数据库的信息

select client_addr,sync_state from pg_stat_replication;

2、通过查看两个服务器的进程来判断,分别在两个服务器上执行命令ps -ef | grep postgres,在主服务器上我们可以看到一个walsender的进程;在从服务器上我们可以看到一个walreceiver的进程,这样就证明主从配置完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容