Oracle数据库 ORA-00035 错误分析和解决

在这里插入图片描述好的,我们来详细解析一下 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_SESSIONSLICENSE_SESSIONS_WARNING 这两个参数的值均为0时,才允许对 LICENSE_MAX_USERS 进行修改。如果这两个参数中的任何一个被设置为非零值,尝试更改 LICENSE_MAX_USERS 的操作将被数据库拒绝,并抛出ORA-00035错误。

这是一种数据完整性检查,旨在防止数据库的许可配置处于不一致或冲突的状态。

🧾 原因与场景

根本原因:
Oracle数据库提供了两种主要的方式来管理和监控软件许可的使用情况:

  1. 基于会话的许可(Session-based Licensing): 通过 LICENSE_MAX_SESSIONS(允许的最大并发会话数)和 LICENSE_SESSIONS_WARNING(会话警告阈值)参数来管理。
  2. 基于用户的许可(User-based Licensing): 通过 LICENSE_MAX_USERS(允许创建的最大用户数)参数来管理。

这两种方式是互斥的。数据库管理员(DBA)必须选择其中一种许可监控模式。ORA-00035错误强制实施了这种互斥性。

典型场景:

  1. 错误的管理操作: DBA试图使用 ALTER SYSTEM 命令设置或修改 LICENSE_MAX_USERS 参数,但当前系统已经启用了基于会话的许可监控(即 LICENSE_MAX_SESSIONSLICENSE_SESSIONS_WARNING 不为0)。
  2. 脚本或自动化工具执行: 某个自动化配置脚本或工具试图统一设置所有许可参数,而没有遵循正确的参数设置顺序和依赖关系。
  3. 从会话许可切换到用户许可: DBA希望将许可监控方式从“基于会话”改为“基于用户”,但没有先禁用会话许可设置(即将会话相关参数置零),就直接尝试设置用户许可参数。

⚙️ 相关原理

Oracle数据库使用初始化参数来执行许可证合规性的监控和警告(请注意,这些参数主要用于监控,并不直接强制执行许可限制,但其设置应反映您所购买的许可协议)。

其核心原理是逻辑分离:

  • LICENSE_MAX_SESSIONSLICENSE_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)中的限制有关,而不是全局的许可证限制。

🕵️ 定位原因与诊断分析

分析过程:

  1. 确认错误操作: 首先,确认错误是在执行 ALTER SYSTEM SET LICENSE_MAX_USERS=... 命令时发生的。
  2. 检查当前许可设置: 查询数据库当前的许可参数设置,这是诊断的关键步骤。
    -- 查询当前所有与许可证相关的参数设置
    SELECT name, value
    FROM v$parameter
    WHERE name LIKE 'license%';
    
    -- 或者使用更精确的查询
    SELECT *
    FROM v$license;
    
  3. 分析查询结果: 查看 LICENSE_MAX_SESSIONSLICENSE_SESSIONS_WARNING 的当前值。如果其中任何一个的值不为0,那么这就是导致ORA-00035错误的原因。

🛠️ 解决方案与相关SQL

解决方案:
要解决ORA-00035错误,您必须遵循正确的操作顺序:先禁用基于会话的许可监控,然后再设置基于用户的许可监控。

步骤与相关SQL:

  1. 检查当前设置(确认问题):

    COL name FOR a25
    COL value FOR a10
    SELECT name, value FROM v$parameter WHERE name LIKE 'license%';
    
  2. 禁用基于会话的许可(必要条件):
    将与会话许可相关的参数设置为0。这可能需要您修改 SPFILE(服务器参数文件)并重启数据库,因为某些许可参数是静态的。

    -- 如果参数是动态的,可以立即生效,但通常这些是静态参数
    ALTER SYSTEM SET LICENSE_MAX_SESSIONS = 0 SCOPE=SPFILE;
    ALTER SYSTEM SET LICENSE_SESSIONS_WARNING = 0 SCOPE=SPFILE;
    

    重要: 由于这些参数通常是静态的,修改 SPFILE 后必须重启数据库实例才能生效。

    SHUTDOWN IMMEDIATE;
    STARTUP;
    
  3. 设置基于用户的许可(原始目标):
    数据库重启后,现在您可以安全地设置 LICENSE_MAX_USERS 参数了。

    ALTER SYSTEM SET LICENSE_MAX_USERS = <desired_value> SCOPE=SPFILE;
    

    注意:LICENSE_MAX_USERS 通常也是静态参数,需要再次重启才能完全生效。如果您希望立即测试,可以在设置SPFILE后再次重启。

  4. 验证最终配置:
    再次查询许可参数,确认配置已按预期更改。

    SELECT name, value FROM v$parameter WHERE name LIKE 'license%';
    

逆向操作:
如果您想从“基于用户”的许可切换回“基于会话”的许可,同样需要遵循互斥原则:必须先將 LICENSE_MAX_USERS 设置为0,然后才能设置 LICENSE_MAX_SESSIONS


🧼 通俗易懂的解释

打个比方:
想象Oracle数据库是一个大型游乐场,你有两种方式来限制入园人数:

  1. 方式一:统计同时在里面玩的人数(基于会话)。 你在门口放了一个计数器,规定场内最多只能有1000人(LICENSE_MAX_SESSIONS=1000)。
  2. 方式二:统计你发放的年卡数量(基于用户)。 你只发行了500张年卡(LICENSE_MAX_USERS=500),只允许有年卡的人入园。

ORA-00035错误就是:
你现在已经启用着“方式一”(计数器正在工作,规定场内1000人)。这时,你突然又想改成“方式二”,并宣布“我们只发行500张年卡!”。

游乐场的管理系统(Oracle数据库)会立刻阻止你,并说:“对不起经理(ORA-00035),您不能再设置年卡数量了,除非您先把那个门口的计数器给关掉(把它设置为0)!

因为同时用两种方式计数会造成混乱。数据库要求你只能选择一种人数统计方式。

所以,解决办法很简单:

  1. 第一步:先下命令关掉门口的计数器(把 LICENSE_MAX_SESSIONSLICENSE_SESSIONS_WARNING 都设为0)。
  2. 第二步:重启游乐场让第一步设置生效(重启数据库实例)。
  3. 第三步:现在,你可以放心地设置年卡数量(修改 LICENSE_MAX_USERS)了。

希望这个解释能让你彻底明白这个错误的原因和解决方法!

欢迎关注我的公众号《IT小Chen》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值