首页 > 数据库 >postgresql流复制四(查询冲突)

postgresql流复制四(查询冲突)

时间:2023-09-01 23:22:33浏览次数:47  
标签:主库 postgresql standby 查询 delay 复制 备库 从库

部署流复制环境后,备库可提供只读操作,通常会将一些执行时间较长的分析任务、统计 SQL 跑在备库上,从而减轻主库压力,在备库上执行一些长时间 SQL 时,可能会出现以下错误并被中止:

FATAL: terminating connection due to conflict with recovery
DETAIL: User was holding a relation lock for too long.

根据报错信息,在主库上执行长时间查询过程中,由于此查询涉及的记录有可能在主库上被更新或删除,根据 PostgreSQL MVCC 机制,更新或删除的数据不是立即从物理块上删除,而是之后 autovacuum 进程对老版本数据进行 VACUUM ,主库上对更新或删除数据的老版本进行 VACUUM 后,从库上也会执行这个操作,从而与从库当前查询产生冲突,导致查询被中断并抛出以上错误。

实际上 PostgreSQL 提供了配置参数来减少或避免这种情况出现的概率,主要包括以下两个参数:

  • max_standby_streaming_delay:此参数默认为 30 秒,当备库执行 SQL ,有可能与正在应用的 WAL 发生冲突,此查询如果 30 秒没有执行完成则被中止,注意 30 秒不是备库上单个查询允许的最大执行时间,是指当备库上应用 WAL 时允许的最WAL 延迟应用时间,因此备库上查询的执行时间有可能不到这个参数设置的值就被中止了,此参数可以设置成为 -1,表示当从库上的 WAL 应用进程与从库上执行的查询冲突时, WAL 应用进程一直等待直到从库查询执行完成。
  • hot_standby_feedback:默认情况下从库执行查询时并不会通知主库,设置此参数为 on 后从库执行查询时会通知主库,当从库执行查询过程中,主库不会清理从库需要的数据行老版本,因此,从库上的查询不会被中止,然而,这种方法也会带来一定的弊端,主库上的表可能出现膨胀,主库表的膨胀程度与表上的写事务和从库上大查询的执行时间有关,此参数默认为 off。

接下来模拟这一案例,测试环境为一主一备异步流复制环境, host1 为主库, host2为备库,调整备库 postgresql.conf 以下参数:

max_standby_streaming_delay = 10s       # max delay before canceling queries

为了测试方便,将 max_standby_ streaming_ delay 参数降低到 10 秒,调整完成后执行 reload 使配置生效,如下所示:

pg_ctl reload

创建一张表test_delay,并插入1条数据,如下所示:

postgres=# create table test_delay(id int);
CREATE TABLE
postgres=# insert into test_delay select generate_series(1,1000);
INSERT 0 1

在备库上开启一个事务,执行以下查询, 如下所示:

postgres=# begin;
BEGIN
postgres=# select * from test_delay limit 1;
 id
----
  1
(1 row)

在主库truncate这张表,如下所示:

postgres=# truncate table test_delay;
TRUNCATE TABLE

过了大概10秒中,备库报错:

FATAL:  terminating connection due to conflict with recovery
DETAIL:  User was holding a relation lock for too long.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.

有两种方式可以避开这一错误。

方式一:调大 max_standby_streaming_delay 参数值

由于设置 max_standby_streaming_delay 数为 10 秒, 从库上执行查询与从库应用WAL 日志产生冲突时,此 SQL 或事务最多执行到 10 秒左右将被中止,因此可以将此参数值调大或调整成为 -1 绕开这一错误,以下将备库此参数调成60秒:

max_standby_streaming_delay = 60s       # max delay before canceling queries
hot_standby_feedback = off             # send info from standby to prevent

同时将 hot_standby_ feedback 参数设置为 off ,调整完成后执行 reload 使配置生效,如下所示:

pg_ctl reload

方式二:开启 hot_standby_feedback 参数

hot_standby_feedback 参数设置成 on 后,备库执行查询时会通知主库,在备库执行查询过程中 ,主库不会清理从库需要用的数据行老 版本,备库上开启此参数的代码如下:

max_standby_streaming_delay = 10s       # max delay before canceling queries
hot_standby_feedback = on             # send info from standby to prevent

以上设置 hot_standby_feedback 参数为 on ,同时将 max_standby_streaming_deay 参数设置 10 秒,调整完 reload 使配置生效,如下所示:

pg_ctl reload

以上两种方式都可以绕开这一错误,方式一中设置 max_standby_streaming_delay 参数为 -1 有可能造成备库上慢查询由于长时间执行而消耗大量主机资源,建议根据应用情况设成一个较合理的值;方式二开启 hot_standby_feedback 参数可能会使主库某些表产生膨胀,两种方式无论选择哪一种都应该加强对流复制主库、备库慢查询的监控,并分析是否需人工介入维护。

标签:主库,postgresql,standby,查询,delay,复制,备库,从库
From: https://www.cnblogs.com/jl1771/p/17673052.html

相关文章

  • POSTGRESQL中从MD5到SCRAM-SHA-256
    从v10开始,PostgreSQL提供了scram-sha-256对密码哈希和身份验证的支持。本文介绍了如何安全地调整您的应用程序。为什么我们需要scram-sha-256?PostgreSQL使用哈希加密有两个目的:实际的数据库密码是用户输入的明文密码的哈希值。这可以防止小偷在其他系统上使用偷来的密码。......
  • 文件复制(断点续传)
    rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。注意事项:目录名后有或没有/是很不同的,非常复杂。具体参考:cp拷贝文件夹时/的用法不是所有......
  • 【MySQL】MySQL主从复制延迟原因及处理思路
     MySQL主从复制延迟原因及处理思路主库DML请求频繁(TPS较大)主库写请求较多,有大量insert、delete、update并发操作,短时间产生了大量的binlog【原因分析】主库并发写入数据,而从库SQLThread为单线程应用日志,很容易造成relaylog堆积,产生延迟。【解决思路】做sharding,通过s......
  • winform,c#左链接查询两张表或多张表,数据库正常,但是发现查出来的同一条记录变成了好几
    这个样子就是犯了笛卡尔积,我有两张表那我自己项目来说一下吧:a表的内容如下: b表的内容如下: 到这里,你会发现,又五六个字段内容是一模一样的,该字段两张表都用,那么查询出来数据翻倍就很好解决了在where后面加上a.字段1=b.字段1and......anda.字段n=b.字段n就可以了......
  • postgresql常用命令
    PostgreSQL是一个强大的开源关系型数据库管理系统,它提供了许多用于管理数据库和执行操作的命令。以下是一些常用的PostgreSQL命令:连接到数据库:psql-hhostname-ddbname-Uusername这个命令用于连接到指定的数据库,需要提供主机名、数据库名和用户名。你可以根据需要修......
  • Excel函数查询-----------------------------------filter函数(可以代替vlookup函数)
     求a=FILTER(B2:G8,A2:A8=I11,"")  先选定几列,然后在第一行去输入函数,再拉取就可以了......
  • 查看es结构,es _search查询基础语法
    查看es结构,es_search查询基础语法http://xx.xx.xx.xx:9200/ ES地址car_info/_searchPOST{}POST{"query":{"match":{"carNo":"573702440"}}}{ "query":{"term":{......
  • Mysql主从复制(一主一从)+Mycat(windows-1.X版本)实现读写分离
    项目中,如果数据量大的情况下,可以使用【数据库主从复制+读写分离】的方式优化,其他方式也很多,这里只记录下这种方式一、说明1.需要的环境等:序号环境说明1mysql5.7服务器两台数据库服务器,一台作为主数据库,一台作为从数据库2jdk安装mycat的时候会用到jdk3my......
  • mybatis级联查询一对多(查询用户和多个订单)
    和一对一级联方法一样,在resultMap标签中添加<associattion>标签添加封装的属性字段,以及select方法和绑定的id。然后select语句添加查询id应该为对应的user_id,而不是本身的主键id否则任然是一对一的关系。思想和一对一级联是一样的,所以只需要注意接口中定义的返回类型使用List数......
  • mybatis多对多表查询(角色与用户)
    用户与角色表查询时,如果是靠两个表的主键查询是不正确的,就好比将a的值赋给b,b的值赋给a,需要中间表来作为中间值。利用中间值联系两个表之间的主键,多个角色也能实现联查。但是要分清主表,既用户表为主表,即使根据角色查询,也不过是将查询id改为角色表id,但查询表还是user表根据用户id......