centos7/redhat7离线安装postgresql+postgis并配置主从并做故障切换演练(9.6、11.6、13和14版本)

2023-10-26

一、安装postgresql、postgis(有9.6/11.6/13/14各版本的离线安装包)
以下例子安装的版本为postgresql13、postgis30_13,因已提前准备好安装所需的RPM包,所以使用RPM形式安装。

安装包链接:https://pan.baidu.com/s/1lFL6tmK5KBUkJAPSV3r9iA 
提取码:1012


1、rpm包安装:
mkdir /tmp/pgsql && cd /tmp/pgsql
将13版本的RPM包传到/tmp/pgsql中
rpm -ivh *.rpm --nodeps --force
2、查看安装结果:rpm -qa | grep postg
#输出结果
postgresql13-server-13.6-1PGDG.rhel7.x86_64
postgresql13-contrib-13.6-1PGDG.rhel7.x86_64
postgresql-libs-9.2.24-7.el7_9.x86_64
postgis30_13-3.0.5-1.rhel7.x86_64
postgresql13-libs-13.6-1PGDG.rhel7.x86_64
postgresql13-13.6-1PGDG.rhel7.x86_64
postgis30_13-client-3.0.5-1.rhel7.x86_64
3、配置:
# 初始化数据库 #
/usr/pgsql-13/bin/postgresql-13-setup initdb
# 启动pg #
systemctl start postgresql-13
# 设置开机启动#
systemctl enable postgresql-13
4、修改pg配置文件(此次安装的服务器数据盘是/data/)
vi /var/lib/pgsql/13/data/postgresql.conf
#取消data_directory注释,修改data_directory = 'ConfigDir'为data_directory = '/data/pgsql_data/'
data_directory = '/data/pgsql_data/'
#修改最大连接数
max_connections
#将监听地址修改为*
#默认listen_addresses配置是注释掉的,所以可以直接在配置文件开头加入该行
listen_addresses='*'
#修改配置文件
vi /var/lib/pgsql/13/data/pg_hba.conf
#在问价尾部加入,如果出现其他数据库连不上pgsql,就将md5修改为trust。修改为trust后会导致连接数据库时不需要密码
host    all             all             0.0.0.0/0               md5
创建pgsql数据存储路径:mkdir -p /data/pgsql_data/
cp -r /var/lib/pgsql/13/data/* /data/pgsql_data/
chown -R postgres:postgres /data/pgsql_data/
mv  /var/lib/pgsql/13/data  /tmp/data
vi /usr/lib/systemd/system/postgresql-13.service
# 将Environment=PGDATA=/var/lib/pgsql/13/data/修改为Environment=PGDATA=/data/pgsql_data/
Environment=PGDATA=/data/pgsql_data/
#重启PostgreSQL服务
chmod 700 /data/pgsql_data
systemctl daemon-reload
systemctl restart postgresql-13
5、修改postgres账号密码:
1、进入PostgreSQL命令行:su postgres
2、启动SQL Shell:psql
3、修改密码:ALTER USER postgres WITH PASSWORD 'Psql@135';
4、\q用于退出psql命令行
然后使用navicat连接pgsql,能连接表示安装成功。也可以使用命令行连接pgsql。

二、postgresql13主从配置:
1、主库设置:
1.1、创建同步账号:
登陆Master库,创建具有用于传递数据的具有replication权限的用户【也可以直接用Super user当作replication用户,但不推荐】
CREATE ROLE repl login replication password 'Psql!@135';
1.2、修改Master库的pg_hba.conf,把Master库和Standby库的IP地址添加进Master库网络策略白名单中,使Standby库可以连上 Master库,同时便于主备切换:
host    replication     repl            从库IP/32         trust
host    replication     repl            主库IP/32         trust
修改master库postgresql.conf文件:vi postgresql.conf
wal_level = replica                  # 开启wal日志归档
max_wal_senders = 10            # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_sender_timeout = 60s      # 设置流复制主机发送数据的超时时间
max_connections = 1000        # 这个设置要注意下,从库的max_connections必须要大于主库的
shared_buffers = 8GB             #推荐内存的1/4
synchronous_standby_names = ''
hot_standby = on 
work_mem = 128MB
maintenance_work_mem = 64MB
archive_mode = on
archive_command = 'cp %p /data/pgsql_data/arch_dir/%f; find /data/pgsql_data/arch_dir -type f -mtime +7 |xargs rm -f'
1.3、新建归档目录,赋予权限,重启主库:
mkdir -p /data/pgsql_data/arch_dir
chown -R postgres:postgres /data/pgsql_data
systemctl restart postgresql-13

2、从库配置:
2.1、停止postgres服务:systemctl stop postgresql-13
2.2、删除从库数据文件:rm -rf /data/pgsql_data/*
2.3、从主库拉取数据文件:/usr/pgsql-13/bin/pg_basebackup -h 主库IP -U repl -F p  -P -R -D /data/pgsql_data
2.4、修改所属组:chown -R postgres:postgres /data/pgsql_data
2.5、修改postgresql.conf:vi postgresql.conf
hot_standby = on
max_connections = 1200
2.6、启动从库,并在主库中查看流复制的信息可以使用主库上的视图:systemctl start postgresql-13(从库中运行)
select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;(主库中运行)
  pid  |   state   | client_addr  | sync_priority | sync_state 
-------+-----------+--------------+---------------+------------
 58243 | streaming | 35.80.151.13 |             0 | async
(如看到从库IP35.80.151.13,则表明主从已同步)
2.7、再次测试主动同步:
在主库创建数据库test:进入数据库,运行create database test;
去从库查看是否出现test:SELECT datname FROM pg_database;
在主库删除test数据库:drop database test;
对比主从数据库大小:select pg_size_pretty(pg_database_size('DB_name'));

三、主备切换步骤(12.0以上版本切换步骤。以下为切换演练,停止主库pgsql,模拟主库故障):
1、在主库操作:systemctl stop postgresql-13
2、在备库操作:su - postgres
psql
select pg_promote(true,60);
3、验证(在主库和备库上运行以下一条命令查看输出结果):
/usr/pgsql-13/bin/pg_controldata /data/pgsql_data
主备库英文显示如下:
Database cluster state: in production(表示此为主库)
Database cluster state: in archive recovery(表示此为备库)
主备库中文显示如下:
数据库簇状态: 在运行中(表示此为主库)
数据库簇状态: 正在归档恢复(表示此为备库)
4、如果原来的主库因为宕机,将备库切换为主库后。原主库经修复后恢复正常,此时启动原主库后,原主库也会显示为in production,因此需要将原主库降为备库,操作与建立备库时一样。

# 12.0以下版本切换步骤

1、在主库操作:systemctl stop postgresql-11
2、在备库操作:su postgres
2.1、检查状态:/usr/pgsql-11/bin/pg_controldata -D /data/pgsql_data
# 显示in archive recovery说明为备库
Database cluster state:               in archive recovery

2.2、 激活备库为可读写:/usr/pgsql-11/bin/pg_ctl promote -D /data/pgsql_data/

2.3、检查备库上的数据库角色:/usr/pgsql-11/bin/pg_controldata -D /data/pgsql_data
如果:Database cluster state: 显示in production说明已经提升为主库。

2.4、此时原主库也是in production状态,需要将其转换成备库(主库降为备库的操作见如上从库的配置步骤):
停止postgres服务:systemctl stop postgresql-11
删除数据文件:rm -rf /data/pgsql_data/*
从主库拉取数据文件:/usr/pgsql-11/bin/pg_basebackup -h 主节点ip -U repl -F p  -P -R -D /data/pgsql_data
修改所属组:chown -R postgres:postgres /data/pgsql_data
修改postgresql.conf:vi postgresql.conf
max_connections = 1200
启动pgsql服务:systemctl start postgresql-11
查看数据库角色是否变为备库:/usr/pgsql-11/bin/pg_ctl promote -D /data/pgsql_data/(是否显示为in archive recovery)
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

centos7/redhat7离线安装postgresql+postgis并配置主从并做故障切换演练(9.6、11.6、13和14版本) 的相关文章

  • 为什么我的 postgresql 函数插入回滚?

    我有以下功能 CREATE OR REPLACE FUNCTION Sensor PersistTelemetry sid character varying measurement character varying val numeri
  • 对一列进行唯一约束,排除其他列中具有相同值的行

    我想向列添加唯一键value但我必须忽略列中具有相同值的行value and header id 例如 考虑这个表 id header id value 1 1 a 2 1 a 3 2 a 因此 第 1 行和第 2 行指向同一个对象 并且唯
  • 根据文档,Django 1.8spectdb 命令看不到 PostgreSQL 视图

    我有一个带有 PostgreSQL 数据库的 Django 1 8 应用程序 我从命令行运行 django inspectdb 来检查模型的视图 但视图不会显示在模型输出中 这是版本输出 17 36 python well manage p
  • SQL 中的双冒号 `::` 表示法

    我捡到了某人的代码 以下是其中的一部分WHERE条款 这里的双冒号表示什么 b date completed gt a dc date INTERVAL 1 DAY 7 20 00 它根据 RDBMS 的不同而有所不同 但如果我猜对的话 那
  • Hstore 和 Rails

    我正在尝试使用最新版本的 activerecord postgres hstore gem 在 Rails 3 2 9 项目中使用 Hstore 但在使用 ActiveRecord 提供的 store accessor 来获取 Hstore
  • 用户 postgres 启动进程使所有 CPU 达到 100% 使用率

    用户 postgres 正在运行一个进程 该进程在 centos 机器上以 100 使用率占用所有 CPU postgresql 服务未运行 因此它不能是查询 当我尝试停止该进程时 它会自行重新启动 然后进程的名字就有点奇怪了 恭喜 通过将
  • 更改数据的时区值

    我必须导入不带时区信息的数据在其中 但是 我知道我要导入的数据的具体时区 但我需要timestamp with time zone数据库中的格式 一旦我导入它并将时间戳数据类型设置为timestamp with time zone Post
  • 如何将字符串列更改为 bigint?

    在轨道迁移中 如何将字符串类型列更改为 bigint I have t change ip number from integer limit gt 8 I get PG Error ERROR column ip number from
  • hibernate - Postgres - 目标列表最多可以有 1664 个条目

    我们正在使用 hibernate postgres 8 3x 我们的实体是通过急切获取进行多对一映射的 我们与多对一映射有多个关联 当我们向任何其他现有实体添加新列时 我们收到以下错误 目标列表最多可以有 1664 个条目 我搜索了互联网
  • PostgreSQL - 添加组角色后密码身份验证失败

    我对 PostgreSQL 还很陌生 我花了整个上午的时间试图让用户登录正常工作 现在我感到非常沮丧 因此 我有一个 PostGIS 数据库 版本 9 2 作为 OpenGeo 软件套件的一部分 我可以使用 postgres 用户访问数据库
  • ? LIKE(列 || '%')

    我可以有这样的条件吗 SELECT FROM table WHERE LIKE column 哪里的 是一个字符串参数值 例如 这些参数值 当列等于时应返回 true admin products admin products 1 admi
  • 获取 Postgres 当前当地时间的最简洁方法是什么?

    有没有更简洁的方法在 Postgres 中编写以下内容 DATE NOW AT TIME ZONE time zone 即获取带有时区的记录的当地时间time zone 理想情况下我想做这样的事情 NOW time zone 这不起作用 但
  • 如何根据 Postgres 中的过滤条件更新深度嵌套的 JSON 对象?

    我有一张桌子mapping transform带有 JSONB 列content json包含类似的东西 meta mapping src up dest down 我想添加一个新的 JSON 条目 rule names some name
  • 合并来自 ffmpeg 的两个视频

    我想使用 ffmpeg 将两个 mp4 视频组合成一个 mp4 视频 到目前为止我尝试过的是 ffmpeg i input1 mp4 i input2 mp4 output mp4 但是 每次我获取带有第一个输入的视频编解码器的视频而不是另
  • 对所有列实施搜索过滤器

    我在 PostgreSQL 中找到了这个搜索示例http www postgresql org docs current interactive textsearch tables html TEXTSEARCH TABLES SEARCH
  • 将字符串化数组转换回数组

    我使用 hstore 与 Postgres 9 2 和 Rails 3 2 来存储我的对象 如下所示 class User user hstore user id gt 123 user courses gt 1 2 3 end 现在 当我
  • 错误:数组不得包含空值 PostgreSQL

    我的查询是 SELECT id ARRAY AGG session os integer FROM t GROUP BY id HAVING ARRAY AGG session os integer ARRAY 1 NULL 它正在给予ER
  • Postgresql:如何从时间戳、时区字段正确创建带有时区的时间戳

    我有一个带有时间戳但没有时区的表 年 月 日 时 分 秒 以及 时区 字段 P 代表太平洋 M 代表山地 我需要创建一个 带有时区的时间戳 类型的字段 鉴于我有两个字段 有没有办法正确考虑夏令时 具体来说 时间戳 2013 11 03 01
  • 如何在 Postgres 中对包含语义版本的列进行排序

    有没有办法高效存储https semver org https semver orgPostgres 中的版本字符串 然后执行最新查询 例如假设列的值为 1 1 0 1 0 0 1 2 0 1 0 1 rc 1 B001 我想排序并获取最新
  • 表名或列名不能以数字开头?

    我尝试创建名为15909434 user语法如下 CREATE TABLE 15909434 user 这当然会产生错误 然后 在我尝试用谷歌进行一些研究后 我发现了一篇很好的文章here http www informit com art

随机推荐