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%';