文章目录
- 先说清楚它到底能连哪几种
- 重头戏:异构库的对象,它都能怎么管
- 用户、角色、表空间、还有两个救命的管理器
- 四种库,管理界面不是一回事
- Linux部署踩坑实录,这章手册写得实在,我也踩得实在
- 附录里的干货:驱动参数和读写分离
- 用了俩月,说几句实在的
接着上一篇唠这套SQL编辑器。上篇我光顾着讲写SQL那点事了,补全啊提交啊参数啊,那都是"用"的层面。这篇我想讲点更能体现它产品力的东西——KSQL Developer最让我意外的,其实不是它写SQL多顺手,而是它能拿一个客户端,同时连着KingbaseES、Oracle、SQLServer、MySQL四种完全不同的库,对象还都能图形化管起来。
这事你可能觉得没啥,不就连个库嘛。我跟你说,没那么简单。你要是同时维护过几家异构库就懂那种痛了——以前我桌面上得同时挂着三四个客户端,Oracle开一个,SQLServer开一个,MySQL再开一个,每个长得都不一样,快捷键一套一套的,脑子经常串台。在Oracle那边你按某组合键是格式化,到了另一个工具同样的键直接给你执行了,魂都给你吓飞。
用了俩月这个,我现在基本就留它一个,剩下那几个客户端我都快忘了图标长啥样了。这篇就讲讲这个"万能遥控器"到底怎么用、管对象有哪些门道、以及我在Linux上装它时踩的那一屁股坑。还是那句,想到哪说到哪,乱了你担待。
先说清楚它到底能连哪几种
我先把连接这事掰开。它新建连接的时候,让你选数据库类型,明明白白四个:KingbaseES、Oracle、SQLServer、MySQL。每一种填的东西还不太一样,不是那种糊弄事的"统一填个JDBC串"。
连KingbaseES,填主机、端口、库名、用户名密码这些常规的。连Oracle,你得懂它那套——是填SID还是填服务名,这俩很多新手分不清,经常在这卡死。连SQLServer,有实例、有认证方式(Windows身份认证还是数据库账号那套)的区别。连MySQL,主机端口用户名密码,但字符集、时区这些坑一个不少。
我桌面上现在常驻的连接(名字我都故意起得很直白): 【生产-红色】KES-核心交易-10.20.30.40 【测试】KES-核心交易测试-10.20.30.41 【遗留】Oracle-EBS老系统-172.16.x.x 【供应商】SQLServer-物流-192.168.x.x 【日志库】MySQL-行为日志-10.20.50.x连接建完,导航窗口里那几个连接的状态是有讲究的,我特意观察过:没连上的时候图标正常,下面的对象节点是缩起来的;连上了图标下面打个对勾,节点能展开;连接失效了(比如网络断了、库重启了),图标下面变叉号,节点又自动缩回去。这个设计看着小,但我觉得挺贴心——你不用点进去试半天才知道"哦原来早断了",扫一眼图标就心里有数。
打开连接也好几种方式:右键选连接、双击节点、或者点节点前面那个小箭头。连上就展开,连不上它直接弹错误信息,不会让你对着一个转圈干等。连接还能右键编辑、重命名、删除、随时断开。我建议大家养成习惯,不用的连接就断开,尤其是生产,别常年挂着,既占资源,也少手滑。
重头戏:异构库的对象,它都能怎么管
这才是手册里篇幅最重的部分(整整一大半都在讲这个),也是我最想展开的。我按对象类型挑着说,太多了,全说一遍你也烦。
最底层是库和模式(schema)。对KingbaseES,你能在已有的连接上可视化新建数据库,选项卡里分基本属性、权限、DDL三块。基本属性填库名、属主、编码;权限那块直接能配;最妙的是DDL那一栏——你在界面上勾的每个东西,它实时给你拼出对应的建库SQL。模式同理,新建、编辑属主、生成SQL。
我必须给这个"DDL实时预览"单独鼓掌。为什么?因为这是图形化工具最该有、但很多工具做不好的东西。你在图形界面点来点去,本质是在让它替你写SQL,但如果它不让你看到最终生成的SQL是什么,你就是在闭着眼睛操作,出了问题你都不知道它背后干了啥。它把DDL摊给你看,等于操作是透明的,你既能享受图形化的省事,又能学到、能核对真实语句。我上篇说"向导可以当老师",就是这个意思,这一篇我要再强调一遍,因为这个习惯真的能救命。
模式右键能做的事也多:编辑、生成该模式的SQL编辑器、生成SQL(就是整个模式的DDL导出)、看ER图、重建该模式下所有索引、重命名、删除、刷新。
那个ER图我得多说两句。你选一个模式,它能把这个模式下的表和表之间的关系(外键那些)给你画出ER图来。我刚接手一个不熟的系统时,第一件事就是把几个核心模式的ER图调出来看,比我一张张表去desc、再拿脑子记关系快太多了,哪张表是主表、哪些挂着外键,图上一目了然。这个功能对老系统梳理、做交接、写文档都特别有用。当然它也有局限——如果你们的系统根本没建物理外键、关系全靠应用层在代码里维护(这种野路子系统我见多了),那ER图上就是一堆孤立的方块,啥关系线都没有,这时候别怪工具,是你们库本身就没把关系落到数据库层面。
表这块功能最细。新建表是图形化的,列名、类型、长度、能不能空、主键、默认值、约束这些一个个填,底下同样给你看DDL。管理表的时候有个"工具"子菜单,里面有些实用操作。表上还能重建索引。
有个细节我挺喜欢:它支持按住Ctrl或者Shift选多个对象,批量删除。做测试的时候我一次建了一堆临时表,清理的时候一个个点能点到崩溃,能框选批量删就舒服多了。不过这种批量操作我也得泼盆冷水——越方便的批量删除,越要确认你在哪个连接上、选的是哪些。我现在批量删之前一定抬头看一眼连接名是不是测试库,删之前再核对一遍勾选,养成肌肉记忆了。生产库?我连多选都不会去按,宁可一条一条来,慢就慢点。
视图和物化视图都能新建、管理,能看定义、能改。物化视图这东西很多人容易跟普通视图搞混——普通视图本质是存了条查询,每次查都现算;物化视图是把结果实打实存下来的,得刷新才有新数据。工具里这俩是分开管的,也算从交互上帮你区分了。
函数、存储过程、触发器、程序包这一挂的,都能在导航树里新建和管理。这里我提一个跨库差异点:程序包(Package)这个东西,是Oracle风格的,KingbaseES的Oracle兼容模式下能支持,你在MySQL那类库里是找不着这个概念的。所以你连不同类型的库,导航树里能看到的对象种类本身就不一样,它是跟着目标库走的,不会硬给你塞一个目标库根本不支持的东西。这个"因地制宜"我觉得做得是对的。
序列、同义词、类型、外部链接也都有。同义词这个,Oracle系的人熟,迁移过来的老系统里大量用同义词指向别的对象,能在树里直接管,省得你去写CREATE SYNONYM。外部链接就是跨库访问那个东西(dblink一类),配好之后能在SQL里直接查别的库的表,这个在做异构数据核对的时候我常用——不用导数据,一条带外部链接的查询直接把两个库的数据拉到一起比。
外部表支持两种建法,文件外部表和普通外部表。文件外部表这个在做数据文件加载时挺好用,把一个CSV之类的文件映射成一张表,直接用SQL去查文件内容,先查明白了再灌进正式表,比你盲目LOAD进去再清理强。
用户、角色、表空间、还有两个救命的管理器
对象之外,它还管一些偏运维的东西,我挑几个实战中真用得上的。
用户和角色。能新建用户、配权限,新建时同样有基本属性、权限、DDL三个页签。角色单独管理。权限这块我一贯的态度是:图形化配权限很方便,适合快速操作,但你心里得清楚你授出去的到底是什么权限,尤其生产,遵循最小权限原则,别图省事上来就给个大权限。数据库账号权限这种东西,给的时候痛快,收的时候可就麻烦了。
表空间。能新建和管理表空间。这个对做存储分层的人有用——热表放高速存储的表空间、冷归档放便宜大盘的表空间。新建表空间时路径、属主这些它界面上都能配,但我提醒一句,底层目录的权限、属主得跟数据库实例对得上,这是老坑了,图形工具帮你建表空间,可不会帮你去操作系统层把目录权限理顺,那一步还得你来。
系统和参数。KingbaseES那块能看系统信息和系统参数。平时查个版本、看个参数值不用敲命令,点开就能看。
会话管理器,这个是真救命。你能看到当前都有哪些会话连着、谁在跑什么SQL、跑了多久。生产库突然变慢,我第一件事就是开会话管理器,按耗时一排,揪出那个跑了俩小时还没结束的查询,看清楚是谁、在干嘛,然后处理。
锁管理器,更救命。应用突然大面积报超时、卡住,十有八九是锁等待——一个会话锁住了某几行,别的会话全排队等。锁管理器能让你看到谁锁了谁、锁在哪个对象上、有没有阻塞链。
排障时我脑子里的固定动作: 1. 应用报"卡住/超时" → 先开锁管理器 2. 找阻塞别人的"元凶"会话(blocking那个) 3. 看它正在跑啥、是哪个业务/哪个人发起的 4. 能等就联系发起方,等不了就 kill 这个会话 5. kill完确认锁释放、排队的请求恢复 → 然后回去查为什么会产生长事务,从根上堵这里我又要念叨了,工具把杀会话做得再方便,你也得谨慎。那个"终止会话"的按钮按下去,对方正在跑的东西就中断了,万一是个正在做关键批处理的任务,你一杀可能造成数据状态不一致。所以我的规矩是:看清楚、能联系本人先联系、确认是僵死/失控的会话再动手,而且杀完一定要追溯为什么会出现这个长事务,是代码忘了提交,还是逻辑本身就慢,不能杀完就当完事。
四种库,管理界面不是一回事
我专门对比了下它连四种库时导航树的差异,这个能看出产品做得用不用心。
连KingbaseES,对象最全:库、模式、表、视图、物化视图、函数、存储过程、触发器、序列、外部表、程序包、同义词、类型、外部链接、用户、角色、表空间、系统、会话管理器、锁管理器,一大串。
连Oracle,对象是按Oracle的体系来的,有表、视图、物化视图、函数、存储过程、序列、程序包、同义词、类型、用户、角色、会话管理器——你注意,它给Oracle配的是Oracle那套概念,比如程序包、同义词这些Oracle重度使用的对象都在。
连SQLServer,又不一样了,它有"模式(schema)“、序列、同义词、触发器、类型,管账号那块叫**登录名(Login)**而不是普通用户,会话那块就叫"会话”。登录名和数据库用户在SQLServer里本来就是两个层次的东西,它界面上也确实是分开的,这个细节是对的,没糊弄。
连MySQL,对象种类相对少,库、表、视图、函数、存储过程、触发器、用户、会话管理器这一套。MySQL里本来就没有Oracle那种程序包、同义词的概念,所以树里自然也没有。
我为什么要专门说这个?因为我用过那种号称"支持多种数据库"但其实是拿一套界面硬套所有库的工具,连过去之后对象对不上、术语张冠李戴,用着特别别扭。KSQL Developer这个是真按每家的体系做了适配的,你连哪家,看到的就是哪家的对象模型。这个活儿不出彩,全是脏活累活,但恰恰是这种地方见功力。
当然也不是没槽点。跨库的时候有些操作的命名、菜单位置会有细微差别,你要是记死了"这个功能一定在第三个右键菜单",换个库可能找不着,得适应一下。还有就是各家SQL方言不同,你在这个编辑器里给Oracle写的DECODE、(+)外连接那套,直接拿去MySQL上跑肯定报错,工具能帮你管对象、能给你补全关键字,但它不会替你抹平方言差异,这个心理预期要有。它是个"统一的管理入口",不是个"自动翻译器"。
Linux部署踩坑实录,这章手册写得实在,我也踩得实在
前面讲的都是用起来多爽,这节我得讲讲装它的时候多狼狈。手册最后专门有一章"常见问题解决",我基本挨个中了一遍,说明这些坑是真普遍。这玩意儿是基于Eclipse那套图形架构做的,Linux图形界面主要靠GTK,所以问题大多出在图形显示环境上。
第一个坑,界面一直闪烁,内存还蹭蹭涨。手册说得明白,它用到org.eclipse.equinox.launcher.gtk.linux.x86_64这个模块,跑在GTK3上的时候可能界面不停闪、内存不断涨。解决办法跟输入法有关,二选一试:
exportGTK_IM_MODULE=fcitx# 或者exportGTK_IM_MODULE=ibus我当时用的是fcitx,设完重启就好了。这种跟图形/输入法纠缠的bug特别玄学,你要不是看到手册明说,自己能排查一晚上都未必想得到是输入法模块的锅。
第二个坑,启动直接报Cannot open display。这个典型是你在远程、或者su切换了用户之后跑图形程序,DISPLAY环境变量没指对。手册给的办法:
# 1. 先看本机IP# 2. 设置DISPLAY,把本机地址填进去exportDISPLAY=本机地址:0.0# 3. 再启动本质就是图形程序不知道往哪个显示器上画窗口,你得明确告诉它。
第三个坑最磨人,jvm terminated exit code=xxx,光这个就有好几种码:
exit code=-1 : 启动配置/内存设置问题,改 KSQLDeveloper.ini 里的 -Xms 和 -Xmx exit code=127 : 找不到java,JAVA_HOME没配对,或者java不在PATH里 exit code=13 : ①jdk和程序位数要一致(32对32,64对64) ②jdk/jre有没有执行权限 exit code=2 : 和系统里别的java环境冲突了,把它的配置项在PATH里挪到前面我最开始就是exit code=13,折腾半天,结果是服务器上装的是另一套位数的JDK,跟它对不上。后来-1也遇到过,是内存给小了,去那个ini文件里调:
# KSQLDeveloper.ini 里跟JVM相关的几个关键项 -vmargs -Xms256m # JVM初始内存,默认256m -Xmx1024m # JVM最大内存,默认1024m -Dfile.encoding=UTF-8 # 本地字符集,乱码问题往往在这-Xmx那个默认1024m,你要是对象多、导航树里展开一大堆库,可能不够用会卡顿甚至溢出,适当调大。但也别一激动给个好几G,32位环境下你给太大反而起不来,这个分寸自己掂量。file.encoding这个提一句,中文乱码先查它。
第四个坑,X11 connection rejected because of wrong authentication。这个是SSH转发X11时的认证问题,排查顺序手册给得很清楚,我按我的理解复述:
# 0. 先排除磁盘满了这种低级原因# 1. 检查 ~/.Xauthority 是不是归你自己所有ls-l~/.Xauthority# 2. 属主/权限不对就修(user:group换成你自己的)chownuser:group ~/.Xauthoritychmod0600 ~/.Xauthority# 3. 确认sshd开了X11转发grepX11Forwarding /etc/ssh/sshd_config# 得输出 X11Forwarding yes;没有就加上再重启sshd# 4. 重新登录远程服务器这一套下来基本能解决。说真的,图形客户端在纯命令行的Linux服务器上通过X11转发跑,本身就是个容易出幺蛾子的场景。我现在的做法是:日常在我自己的图形工作站上装客户端,远程连数据库,绝大多数操作根本不用在服务器上开GUI;只有特殊情况才折腾X11。能不折腾就别折腾。
附录里的干货:驱动参数和读写分离
手册附录列了一堆驱动属性,我挑几个真正有用的说,尤其是配合读写分离集群的那几个。你连接串里是可以带这些参数的:
SLAVE_ADD / SLAVE_PORT : 备机地址和端口,多个用逗号隔开,开读写分离要用 CONNECT_POOLSIZE : 连接池大小 RETRYTIMES : 失败重发最大次数,默认10 RETRYINTERVAL : 每次重发间隔秒数,默认5 MONITORINTERVAL : 集群检测线程的检测间隔(秒) HOSTLOADRATE : 主机读语句负载率,控制读请求在主备间怎么分 StableSlave : 读语句是否固定分发到同一个备机 MASTER_CHECK : 新连接时检查当前是不是master这里面的逻辑我稍微解释下,因为挺有意思。开了读写分离之后,写肯定走主机,读怎么分到备机是有讲究的。HOSTLOADRATE是主机的读负载比例,系统会拿"当前发给主机的语句数/总语句数"跟这个比例比,该发主机发主机、该发备机发备机;语句计数到了整数上限还会拿实际比例重置,避免数字越滚越大失真。StableSlave这个考虑的是会话一致性——同一个会话的读如果一会儿发这个备机、一会儿发那个备机,而备机之间数据同步有延迟,你可能前一条查到了刚写的数据、后一条又查不到(因为落到了还没同步完的备机上),设成固定备机能缓解这种"读飘了"的诡异现象。
还有两个黑白名单的参数,处理"哪些函数/语句得强制走主机":
BlackList : 默认认为函数只读,这里列"写函数"名单(分号分隔), 命中的发主机;不支持函数重载区分,且和WhiteList同时配时只有BlackList生效 MasterFounctionList: 只发主机、但不改变事务状态的函数列表 BlackSqlList : 只发主机、但不改变事务状态的SQL,比如 SET TRANSACTION READWRITE、BEGIN READ WRITE TempTable : 查询临时表的语句只发主机且不改事务状态这套东西解决的是读写分离里最烦的"函数副作用识别"问题——中间件光看SQL文本很难判断一个自定义函数内部到底有没有写数据,默认当只读发给备机,万一它里面改了数据就出事。所以让你显式把写函数列进黑名单、强制走主机。我对这个设计的看法是:它给了你控制权,是好事,但也把责任压给了你——你得足够了解自己系统里每个函数到底干了啥,漏标一个写函数,在读写分离下就是数据不一致的隐患。这种"工具提供机制、人来提供策略"的边界,我觉得是清醒的,但对使用者的要求确实不低,新人容易在这栽跟头还不知道为什么。
另外提一句ConfigurePath,连接特别多的时候,可以把连接配置放到一个外部配置文件里,连接串里指定路径就行,省得每个连接都堆在URL里;文件里的配置和URL重复时,文件会覆盖URL的值,这个优先级要记牢,别配了半天发现没生效原来是被覆盖了。
用了俩月,说几句实在的
唠这么多,我对KSQL Developer这套SQL编辑器的整体感觉,好坏都说说。
它最打动我的就一点:把异构这件事做扎实了。一个客户端连四种库,对象模型还跟着每家走,不是一套皮硬套,再加上SQL编辑、DDL实时预览、ER图、会话锁管理这些,对我们这种天天在好几种数据库之间横跳的人来说,是真的减负,桌面上清净了,脑子也不用在好几套快捷键之间来回换挡了。
但我也有几个不太满意或者说想提醒的地方。其一,它强在"管理"和"编辑",你别指望它是个性能调优神器或者存储过程单步调试器,至少我手上这个版本,那些高级活儿它不揽,该上专业手段还得上,期望摆正了用着才不拧巴。其二,图形化越方便,越考验使用者的底层功夫,DDL预览、批量删除、杀会话、读写分离黑白名单,这些都把"能力"给你了,可判断对错的责任始终在你,它不会拦着你犯傻。其三,Linux上这套基于GTK/Eclipse的图形架构,安装部署的坑是真不少,闪烁、DISPLAY、JVM码、X11认证,手册倒是诚实地都列了,但你得有耐心一个个趟。
所以我的结论是:作为一个要同时伺候多种异构数据库的日常入口,它够格,我会继续用;但它是个趁手的"遥控器"和"管理台",不是"自动驾驶"。工具负责把动作变简单,你负责保证每个动作是对的——这话我说了一整篇,因为这确实是我用了这么多年数据库工具最想留给你们的一句。
下篇就到这,希望那些Linux报错的解决办法,能让你少熬几个夜。完。