zoukankan      html  css  js  c++  java
  • Postgresql 热备hot standby

    https://blog.csdn.net/lanonola/article/details/51247996

    https://www.cnblogs.com/coding8832/p/14473748.html

    https://blog.csdn.net/lanonola/category_6202399.html

    Step1:安装PG数据库
    略,slave端可以只装数据库,不初始化数据库
    程序位置:C:Program FilesPostgreSQL

    Step2:创建流复制用户

    master端执行: 数据库命令行执行:

    CREATE USER repuser replication LOGIN CONNECTION LIMIT 3ENCRYPTED PASSWORD 'repuser'; 

    Step3:配置Master端的访问文件pg_hba.conf

    增加一行:
    host replication repuser 192.16.41.112/16 md5

    Step4:配置MASTER端配置文件

    max_wal_senders = 1
    wal_level = hot_standby

    archive_mode = on 
    archive_command = 'cd ./'

    hot_standby = on
    wal_keep_segments = 64

      注:max_wal_senders是Slave库的节点数,有多少个slave库就设多少,
          wal_level是write ahead log参数值,设置流复制务必将此值更新成hot_standby
         wal_keep_segments默认值是16,是PG_XLOG下的日志文件数相关参数
        archive也可以选择关闭,归档是定时恢复用的,流复制不是必须的

    Step5:主库备份(Master端)
    5.1:开启文件备份,前提是wal_level参数值必须是archive或者hot_standby,前面已做
    select pg_start_backup('Replition work');

    5.2:拷贝C:Program FilesPostgreSQL9.5data文件夹,并复制到Slave服务器上

    备机端如果已经安装了postgres数据库,数据文件夹名称一样的话,可以先停掉备机数据库,将data文件夹中内容清空。将master中data文件夹中内容拷贝到slave中相同文件夹下。

     5.3:上述步骤完成后,结束master端的备份

    select pg_stop_backup(),current_timestamp;


    Step6:修改Slave端配置信息

    6.1:postgresql.conf文件
     hot_standby = on

    6.2:recovery.conf文件

    将C:ProgramFilesPostgreSQL9.5share ecovery.conf.sample文件拷贝到data文件夹下,重命名为recovery.conf

    新增以下内容:

     standby_mode = 'on'

     primary_conninfo ='host=192.16.41.114  port=5432 user=repuser password=repuserkeepalives_idle=60'

    6.3:配置.pgpass文件(slave端)
    新增slave访问master的密码文件,可以不用输密码
    192.168.2.130:1949:postgres:repuser:repuser

    6.4:删除slave端(从master端拷过来的)的postmaster.pid文件和pg_xlog文件夹中内容。
    Step7:启动Slave库
    正常启动备库,有异常可以看log

    Step8:测试

    On Master:
    CREATE TABLE  t

    (

      id integer NOTNULL,

      name charactervarying(20),

      CONSTRAINTt_pkey PRIMARY KEY (id)

    )

    INSERT INTO t(id, name)VALUES (1, 'xxxxxxxxx');

    INSERT INTO t(id, name)VALUES (2, 'xxxxxxxxx');
    On Slave:

    select * from t;

    update t set name = 'YYYYY' where id=1;

    delete from t where id = 2;

    ERROR:  cannot execute UPDATE in a read-onlytransaction

    ERROR:  cannot execute DELETE in a read-onlytransaction


    新增的数据已经传输过去,且slave端的会话为只读,不能进行update和delete操作。

    遇到的问题:

    备份完成后,slave库的服务无法启动:

    操作:将备份库的data文件夹改为data.old,将master中的data文件夹拷贝到slave中,启动服务。

    报错:服务无法启动,报服务启动后终止。

    日志:pg中的log文件内容为空

          查看事件管理器中日志:2016-04-25 16:47:38 HKT 致命错误:  无法创建锁文件"postmaster.pid": Permission denied

    解决方法:

    1.修改新拷贝过来的data文件夹权限,修改后并不起作用。

    2.保留slave的data文件夹,将其中内容清空,把master中的data文件夹中内容拷贝到slave中。启动服务,成功。

  • 相关阅读:
    vue的选项
    css(3)基础知识查漏补缺
    总结获取网页相关的一些宽高
    vue的全局api(二)
    vue的全局api
    vue的内部指令
    Java File
    Java File IO学习笔记
    systemctl介绍
    java学习笔记一(20180319)
  • 原文地址:https://www.cnblogs.com/mrguoguo/p/14701343.html
Copyright © 2011-2022 走看看