ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

国产数据库部署与权限管理实战:金仓、达梦、GBase、GaussDB对比

国产数据库部署与权限管理实战:金仓、达梦、GBase、GaussDB对比

最近我在测试环境里同时跑起了人大金仓KingbaseES、达梦DM8、南大通用GBase和华为GaussDB这四套国产关系型数据库,目的很简单:把一套老的Oracle业务完整迁过去,看看每家在部署、授权、日常权限维护上到底什么手感。折腾完一轮之后,最大的感受是:这些数据库都不是“另一个MySQL”,每家的权限模型、部署路径、坑点差异很大,如果拿过去的习惯直接套,翻车概率非常高。

这篇内容不是官方文档的复述,而是我在模拟项目X里挨个装、挨个配、挨个踩坑的记录。适合正在做国产数据库选型、迁移评估,或者刚接手这类库需要摸清权限管理门道的DBA和开发同学。文章重点放在两件事:部署环节有哪些决定后续命运的选项,以及权限管理在四套库里的实际差异。

1. 部署方式定生死:先想清楚三件事再动手

很多人拿到安装包就开装,装完才开始想架构,结果后面权限模型稀烂、迁移到处碰壁。以我这次的实测经验,动手之前至少要把下面三件事定下来。

1.1 四款数据库的定位差异

先看大方向。虽然都叫“关系型数据库”,但它们的血缘和设计取向完全不同,这直接决定了你该用它当OLTP主库还是分析库。

数据库血缘/设计取向适合场景我注意到的特点
KingbaseES(人大金仓)内核基于PG,同时提供Oracle兼容模式传统OLTP、政府/金融类业务系统语法习惯在PG和Oracle之间切换,两个模式我都测过
DM8(达梦)自研内核,语法大量贴近Oracle单机/主备OLTP,也支持共享存储集群初始化参数对后续影响很大,尤其大小写敏感和页大小
GBase(南大通用)8a是MPP分析型,8s是行存OLTP型8a适合数仓/大宽表分析,8s适合交易型系统同一个品牌下两代产品,权限和部署方式截然不同
GaussDB(华为)集中式与分布式两套路线,语法偏向PG云化环境、需要弹性扩展的业务部署复杂度偏高,但权限模型和PG血缘很近

我在模拟项目X里实际上装了五个环境:KingbaseES V8、DM8、GBase 8a、GBase 8s、GaussDB集中式。这样做的原因是,光看“支持SQL”、“兼容Oracle”这种宣传词完全看不出差异,只有把同样的建库、建账号、授权脚本各跑一遍,才知道哪些真兼容、哪些只是壳子。

1.2 选部署形态:单机、主备、还是集群

部署形态不是简单的高可用问题,它直接决定权限管理入口在哪里。四款库在这个维度上的选择差很多。

KingbaseES和DM8的常规路线是单机起步,然后做主备同步。主备部署时,写权限只在主库,备库通常要设成只读或者直接不允许业务连接。我见过有人把备库悄悄开放给报表业务,结果查询把同步拖慢的案例。如果要做读写分离,至少要把只读账号和读写账号在角色上分开,而不是用同一个账号连两个库。

GBase 8a是MPP架构,天然就是集群形态,有coordinator节点、gnode数据节点和gcware管理组件。权限管理主要在coordinator层完成,你如果把某个账号授权到某个数据节点的分片上,那基本是走错了路。GaussDB分布式的CN节点也是类似角色,所有权限入口都在协调节点上统一管理。

所以我的建议是:先画一张部署拓扑图,标注清楚哪个节点接收客户端连接、哪条链路走主备/集群同步。后面做权限设计的时候,每个账号该建在哪一层、该授什么级别的权限,跟着拓扑走就不会乱。

1.3 从Oracle/MySQL迁移带来的认知惯性

权限管理翻车的根源大多是认知惯性。从Oracle过来的人,习惯于“一个实例内多个schema,用schema隔离业务”,所以到了达梦、金仓这种模式上会觉得很自然;但到了GBase 8a上,发现它更接近“库名.表名”的MySQL风格,grant语句的颗粒度也完全不一样。从MySQL过来的人则容易踩到达梦、金仓的schema语义坑:以为“database”和“schema”是一回事,结果建完表发现别的用户根本看不到。

说白了,部署前你最好明确一个总原则:这套库到底是按“实例-用户-模式-对象”的四级体系来管,还是按“集群-库-表”的三级体系来管。这个原则定不下来,后面的授权脚本就是一笔糊涂账,验收时会非常尴尬。

2. KingbaseES与DM8:单机部署全流程复盘

金仓和达梦都属于“传统单机/主备”场景的主力,部署过程也最有代表性。我把两边都完整跑了一遍,重点记录那些影响权限管理的初始化选项。

2.1 环境检查与安装包准备

两台测试虚拟机配置一样:8核CPU、16G内存、100G数据盘,操作系统是CentOS 7系的Linux。共同注意点有三项:

  • 创建专用OS用户。金仓一般用kingbase,达梦建议用dmdba,尽可能用专用用户安装,严禁直接用root跑安装包。
  • 检查文件句柄和进程数限制。在 /etc/security/limits.conf 里设置 nofile 和 nproc,否则高并发时数据库会莫名报错。
  • 数据目录单独挂盘。安装目录和数据目录分开,方便后面备份恢复。

达梦安装前还要多看一眼内核参数:共享内存、信号量这些。虽然新版本对共享内存的依赖少了,但我的习惯还是提前把 kernel.shmma、kernel.shmall 之类的参数调到一个保守可用的范围。金仓因为是PG血缘,对系统资源要求相对克制。

2.2 KingbaseES静默安装与初始化实例关键参数

我优先选了静默安装,因为生产服务器通常没有图形桌面,交互式安装反而麻烦。金仓的安装包解压后会有应答文件模板,在里面指定安装路径、数据库路径、端口、字符集、超级用户密码等信息,然后执行 setup.sh -i 应答文件 即可。

这里有一个影响权限的隐藏选项:数据库兼容模式。金仓支持Oracle兼容和PG原生态两种模式。如果目标是迁Oracle业务,我强烈建议一开始就选Oracle兼容模式,这样create user、grant connect、角色这些语法更贴近Oracle,应用端改造量会小很多。

初始化完成后,默认会生成一个超级用户和几个自带数据库。我的登录命令是:

ksql -U system -d test -p 54321

注意端口默认是54321,不是5432。heads-up:第一次登录最好立刻执行下面这段检查语句,确认兼容模式、字符集、审计开关是不是符合预期:

select version(); show server_encoding; show dbcompatibility;

如果没有在应答文件里设置审计参数,后面做权限审计时还得再改一遍配置并重启,这是很多新手忽略的事。

2.3 DM8静默安装与dminit参数设计

达梦的安装包主要是一个DMInstall.bin,可以图形安装,也可以带参数静默安装。生产环境我同样推荐静默方式,安装过程本质上是解压产品文件,装完还要跑一个root脚本去配置环境变量和服务。

真正决定权限管理走向的是初始化实例那一步,命令大概是:

dminit PATH=/dm/data DB_NAME=DEMO INSTANCE_NAME=DMSERVER \ PORT_NUM=5236 PAGE_SIZE=8 CHARSET=1 CASE_SENSITIVE=0

这个命令里有三个参数值得单独拿出来讲:

  • PAGE_SIZE:页大小。达梦常见可选4K、8K、16K、32K。如果未来要迁Oracle大库,建议直接上8K或16K。这个参数建库后不可改,选小了后续表空间扩展会很被动。
  • CHARSET:字符集。1代表GBK,0代表UTF-8。如果业务有中文又跨平台,我更推荐UTF-8。
  • CASE_SENSITIVE:大小写敏感。0表示不敏感,1表示敏感。这个参数直接决定你写表名、授权时要不要加双引号,是后续一堆权限坑的总源头。从Oracle迁过来通常选1,从MySQL迁过来通常选0,但必须有意识地定,别默认。

初始化完成后,达梦会注册一个服务,名字类似 DmServiceDMSERVER,启动后用disql登录:

disql SYSDBA/SYSDBA@localhost:5236

达梦默认内置账号是SYSDBA、SYSSSO、SYSAUDITOR,分别对应DBA、安全员、审计员。这点和大部分数据库都不一样,权限设计时相当于多了一个“三权分立”的维度,后面在权限模型部分细说。

2.4 部署完成后的第一轮体检

两个库装完之后都要做一轮基础体检,我习惯写成脚本复用。检查项包括:进程是否在、端口是否监听、日志目录有没有报错、能否用业务账号远程登录、表空间大小。

# 金仓 systemctl status kingbase8d ss -lntp | grep 54321 # 达梦 systemctl status DmServiceDMSERVER.service ss -lntp | grep 5236

这一步多做几分钟,后面权限问题排查时会省很多事。我这次就遇到过金仓日志里连续报认证失败,但服务状态却是正常的,如果只看systemctl根本发现不了。所以“进程在跑”只是最低标准,真正的健康度要看日志和实际连接。

3. GBase与GaussDB:集群/分布式形态下的部署差异

如果说金仓和达梦是“老派稳重型”,GBase 8a和GaussDB就是“一上来就把架构写进DNA”的选手。它们的部署路径完全不是单机形态,权限管理入口也随架构变化。

3.1 GBase 8a的MPP部署路径

GBase 8a是分析型MPP数据库,经常被人拿来和行列存、大数据分析这些词放一起。在模拟项目X里,我搭了一个简化集群:三个节点,分别承担coordinator、gnode和gcware角色。安装方式主要靠批量脚本分发安装包到所有节点,再在配置文件里写明节点分工,最终由管理端统一初始化。

安装完成后,所有数据操作和管理操作都走coordinator节点。登录命令是:

gccli -ugbase -p -hcoordinatorIP

创建库和授权都很像MySQL:

create database if not exists dwdb; create user 'bi_user'@'%' identified by 'StrongP@ss1'; grant select on dwdb.* to 'bi_user'@'%'; flush privileges;

这里有个很容易混淆的地方:GBase 8a里面“实例”的概念没有金仓、达梦那么强,权限更多是围绕“库”和“用户”展开的。如果你把Oracle思维带进来,非要在8a里找一个“schema”层级去授权,会发现没有对应物,授权只能落在库级别。所以数据库内部的权限设计一定要跟着产品形态走,强行套老架构只会自讨苦吃。

3.2 GBase 8s行存场景

GBase 8s和8a几乎是两个世界。8s是行存储OLTP数据库,与Informix血缘较近,部署时需要使用gbasedbt用户,初始化过程中要配置数据库服务器名和onconfig参数。启动服务后,用dbaccess连接到数据库,权限模型也更接近传统UNIX风格:创建用户、给connect和resource权限、再按表授权。

我这次在8s上建业务账号的操作大概是:

create user app_ops with password 'StrongP@ss1'; grant connect to app_ops; grant select on orders to app_ops;

注意8s里“用户”和“登录数据库实例的账号”绑定得更紧,一个用户能不能登录、能不能建表、能不能查某张表,是分层控制的。如果只是create user但没grant connect,应用端连接时会直接被拒。这个坑点虽然没有技术难度,但在首次接触8s的人里面很常见。

3.3 GaussDB集中式部署简记

我测的是GaussDB集中式版本,部署流程比金仓、达梦要重:先解压安装包,再跑预安装脚本准备系统环境,然后用一个XML配置文件描述集群节点的IP、数据目录、端口等信息,最后执行安装命令初始化。

初始化完成后,默认有一个操作系统用户oms,也就是集群管理员。日常登录用gsql:

gsql -d postgres -p 8000 -U oms -W 'StrongP@ss1'

GaussDB的权限体系和PG非常接近:用户、角色、schema、库这几个概念都有,但角色和用户之间的边界比PG更接近Oracle风格。创建业务账号时,如果只create role,会发现登录不行、建表不行、查询也不行,必须同时授予login和对应schema权限。

3.4 部署形态对权限入口的直接约束

把四款库放到一起看,一个很明显的规律是:权限入口跟着连接入口走。单机/主备库里,权限入口就是实例本身,DBA在一台机器上管理所有账号。MPP库里,权限入口是coordinator或CN节点,你只需要在这些协调层做授权,数据节点的分片权限由集群内部处理。分布式GaussDB同理,业务连CN,管理账号也放在CN上。

所以部署完第一步不是急着建表,而是确认“以后DBA和业务分别从哪个节点连进来”。这个确认好之后,账号规划才能落地:哪些账号是协调节点级别的、哪些是数据节点操作需要的、哪些只给某个库、哪些只给某几张表。规划完写进部署文档,后面权限管理就顺了。

4. 权限模型横评:把人、角色、权限的对应关系捋清楚

部署完成后,最耗精力的其实是权限设计。四款库的内置账号、授权命令、角色机制各不相同,我把它们放在一起做了对照。

4.1 内置账号也是分层的

数据库内置管理账号角色分工特点
KingbaseESsystem超级管理员,通常也是安装时创建的账号
DM8SYSDBA / SYSSSO / SYSAUDITOR三权分立:DBA管理数据,安全员管安全策略,审计员管审计日志
GBase 8agbase集群超级用户,管coordinator和整体集群
GBase 8sgbasedbt / informix实例级超级用户,偏传统UNIX风格
GaussDBoms初始集群管理员,后续账号可再授予管理员角色

达梦最特殊,它把安全员和审计员单独拆出来,这种设计在企业内控严格的场景里很受欢迎:DBA不能看审计日志,安全员不能动业务数据,互相制约。但也是因为这种分离,我第一次配达梦时顺手把SYSDBA当成万能账号去开审计,结果发现根本没有权限,后来才意识到必须有SYSSSO和SYSAUDITOR的参与。

金仓和GaussDB更接近PG风格:初始管理员就那么一个,其他管理员角色都是后续grant出来的,授权脚本自由度高,但也容易把权限授乱。

4.2 常用授权命令差异对照

我把“创建业务账号并授权查询某张表”这个最基础的操作,在每个数据库上各跑了一遍,命令大致如下:

数据库创建用户示例授查询权限示例
KingbaseEScreate user app_rw identified by 'StrongP@ss1';grant select on table t_order to app_rw;
DM8create user app_rw identified by 'StrongP@ss1';grant select on t_order to app_rw;
GBase 8acreate user 'app_rw'@'%' identified by 'StrongP@ss1';grant select on dwdb.t_order to 'app_rw'@'%';
GBase 8screate user app_rw with password 'StrongP@ss1';grant select on t_order to app_rw;
GaussDBcreate user app_rw password 'StrongP@ss1';grant select on t_order to app_rw;

看下来会发现,除了GBase 8a和MySQL血缘较近,其他几家的语法都明显向Oracle/PG靠拢。这有个实际好处:如果你团队里有人熟悉Oracle或PG,迁移后写授权脚本不会太痛苦。但你同样不能照搬,因为金仓、达梦、GaussDB对“模式(schema)”“表空间”“默认表空间”的处理细节不完全一样,授权之前必须确认目标对象在哪个schema下。

4.3 从Oracle迁移权限的映射思路

在模拟项目X里,我的老Oracle库里有几个经典角色:connect(能登录)、resource(能建表)、dba(管理员)。迁移到达梦和金仓时非常顺手,因为这两家本身就保留了类似概念。

-- 达梦 grant connect, resource to app_rw; -- 金仓Oracle兼容模式 grant connect, resource to app_rw;

迁到GaussDB时就要调整:不再有现成的connect/resource角色,得拆成登录权限和schema权限:

-- GaussDB create user app_rw password 'StrongP@ss1'; grant login to app_rw; grant usage on schema public to app_rw; grant select, insert, update, delete on all tables in schema public to app_rw;

迁到GBase 8a则更简单粗暴,直接在库级别授权就可以了。所以我的建议是:迁移前先做一张针对具体应用的权限对照表,把老库“哪些角色、哪些权限”逐项映射到新库的语法上,而不是靠人肉翻译几条grant。

4.4 角色设计建议:最小权限在四库中的落地

最小权限原则谁都会说,落地时关键是“用角色而不是直接给用户授权”。我自己在四库上的统一做法是:

  1. 建只读角色、读写角色、运维角色三级。
  2. 业务账号只绑定一种角色,少数需要跨级操作的账号单独人工审批。
  3. 应用账号和人用账号彻底分离,应用账号对应连接池,人用账号对应DBA或开发人员。

金仓、达梦、GaussDB这三家都原生支持角色,建角色和授角色的语法跟用户很接近:

-- 金仓 create role role_app_readonly; grant select on all tables in schema app_schema to role_app_readonly; grant role_app_readonly to user_app_ro;

GBase 8a没有完全等价的“角色”机制,权限直接挂在用户上,所以更依赖你通过账号命名和库权限来落地最小权限。比如把只读账号统一命名成ro_business,授权时只给对应库的select,这样至少不会把写权限漏出去。

5. 权限实战中反复踩到的五个坑

权限管理最容易出问题的往往不是“不会grant”,而是“grant了但没用”。这五个坑我在四库上基本都踩过,写出来给大家做个参照。

5.1 坑一:大小写敏感直接让授权找不到目标

这个坑主要来自达梦的 CASE_SENSITIVE 参数。如果初始化实例时设成大小写敏感,那么你在SQL里写的表名若不带双引号,默认会转成大写,比如t_order变T_ORDER。此时应用端如果写的是小写表名,查询会报“表或视图不存在”;你在授权时如果写grant select on t_order,实际也可能落到别的大写对象上,或者直接找不到对象。

我的建议是:建库前明确大小写策略,测试环境把CASE_SENSITIVE设为0,能让团队少踩很多坑;如果已经是敏感模式,那应用端SQL规范里必须约定“统一大写”或“统一小写”,并且授权时和建表时保持一致。这种问题排查起来特别费时间,因为报错信息和真实原因对不上。

5.2 坑二:schema和库的语义差异导致默认权限失效

在达梦、金仓、GaussDB这类库里,完整的对象名是“模式名.表名”,而不是“库名.表名”。很多业务系统从MySQL迁过来,SQL里写的是数据库名.表名,到了这些库上根本不匹配,因为名字指向的不是同一层。

更隐蔽的情况是:用户A创建了一张表,默认归属在A自己的schema下。用户B即使有整个实例的连接权限,也看不见这张表,因为B的默认schema是空的。问题出现时,DBA查到的原因经常是“没授权”,但用户确实已经grant了所有权限。实际上要补的是schema的usage权限:

grant usage on schema user_a_schema to user_b; grant select on user_a_schema.t_order to user_b;

所以刚接手这类库时,我习惯先执行一条查询,把当前用户拥有的schema列出来,再决定授权范围。别想当然地认为“库和schema同名就一定是同一个”。

5.3 坑三:监听与认证配置挡掉远程DBA

权限授权写得再漂亮,远程连不进来也没用。四款库里,金仓默认监听localhost,达梦默认更多的也是本地监听,GaussDB初始配置通常也只允许受信网络访问。第一次用dbeaver或Navicat连这些库的人,十有八九会先卡在连接超时。

金仓需要改监听地址和认证文件,类似PG的pg_hba.conf修改逻辑;达梦要改dm.ini里的监听配置,如LISTNER_IP、PORT_NUM,有些版本还要同步调整网络安全配置。别小看这一步,我在模拟项目X里就因为只改了端口没改监听IP,导致远程DBA账号始终无法连接,排查了半天才发现是防火墙和监听两层都在拦。

5.4 坑四:密码复杂度策略让首次登录翻车

达梦和金仓的密码策略默认都比较严。我在第一次装达梦时,给SYSDBA设了个简单密码,结果初始化实例阶段就报错;改用大小写字母+数字+特殊字符的组合后才通过。GaussDB也类似,初始密码不满足强度要求,创建的账号在连接时会被策略直接挡住。

这是很无语但又常见的坑:密码策略设得太严,会让开发人员把密码抄在记事本上;设得太松,审计又过不去。我的处理方式是区分账号类型:应用账号用强密码加定期轮换,开发测试账号可以用中等强度密码,但只开放给内部测试网段。这样既不违背安全要求,也不会把整个团队逼疯。

5.5 坑五:授权给了角色但忘记默认角色生效

在Oracle兼容模式的金仓和达梦上,有时候你创建了角色、grant了角色给用户,但用户登录后发现权限没生效。常见原因是目标用户默认不会自动激活所有角色,需要显式set role或者在登录时指定默认角色列表。

这个坑特别隐蔽,因为DBA检查授权时看到的都是“已授权”,但应用连接池一跑业务就报权限不足。排查动作很简单,用用户的身份登录,执行:

select * from session_roles; select * from user_role_privs;

对比一下授权和会话里实际生效的角色。如果角色没有激活,在角色设计时就要把默认激活这件事一并考虑进去,而不是只依赖grant。

6. 权限审计与账号生命周期管理

部署验证通过、业务跑起来之后,权限管理才真正开始。审计日志怎么看、账号怎么开怎么关,这些工作做不好,前面的所有权限设计都会慢慢形同虚设。

6.1 四库的审计开启方式与查看入口

审计不是默认全开的,至少我测试的默认配置里都没开完整审计。金仓可以在配置里打开审计参数,然后查看系统审计表;达梦需要SYSSSO设置审计状态和级别,再由SYSAUDITOR查询审计日志;GBase 8a的管理日志和审计日志也要在配置里单独打开;GaussDB可以通过参数控制审计开关,在SQL层查询审计信息。

我的做法是:在新库上线时就明确“必须审计的账号范围”,比如所有DBA账号、所有远程运维账号,全部纳入审计;业务账号本身不做全量SQL审计,否则日志量会非常可怕。

6.2 业务账号开通、变更、回收的表单化流程

权限管理最大的对手不是技术而是流程。我在这几套库上试验过一种比较管用的方式:每个账号申请都走一个最小化流程,包含以下信息:

  • 申请目的:用于哪个应用、哪个模块、哪种连接方式
  • 涉及对象:实例/IP、库名、schema、表范围
  • 有效期:什么时候开通、什么时候回收
  • 审批人:运维负责人或应用负责人

账号命名也建议统一:应用名_环境_用途,比如dw_prd_ro表示数据仓库生产只读账号。权限变更时直接改角色,而不是给单个用户加权限;账号回收时优先禁用而不是删除,因为禁用后还能查审计,真要恢复也方便。

6.3 备份与恢复对权限管理的连带影响

最后提一个容易忽略的联动点:备份恢复。物理备份恢复通常会保留账号和角色,时间点一致,问题不大。但如果做的是逻辑导出再导入,比如用工具把表结构数据导到新库,账号和权限往往不在导出范围内,新库只会有表和数据,没有用户。

这种情况我遇到过不止一次,最后的补救方式就是上面说的角色体系:只要用户角色定义文档和授权脚本保留完整,重建账号也就是几分钟的事。所以每一套库上线时,我都会把“建表、建账号、授权、建角色”四类脚本归档到独立的脚本目录,避免权限配置只存在于某一次交互式操作里。

我现在的习惯是:不管装哪套国产库,都顺手写一份名为install_<db>_checklist.sh的巡检脚本,把部署参数、大小写策略、字符集、审计开关、账号清单全部记录下来。下一次升级、迁移、故障排查时,先翻这份清单,而不是重新猜当初是怎么配的。国产数据库没有哪套是“装完就能忘”的,把细节留到文档里,权限才不会变成玄学。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进