【问题标题】:Detecting, when an Oracle server stops being "PRIMARY"检测,当 Oracle 服务器停止“主要”时
【发布时间】:2021-05-11 21:54:28
【问题描述】:

当 Oracle 数据库开始执行相同操作时,我们的应用程序需要(尝试)关闭并开始故障转移到备份位置。

检查Oracle服务器状态的查询是:

select DATABASE_ROLE from v$database

当返回 PRIMARY 以外的任何内容时,我们要开始打包。

虽然检查很简单,但我想在不进行轮询的情况下实现它——也就是说,不重复执行上述查询。 Oracle 自己的示例显示,how to run a stored procedure 在表更改时,但我认为这对我没有帮助。也不是很明显,该机制将适用于像v$database 这样的特殊表(视图?)。

Oracle 客户端程序如何知道它所连接的服务器不再是主服务器——无需轮询它?

我也很好奇,如何学习,当你的服务器成为主服务器时——但我想,机制会是一样的......

@SayanMalakshinov 下面解释说,当角色发生变化时,会自动生成一个“系统事件”——太好了。但是客户端程序(而不是服务器端存储过程)如何得知它的发生呢?

【问题讨论】:

    标签: oracle failover


    【解决方案1】:

    我不确定你到底想自动做什么,但你可以阅读角色转换触发器,即系统级触发器AFTER DB_ROLE_CHANGE

    https://docs.oracle.com/database/121/SBYDB/role_management.htm#SBYDB4772

    9.1.5 角色转换触发器 每当发生角色转换时,都会发出 DB_ROLE_CHANGE 系统事件。如果发生角色转换时数据库处于打开状态,则会立即发出此系统事件信号,如果发生角色转换时数据库处于关闭状态,则会在下次打开数据库时发出信号。

    DB_ROLE_CHANGE 系统事件可用于触发触发器,该触发器在角色转换发生时执行一组操作。

    【讨论】:

    • 太棒了!.. 你知道用于学习触发此类事件的 C API 吗?
    • @MikhailT。我没明白你的问题。你到底想达到什么目标?
    • 我希望客户端程序一旦发生就可以了解此事件——无需重复轮询。 Oracle 客户端是否可以告诉服务器:“请通知我,当DB_ROLE_CHANGE 发生时?”
    • 有很多不同的选项:您可以从触发器发送电子邮件,或执行外部脚本(也有几种不同的方式:使用 dbms_scheduler,或外部过程,或内部 java 过程等。 .),或者使用 UTL_HTTP 发送 HTTP 请求,或者事件使用 UTL_TCP 发送 TCP 消息等...
    • UTL_TCP?哇,我什至不知道it。谢谢。你能在你的答案中描述这些,所以我可以接受吗?但是,这些选项是否需要管理员权限?
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2016-08-17
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多