暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库挂起了怎么办?

oracleace 2024-02-23
711

当Oracle数据库挂起或变得无响应时,你该怎么办?传统上,唯一的选择是重新启动数据库。但是从12c开始,Oracle引入了一个新特性,即实时自动数据库诊断监视器(Real-Time ADDM),它可以在传统连接失败时以latch-less方式连接到数据库,并进行诊断。


关于号主,姚远:

  • Oracle ACE(Oracle和MySQL数据库方向)

  • 华为云最有价值专家

  • 《MySQL 8.0运维与优化》的作者

  • 拥有 Oracle 10g、12c和19c OCM等数十项数据库认证

  • 曾任IBM公司数据库部门经理

  • 20+年DBA经验,服务2万+客户

  • 精通C和Java,发明两项计算机专利


01

概述


管理性能监视器进程(MMON)每3秒运行一次,检查内存中存在的性能问题。一旦检测到任何潜在的性能问题,MMON会启动Real-Time ADDM分析,生成报告,并将其存储在dba_hist_reports和dba_hist_reports_details视图中,视图保存在AWR表空间。
有9种性能问题可以触发Real-Time ADDM分析,官方文档列表在这里(https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/automatic-performance-diagnostics.html#GUID-9DD81F99-3B4D-4340-9F19-30E5B47DC41D)。

02


模拟性能问题


以下脚本通过模拟登录风暴来伪造性能问题:

    #!/bin/bash


    # Oracle database connection details
    DB_HOST="192.168.???.???"
    DB_PORT="1521"
    DB_SID="?????.example.com"
    DB_USER="scott"
    DB_PASSWORD="scott"


    # Number of concurrent processes
    NUM_PROCESSES=1000


    # Function to perform login
    perform_login() {
    sqlplus -S ${DB_USER}/${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_SID} <<EOF
    exec DBMS_LOCK.sleep(20);
    EXIT;
    EOF


    # Run concurrent login processes
    for ((i=1; i<=$NUM_PROCESSES; i++)); do
    perform_login &
    done


    wait


    echo "Concurrent logins completed."

    03

    使用图形界面生成Real-Time ADDM 报告


    Real-Time ADDM 可以使用 Enterprise Manager Could Control 以两种不同的方式连接到数据库:
    • 普通连接:它对数据库执行标准 JDBC 连接。

    • 诊断连接:当无法进行正常的 JDBC 连接时,它对数据库执行latch-less的连接,此模式用于极端挂起情况。


    04


    使用命令行生成Real-Time ADDM 报告

    如果没有配置 Enterprise Manager Could Control,则在数据库挂起时将无法连接到数据库。但是,您仍然可以使用命令行生成Real-Time ADDM 报告。
    DBA_HIST_REPORTS
    视图捕获 SQL Monitor、DBOP 和Real-Time ADDM 的 XML 报告。您可以检查该视图,看看是否生成了任何Real-Time ADDM 报告。
      select distinct component_name from dba_hist_reports;


      COMPONENT_NAME
      --------------------------------------------------------------------------------
      sqlmonitor
      perf
      这里您可以看到 DBA_HIST_REPORTS 视图中有两个组件,sqlmonitor 和 perf。
      另一个脚本“rtaddmrpti.sql”允许您手动选择数据库和报告周期。加粗的项目需要用户输入:
      以下 SQL 查询 DBA_HIST_REPORTS
       视图以获取Real-Time ADDM 报告:
        SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';


        SQL> select REPORT_ID,PERIOD_START_TIME,PERIOD_END_TIME,GENERATION_TIME,report_summary from dba_hist_reports where component_name = 'perf';
        REPORT_ID PERIOD_START_TIME PERIOD_END_TIME GENERATION_TIME REPORT_SUMMARY
               7865 2024-02-21 10:44:45   2024-02-21 10:44:45   2024-02-21 10:44:45   <report_repository_summary><trigger id="0" impact="1709.85" id_desc="High Load" impact_desc="1709.85 active sessions"></trigger></report_repository_summary>
        在这里,您可以看到性能问题的类型是“High Load”,当平均活动会话数大于 CPU 核数的 3 倍时触发。
        Oracle 提供了一个 SQL 脚本(?/rdbms/admin/rtaddmrpt.sql)来生成最近 60 分钟的实时 ADDM 报告。如果在最近一小时内没有性能问题,则会抛出以下错误:
          Report ids in this workload repository.
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


          declare
          *
          ERROR at line 1:
          ORA-20000: No valid reports found in the specified time range. Please specify a
          different begin and end time
          ORA-06512: at line 11

          另一个脚本“rtaddmrpti.sql”允许您手动选择数据库和报告周期。加粗的项目需要用户输入:

            SQL>  @?/rdbms/admin/rtaddmrpti.sql


            Instances in this Report reposistory
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


            Db Id Inst Num
            ---------- --------
            3148008031 1


            Default to current database
            **Enter value for dbid:**


            Using database id: 3148008031


            Enter begin time for report:


            -- Valid input formats:
            -- To specify absolute begin time:
            -- [MM/DD[/YY]] HH24:MI[:SS]
            -- Examples: 02/23/03 14:30:15
            -- 02/23 14:30:15
            -- 14:30:15
            -- 14:30
            -- To specify relative begin time: (start with '-' sign)
            -- -[HH24:]MI
            -- Examples: -1:15 (SYSDATE - 1 Hr 15 Mins)
            -- -25 (SYSDATE - 25 Mins)


            Default to -60 mins
            **Enter value for begin_time: -600**
            Report begin time specified: -600


            Enter duration in minutes starting from begin time:
            Defaults to SYSDATE - begin_time
            Press Enter to analyze till current time
            **Enter value for duration:**
            Report duration specified:


            Using 21/02/2024 04:24:05 as report begin time
            Using 21/02/2024 14:24:14 as report end time


            Report ids in this workload repository.
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


            DBID REPORT_ID TIME trigger_cause impact
            ---------- --------- -------------------- ------------------------- ----------
            3148008031 7865 21/02/2024 10:44:45 High Load 1709.85
            3148008031 7870 21/02/2024 11:31:13 High Load 1556.17


            Select a report id from the list. If the report id list is empty,
            please select a different begin time and end time.
            **Enter value for report_id: 7865**
            Report id specified : 7865
            Specify the Report Name
            ~~~~~~~~~~~~~~~~~~~~~~~~
            The default report file name is rtaddmrpt_0221_1424.html. To use this name,
            press <return> to continue, otherwise enter an alternative.
            Enter value for report_name:


            Using the report name rtaddmrpt_0221_1424.html


            ... Removed HTML Output ...


            Report written to rtaddmrpt_0221_1830.html



            欢迎关注我的公众号,一起学习数据库技术👇


            推荐文章👇

            从国内外IT人的差异谈如何破除35岁魔咒

            试看号主的拙作《MySQL 8.0运维与优化》(清华大学出版社)

            托业890分的Oracle ACE为您翻译国际大佬的雄文(合集)

            晒一下号主的19个Oracle认证(OCP+OCM),欢迎PK


            文章转载自oracleace,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论