一、问题现象
近期因工作需要,开始接触中兴的GoldenDB数据库。今天项目组反馈,在GoldenDB中建表后,没报错,但就是看不到建好的数据表,咨询怎么解决。我在了解情况后,将信将疑的在本地做起了实验,分别用命令行或终端工具(dbeaver)在数据库中建了表,结果通过dbeaver客户端工具查看时,确实看不到表(如下图)。
二、问题分析
1、首先怀疑是权限问题,通过GoldenDB软件自带的insight管理工具,验证能否看到建出来的各种数据表,确实用管理员身份也看到了刚建出来的表,效果如下图。
2、于是,直接用管理员对用户赋予相应的权限,包括表的查看、修改等权限。进入系统计算节点服务器上,切换到dbproxy用户,(为保证初始化变量才有执行权限,使用su - dbproxy切换用户),执行dbtool -p -x -db 1000重新初始化数据结点;然后将dbproxy.sql,tail -f起来,完成设置后,再次重新登陆数据库,执行show tables语句查看数据表。奇怪!通过show tables出来的结果依然为空,看来应该不是权限问题,而是配置有问题。
3、通过系统视图,查看是否有对应的数据表呢?使用select ‘tables_in’ from ‘sys’.’_gdb_systb_show_tables’ where owner=’库名’; (库名一般为大写字母,最好各种大小写都试一下,或者直接查看一下该视图中有没有该库)查询后,发现原来在系统视图中就没有相应的表。再进一步,通过select distinct ‘owner’ from ‘sys’.’_gdb_systb_show_tables’ 查询,发现在系统视图中连该数据库都没有(如下图)。晕!
4、再查看参数配置情况,查看dbproxy用户下etc/proxy.ini中的dictionary_info,显示为1,表示开启Oracle兼容性视图。
哦,应该就是这个原因,在GoldenDB中开启oracle模式后,MySQL的指令和查询方式是没有的,所以系统视图中也是没有数据的。
三、解决方案
找到问题后,解决方案就自然有了。将dictionary_info再次修改为1,并重启计算节点后,重新建库建表就可以正常使用了。
四、回顾分析
问题解决后,不知道大家有没有跟我一样的困惑,就是为什么MySQL指令执行的时候,不报错,还能查询到部分数据呢?我想应该是最开始dbproxy用户下etc/proxy.ini中,dictionary_info配置为0,此时不开启oracle兼容性视图。这种情况下建表,show tables是正常的。后来将dictionary_info配置为1并重启生效。此时show tables是没有数据库的,故show tables查询视图时就是空的。主要因为建库建表的时候,视图是关闭的。唉!这种兼容模式?看来最好不要在使用过程中修改模式,否则出现这种问题,很难解决。各位读者有什么理解欢迎反馈交流。
我也在此做个记录,避免以后遇到相同的问题。