最近一直在使用GPDB7的版本进行学习,经常需要客户端psql连接primary进行验证,而连接primary必须使用维护模式时的命令:
PGOPTIONS=’-c gp_role = utility’ psql -d postgres -p port
业务版本比较低,使用GPDB6的版本,查询问题时,使用上面的命令连接primary报错:
psql: FATAL: System was started in master-only utility mode - only utility mode connections are allowd
1)查看代码报错的位置,在InitPostgres函数中:
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处得来:
assign_gp_session_role
newrole = string_to_role(newval);
Gp_session_role = newrole;
Gp_role = Gp_session_role;
...
3)看下代码的注释:
可以看出,需要指定gp_session_role为utility。所以进入维护模式的命令为:
PGOPTIONS=’-c gp_session_role=utility’ psql -d postgres -p port
GPDB7中改为gp_role=utility。
本文分享自 yanzongshuaiDBA 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!