postgresSQL主从流复制安装

命令行运维:

https://blog.csdn.net/zhangzeyuaaa/article/details/77941039

 

安装流程:

先准备类库:

yum -y install readline-devel zlib-devel

下载postgresql-9.6.9.tar.gz到两台机器上解压后进入并:

./configure --prefix=/main/postgresql

然后make  make install就ok,接着改一下属主:

adduser postgres
passwd postgres

 

chown -R postgres:postgres /main/postgresql

 

创建数据文件目录

mkdir -p /main/postgresql/data

创建log文件

mkdir /main/postgresql/logs
touch /main/postgresql/logs/postgresql.log

初始化数据库:

/main/postgresql/bin/initdb -D /main/postgresql/data

可以看到data下多出来一堆文件

[postgres@iz2zej5nlztmm1frnyl4wxz postgresql]$ ll data/
总用量 112
drwx------ 5 postgres postgres  4096 7月  30 15:16 base
drwx------ 2 postgres postgres  4096 7月  30 15:16 global
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_clog
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_commit_ts
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_dynshmem
-rw------- 1 postgres postgres  4468 7月  30 15:16 pg_hba.conf
-rw------- 1 postgres postgres  1636 7月  30 15:16 pg_ident.conf
drwx------ 4 postgres postgres  4096 7月  30 15:16 pg_logical
drwx------ 4 postgres postgres  4096 7月  30 15:16 pg_multixact
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_notify
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_replslot
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_serial
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_snapshots
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_stat
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_stat_tmp
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_subtrans
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_tblspc
drwx------ 2 postgres postgres  4096 7月  30 15:16 pg_twophase
-rw------- 1 postgres postgres     4 7月  30 15:16 PG_VERSION
drwx------ 3 postgres postgres  4096 7月  30 15:16 pg_xlog
-rw------- 1 postgres postgres    88 7月  30 15:16 postgresql.auto.conf
-rw------- 1 postgres postgres 22300 7月  30 15:16 postgresql.conf

设置环境变量:

export PGDATA=/main/postgresql/data 
export PATH=${JAVA_HOME}/bin:/main/mysql5.6.41/bin:/main/postgresql/bin:$PATH

source一下生效之

启动下测试下:

pg_ctl -D /main/postgresql/data/ -l /main/postgresql/logs/postgresql.log start

看看日志:

cat postgresql.log 
LOG:  could not bind IPv6 socket: 无法指定被请求的地址
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
LOG:  database system was shut down at 2018-07-30 15:16:13 CST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

连一下:

psql
psql (9.6.9)
Type "help" for help.

postgres=# 

ok

 

接下来可以开始配置主从---------------------------------

 

主库创建同步用户:

psql
psql (9.6.9)
Type "help" for help.

postgres=# create role repl login replication encrypted password 'xxxxx';

可以查到用户:

postgres=# select usename from pg_user;
 usename  
----------
 postgres
 repl
(2 rows)

 

vim pg_hba.conf设置访问权限,开放从节点密码读取:

xx.xx.xx.xx是从节点的ip

host    replication     repl        xx.xx.xx.xx/32            md5

同时开放其他局域网内的应用节点密码访问:

host    all             all             yy.yy.yy.00/24            md5

 

修改核心配置文件:

Listen_adresses = ‘*’
wal_level = hot_standby                主从设置为热血模式,流复制必选
max_wal_senders=2    流复制允许连接进程
wal_keep_segments =64    
max_connections = 100    默认参数,非主从配置相关参数,表示到数据库的连接数

 

从节点:

从库安装完成后,不初始化,若已经初始化,删除其data目录

从节点从主节点去读取:

pg_basebackup -h 172.17.222.161 -p 5432 -U repl -F p -P -D /main/postgresql/data
Password: 输入密码
22824/22824 kB (100%), 1/1 tablespace
NOTICE:  WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup

 

在基础备份时,初始化文件是从主库复制来的,所以配置文件一致,注释掉
wal_level,
max_wal_senders 
wal_keep_segments等参数
打开如下参数:
vi /postgres/data/postgresql.conf
hot_standby = on   #在备份的同时允许查询
max_standby_streaming_delay = 30s #可选,流复制最大延迟
wal_receiver_status_interval = 10s #可选,从向主报告状态的最大间隔时间
hot_standby_feedback = on #可选,查询冲突时向主反馈
max_connections = 1000 #默认参数,非主从配置相关参数,表示到数据库的连接数,一般从库做主要的读服务时,设置值需要高于主库

创建恢复文件recovery.conf

cp ../share/recovery.conf.sample recovery.conf
调整参数:
recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=172.17.222.161 port=5432 user=repl password=xxxxx'      

 

备注:
recovery.conf    #在做基础备份时,也可通过-R参数在备份结束后自动生产一个recovery.conf文件
standby_mode = on  #指明从库身份
primary_conninfo = 'host=10.0.120.150 port=5432 user=repl password=repl1234'  #连接到主库信息
recovery_target_timeline = 'latest'     #同步到最新数据
指定触发文件,文件存在时,将触发从库提升为主库,前提是必须设置”standby_mode = on”;如果不设置此参数,也可采用”pg_ctl promote“触发从库切换成主库

#trigger_file = ‘/main/postgres/data/trigger_activestandby’

 

 从库启动

pg_ctl -D /main/postgresql/data/ -l /main/postgresql/logs/postgresql.log start

主库看看状态 

主库进程:

从库进程:

 

 测试:

create table test(id int primary key, name varchar(20));

从库只能读取------写入执行报错:

 

 

主库执行读写都ok,不过一般用来写:

 

主从分别查看同步状态:

 

pg_controldata /main/postgresql/data/

主节点:

从节点:

 

 到此主从复制建立完成。

 

测试自动主从切换:

1)主库上执行:
su - postgres
pg_ctl stop -m fast         #停主库日志
pg_controldata /postgres/data/ #此时Database cluster state: shutdown
(2)从库切换为主库:
su - postgres
pg_ctl promote
pg_controldata /postgres/data #此时Database cluster state: Inproduction

 

 

修改了postgresql.conf中的端口
psql -p 23532
和pg_hba.conf中的访问权限,仅限内网访问

 

 

 

 

一、建立数据库连接

接入PostgreSQL数据库,切换到pg的用户:

psql -h IP地址 -p 端口  -U 数据库名 

之后会要求输入数据库密码

 

 

 

二、访问数据库

 

1、列举数据库:\l
2、选择数据库:\c  数据库名
3、查看该某个库中的所有表:\dt
4、切换数据库:\c interface
5、查看某个库中的某个表结构:\d 表名
6、查看某个库中某个表的记录:select * from apps limit 1;
7、显示字符集:\encoding
8、退出psgl:\q

 

三、dump数据库

命令:pg_dump -h IP地址 -p 端口 -U 数据库用户名 -f 目标存储文件及路径 目标数据库名

之后会要求输入数据库用户密码

参数:

    # -h: PostgreSQL服务器的主机为192.168.149.137。
    # -U: 登录用户为postgres。
    # -t: 导出表名以test开头的数据表,如testtable。
    # -a: 仅仅导出数据,不导出对象的schema信息。
    # -f: 输出文件是当前目录下的my_dump.sql

实例:

    # mydatabase是此次操作的目标数据库。
    /> pg_dump -h 192.168.149.137 -U postgres -t test* -a -f ./my_dump.sql mydatabase
    #-c: 先输出删除数据库对象的SQL命令,在输出创建数据库对象的SQL命令,这对于部署干净的初始系统或是搭建测试环境都非常方便。
    /> pg_dump -h 192.168.220.136 -U postgres -c -f ./my_dump.sql mydatabase
    #导出mydatabase数据库的信息。在通过psql命令导入时可以重新指定数据库,如:/> psql -d newdb -f my_dump.sql
    /> pg_dump -h 192.168.220.136 -U postgres -f ./my_dump.sql mydatabase
    #导出模式为my_schema和以test开头的数据库对象名,但是不包括my_schema.employee_log对象。
    /> pg_dump -t 'my_schema.test*' -T my_schema.employee_log mydatabase > my_dump.sql
    #导出east和west模式下的所有数据库对象。下面两个命令是等同的,只是后者使用了正则。
    /> pg_dump -n 'east' -n 'west' mydatabase -f my_dump.sql
    /> pg_dump -n '(east|west)' mydatabase -f my_dump.sql

 

 四、恢复dump的数据库

命令:psql -h IP地址 -p 端口 -U 数据库用户名 -d 目标数据库名 -f 目标存储文件及路径

之后会要求输入数据库用户密码

参数:

    # -h: PostgreSQL服务器的主机为192.168.149.137。
    # -U: 登录用户为postgres。
    # -f: 输出文件是当前目录下的my_dump.sql

 五、压缩dump数据库及其恢复

压缩dump:pg_dump -h IP地址 -p 端口 -U 数据库用户名 -f 目标存储文件及路径 -Fc 目标数据库名

恢复:pg_restore -h IP地址 -p 端口 -U 数据库用户名 -Fc -d 目标数据库名 目标存储文件及路径

附:压缩dump后文件大小会缩小10倍

 

六、使用系统表查询数据库个数

执行sql命令:select count(*) from pg_database where datname like 'db%';

 

posted @ 2018-07-30 17:52  大树的博客  Views(819)  Comments(0Edit  收藏  举报