好的,我们来详细解析一下 ORA-00035 这个相对不太常见的错误。
🔬 官方正式解释
错误代码: ORA-00035
官方描述: LICENSE_MAX_USERS cannot be altered unless LICENSE_MAX_SESSIONS or LICENSE_SESSIONS_WARNING is set to zero.
含义:
此错误发生在尝试修改 LICENSE_MAX_USERS 初始化参数时,违反了Oracle的许可参数修改依赖规则。根据Oracle的许可管理机制,只有当 LICENSE_MAX_SESSIONS 和 LICENSE_SESSIONS_WARNING 这两个参数的值均为0时,才允许对 LICENSE_MAX_USERS 进行修改。如果这两个参数中的任何一个被设置为非零值,尝试更改 LICENSE_MAX_USERS 的操作将被数据库拒绝,并抛出ORA-00035错误。
这是一种数据完整性检查,旨在防止数据库的许可配置处于不一致或冲突的状态。
🧾 原因与场景
根本原因:
Oracle数据库提供了两种主要的方式来管理和监控软件许可的使用情况:
- 基于会话的许可(Session-based Licensing): 通过
LICENSE_MAX_SESSIONS(允许的最大并发会话数)和LICENSE_SESSIONS_WARNING(会话警告阈值)参数来管理。 - 基于用户的许可(User-based Licensing): 通过
LICENSE_MAX_USERS(允许创建的最大用户数)参数来管理。
这两种方式是互斥的。数据库管理员(DBA)必须选择其中一种许可监控模式。ORA-00035错误强制实施了这种互斥性。
典型场景:
- 错误的管理操作: DBA试图使用
ALTER SYSTEM命令设置或修改LICENSE_MAX_USERS参数,但当前系统已经启用了基于会话的许可监控(即LICENSE_MAX_SESSIONS或LICENSE_SESSIONS_WARNING不为0)。 - 脚本或自动化工具执行: 某个自动化配置脚本或工具试图统一设置所有许可参数,而没有遵循正确的参数设置顺序和依赖关系。
- 从会话许可切换到用户许可: DBA希望将许可监控方式从“基于会话”改为“基于用户”,但没有先禁用会话许可设置(即将会话相关参数置零),就直接尝试设置用户许可参数。
⚙️ 相关原理
Oracle数据库使用初始化参数来执行许可证合规性的监控和警告(请注意,这些参数主要用于监控,并不直接强制执行许可限制,但其设置应反映您所购买的许可协议)。
其核心原理是逻辑分离:
LICENSE_MAX_SESSIONS和LICENSE_SESSIONS_WARNING是一组,用于监控并发连接数。LICENSE_MAX_USERS是另一组,用于监控创建的用户账户数量。
数据库设计要求在同一时间只能激活一组监控方式,以避免混淆和重复计算。ORA-00035错误就是这个设计原则的守护者。它确保你在启用一种监控模式之前,必须先彻底关闭另一种模式。
🔗 相关联的其他ORA-错误
- ORA-00019: maximum number of session licenses exceeded。当并发会话数超过
LICENSE_MAX_SESSIONS的设置时,新会话连接将失败并抛出此错误。 - ORA-00020: maximum number of processes (
PROCESSES) exceeded。虽然与许可无关,但症状类似(无法建立新连接),通常是因为PROCESSES初始化参数设置过低,达到了操作系统或Oracle的进程数上限。 - ORA-01990: error opening password file。在极少数情况下,如果权限问题导致无法访问口令文件,可能会影响用户创建,但与许可监控无关。
- ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit。此错误与用户配置文件(Profile)中的限制有关,而不是全局的许可证限制。
🕵️ 定位原因与诊断分析
分析过程:
- 确认错误操作: 首先,确认错误是在执行
ALTER SYSTEM SET LICENSE_MAX_USERS=...命令时发生的。 - 检查当前许可设置: 查询数据库当前的许可参数设置,这是诊断的关键步骤。
-- 查询当前所有与许可证相关的参数设置 SELECT name, value FROM v$parameter WHERE name LIKE 'license%'; -- 或者使用更精确的查询 SELECT * FROM v$license; - 分析查询结果: 查看
LICENSE_MAX_SESSIONS和LICENSE_SESSIONS_WARNING的当前值。如果其中任何一个的值不为0,那么这就是导致ORA-00035错误的原因。
🛠️ 解决方案与相关SQL
解决方案:
要解决ORA-00035错误,您必须遵循正确的操作顺序:先禁用基于会话的许可监控,然后再设置基于用户的许可监控。
步骤与相关SQL:
-
检查当前设置(确认问题):
COL name FOR a25 COL value FOR a10 SELECT name, value FROM v$parameter WHERE name LIKE 'license%'; -
禁用基于会话的许可(必要条件):
将与会话许可相关的参数设置为0。这可能需要您修改SPFILE(服务器参数文件)并重启数据库,因为某些许可参数是静态的。-- 如果参数是动态的,可以立即生效,但通常这些是静态参数 ALTER SYSTEM SET LICENSE_MAX_SESSIONS = 0 SCOPE=SPFILE; ALTER SYSTEM SET LICENSE_SESSIONS_WARNING = 0 SCOPE=SPFILE;重要: 由于这些参数通常是静态的,修改
SPFILE后必须重启数据库实例才能生效。SHUTDOWN IMMEDIATE; STARTUP; -
设置基于用户的许可(原始目标):
数据库重启后,现在您可以安全地设置LICENSE_MAX_USERS参数了。ALTER SYSTEM SET LICENSE_MAX_USERS = <desired_value> SCOPE=SPFILE;注意:
LICENSE_MAX_USERS通常也是静态参数,需要再次重启才能完全生效。如果您希望立即测试,可以在设置SPFILE后再次重启。 -
验证最终配置:
再次查询许可参数,确认配置已按预期更改。SELECT name, value FROM v$parameter WHERE name LIKE 'license%';
逆向操作:
如果您想从“基于用户”的许可切换回“基于会话”的许可,同样需要遵循互斥原则:必须先將 LICENSE_MAX_USERS 设置为0,然后才能设置 LICENSE_MAX_SESSIONS。
🧼 通俗易懂的解释
打个比方:
想象Oracle数据库是一个大型游乐场,你有两种方式来限制入园人数:
- 方式一:统计同时在里面玩的人数(基于会话)。 你在门口放了一个计数器,规定场内最多只能有1000人(
LICENSE_MAX_SESSIONS=1000)。 - 方式二:统计你发放的年卡数量(基于用户)。 你只发行了500张年卡(
LICENSE_MAX_USERS=500),只允许有年卡的人入园。
ORA-00035错误就是:
你现在已经启用着“方式一”(计数器正在工作,规定场内1000人)。这时,你突然又想改成“方式二”,并宣布“我们只发行500张年卡!”。
游乐场的管理系统(Oracle数据库)会立刻阻止你,并说:“对不起经理(ORA-00035),您不能再设置年卡数量了,除非您先把那个门口的计数器给关掉(把它设置为0)!”
因为同时用两种方式计数会造成混乱。数据库要求你只能选择一种人数统计方式。
所以,解决办法很简单:
- 第一步:先下命令
关掉门口的计数器(把LICENSE_MAX_SESSIONS和LICENSE_SESSIONS_WARNING都设为0)。 - 第二步:重启游乐场让第一步设置生效(重启数据库实例)。
- 第三步:现在,你可以放心地
设置年卡数量(修改LICENSE_MAX_USERS)了。
希望这个解释能让你彻底明白这个错误的原因和解决方法!
欢迎关注我的公众号《IT小Chen》

被折叠的 条评论
为什么被折叠?



