前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPDB6和GPDB7直连primary命令的不同

GPDB6和GPDB7直连primary命令的不同

作者头像
yzsDBA
发布2022-12-27 13:55:03
3250
发布2022-12-27 13:55:03
举报
文章被收录于专栏:PostgreSQL研究与原理解析

1、遇到的问题

最近一直在使用GPDB7的版本进行学习,经常需要客户端psql连接primary进行验证,而连接primary必须使用维护模式时的命令:

代码语言:javascript
复制
PGOPTIONS=’-c gp_role = utility’ psql -d postgres -p port

业务版本比较低,使用GPDB6的版本,查询问题时,使用上面的命令连接primary报错:

代码语言:javascript
复制
psql: FATAL: System was started in master-only utility mode - only utility mode connections are allowd

2、分析

1)查看代码报错的位置,在InitPostgres函数中:

代码语言:javascript
复制
if((Gp_role == GP_ROLE_UTILITY) && (Gp_session_role != GP_ROLE_UTILITY))
{
  ereport(FATAL,
      (errcode(ERRCODE_CANNOT_CONNECT_NOW),
      errmsg("System was started in master-only utility mode - only utility mode connections are allowed")))
}

也就是说变量Gp_role和Gp_session_role的值分别是GP_ROLE_UTILITY和非GP_ROLE_UTILITY时才会报错。在代码中添加打印两个变量,编译后执行发现Gp_session_role的值是GP_ROLE_DISPATCH

2)看下这两个变量赋值的地方,Gp_session_role的值来自外部指定,不是从Gp_role处得来:

代码语言:javascript
复制
assign_gp_session_role
  newrole = string_to_role(newval);
  Gp_session_role = newrole;
  Gp_role = Gp_session_role;
  ...

3)看下代码的注释:

可以看出,需要指定gp_session_role为utility。所以进入维护模式的命令为:

代码语言:javascript
复制
PGOPTIONS=’-c gp_session_role=utility’ psql -d postgres -p port

GPDB7中改为gp_role=utility。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、遇到的问题
  • 2、分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档