阅读更多
阅读原文请点击: http://click.aliyun.com/m/23940/
摘要: 标签 PostgreSQL , 中间件 , 连接池 , 平滑切换 , 会话设置 , 会话状态 , 绑定变量语句 , prepared statement 背景 数据库迁移、切换是很普遍的一个话题,但是大多数的方案,对用户来说都是有感知的,所以用户的体验并不好。
标签
PostgreSQL , 中间件 , 连接池 , 平滑切换 , 会话设置 , 会话状态 , 绑定变量语句 , prepared statement
背景
数据库迁移、切换是很普遍的一个话题,但是大多数的方案,对用户来说都是有感知的,所以用户的体验并不好。
例如用户使用了绑定变量语句,主备角色切换后绑定变量语句没有了,会导致调用报错。
我们需要维护主库的硬件,那么可以在中间件层面,将主备数据库的角色进行平滑调换,维护好硬件,再平滑的调换回来。
数据库主备切换时,如何做到会话级无感知?首先我们要了解会话中都有哪些内容,哪些内容是需要随角色切换一起迁移的。从而做到用户无感知。
(本文HA指中间件层级的HA,并非APP直连数据库,VIP切换的那种HA。)
简单的switchover过程举例:
等待所有会话的事务结束,会话都处于idle状态,冻结会话,不允许提交任何SQL,然后进行角色切换,并将每个会话的资源状态平移。
会话资源状态
会话中有些什么状态?通过discard这条SQL就可以了解。
https://www.postgresql.org/docs/10/static/sql-discard.html
DISCARD — discard session state
discard all相当于执行如下
SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD SEQUENCES;
DISCARD TEMP;
会话资源中目前可能包含如下(每个PG版本可能有些许差异):
SESSOIN角色、参数设置、绑定变量语句、游标、异步消息监听、AD锁、序列、临时表等。
下面介绍一下每种资源的查询方法,以及在新的主库上进行资源复原的方法。
一、SESSION AUTHORIZATION
超级用户可以将会话用户设置为其他用户,普通用户无权切换用户。
当前用户为postgres,设置SESSION AUTHORIZATION为test
postgres=# set SESSION AUTHORIZATION test;
SET
postgres=> show SESSION AUTHORIZATION;
session_authorization
-----------------------
test
(1 row)
postgres=> select usename from pg_stat_activity where pid=pg_backend_pid();
usename
----------
postgres
(1 row)
查询方法
postgres=> show SESSION AUTHORIZATION;
session_authorization
-----------------------
test
(1 row)
postgres=> select usename from pg_stat_activity where pid=pg_backend_pid();
usename
----------
postgres
(1 row)
复原方法
当pg_stat_activity.usename不等于SESSION AUTHORIZATION时,需要通过如下方法复原它。
postgres=# set SESSION AUTHORIZATION test;
SET
二、参数
阅读原文请点击: http://click.aliyun.com/m/23940/