1、遇到的问题
最近一直在使用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
2、分析
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_DISPATCH2)看下这两个变量赋值的地方,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。