GaussDB 分库中默认模式的坑
项目重构,数据源由mysql转为GaussDB,且项目是分库的。测试使用同名schema,没注意,结果上线踩了坑。
GaussDB 的树结构是【数据库实例】->【数据库】->【模式】->【表】。数据库实例有多个库,一个库下有多个模式:test1,test2,test3,test4。一个模式下多个表。对于同一个账户访问同一个数据库实例的多个库,是共同使用一个默认模式的。初始默认模式为public
踩坑场景:每个库创建并使用不同名字的模式
应用A,分库后为ig1,ig2,ig3,ig4,ig5 ,ig6 共6个库,其中ig1,ig2,ig3在同一个数据库实例gauss1。ig4,ig5 ,ig6在同一个数据库实例gauss2,每个数据库实例都创建账户manager,使用账户manager登录访问。
库ig1 创建ig_db1模式,库ig2 创建ig_db2模式,其他库依次相仿。
此时通过下列命令,分别在相应的库中执行设置各自默认模式
alter role manager set search_path to ig_db1;
alter role manager set search_path to ig_db2;
alter role manager set search_path to ig_db3;
alter role manager set search_path to ig_db4;
alter role manager set search_path to ig_db5;
alter role manager set search_path to ig_db6;
分别执行查看默认模式命令
show search_path;
结果发现:之前的库ig1,ig2,ig4,ig5默认模式不是执行的命令设置的对应schema。
库ig1,ig2变成了最后执行的ig_db3。而库ig4,ig5变成了最后执行的ig_db6
原因
alter role manager set search_path to xx_schema 命令是对账户设置的默认模式,数据库实例中所有该账户登录的库都使用同一个默认模式。
解决
分库模式下,同一个实例的库使用同一个账号访问时,创建同名的schema模式,并设置默认访问
数据库实例gauss1:库ig1【创建模式:ig_schema】,库ig2【创建模式:ig_schema】,库ig3【创建模式:ig_schema】。
数据库实例gauss2:库ig4【创建模式:ig_schema】,库ig5【创建模式:ig_schema】,库ig6【创建模式:ig_schema】。