OceanBase提供以下设施以帮助发现和定位问题。

    统计信息,锁等待,等待事件

    v$sysstat, gv$sysstat, v$sesstat, gv$sesstat 等内部表,按server和集群,以级session维度记录系统的统计信息。通过定期记录并计算差值,可获得系统, server, 租户, session 级别的如QPS、TPS、 IOPS、cache命令率等统计信息。

    v$latch, gv$latch 展示内部锁的加锁次数,自旋次数,等待时间等,可帮助定位系统热点。

    v$lock_wait_stat, gv$lock_wait_stat 展示数据上行锁等待情况,可帮助定位系统内的锁冲突情况和热点行。

    v$session_wait, gv$session_wait, v$session_wait_history, gv$session_wait_history 按session展示等待(如Disk IO, RPC等 )发生次数和等待时间。可帮助定位SQL耗时原因及系统瓶颈。

    以上视图直接展示了内部信息,没有记录历史并不方便查看。OceanBase Cloud Platform (OCP) 记录并直观的展示以上信息,建议通过OCP查看。

    系统日志

    系统日志是OceanBase运行过程中打的程序日志(与系统恢复无关)。系统日志放在 /home/admin/oceanbase/log 目录,包含以下部分:

    系统日志按日志量和重要/紧急程度分为以下几个级别:

    • DEBUG: 程序调试日志,只允许OceanBase支持人员使用

    • TRACE: 用户请求级别的日志量,过多的打印日志会影响性能,不建议开启

    • INFO: 系统事件,如启动,切主等

    • WARN: 记录可能有错误发生的日志,表示系统可能有错误发生

    • ERROR: 记录错误的日志默认只打印INFO以下日志,可通过syslog_level配置项控制。以.wf结尾的日志只记录 WARN, ERROR 级别的日志,可通过 enable_syslog_wf 配置项控制不打此日志。

    日志写满256MB时会做日志文件切换,原日志文件名加上 .%Y%m%d%H%M%S 格式的时间,如 observer.log.20161230235020。OceanBase默认不会自动清理系统日志,需DBA定期归档。另外OceanBase可按日志个数回收系统日志,通过配置项enable_syslog_recycle和max_syslog_file_count控制。

    系统日志示例:

    1. [2017-12-13 18:10:23.608801] INFO [COMMON] ob_simple_thread_pool.cpp:119 [55493][Y0-0000000000000000] [lt=15] create thread succ(index=0, ret=0)

    格式如下:

    1. [日期 时间] 日志级别 [日志模块] 代码文件名:行号 [线程ID][TRACE_ID][打日志时间] 信息以及一些内部值

    其中,TRACE_ID全局唯一,每次 SQL 执行都会生成,可用它将一次 SQL 执行时的多台机器上的日志关联到一起。

    当 SQL 执行时间超过配置项 trace_log_slow_query_watermark 后,会在系统日志中记录 slow query 日志(可通过[slow query]关键字过滤)。slow query 日志记录 SQL 执行每个阶段的执行时长,可帮助定位执行耗时模块。

    事件历史

    OceanBase 按事件重要程度将部分事件记录到内部表或内存中,以回溯某个历史时刻系统状态。

    • 集群级事件

    表: __all_rootservice_event_history记录集群级事件,如major freeze, 合并,server 上下线,负载均衡任务执行等,保留最近7天历史。

    如发现一台server宕机,要确认OceanBase探测到此server宕机时间点,可执以下SQL:

    1. select * from __all_rootservice_event_history where module = 'server';
    • server级事件

    表: __all_server_event_history

    记录server级事件,如转储,合并完成,切主,执行用户命令等,保留最近3天历史。

    • SQL Audit

    表: v$sql_audit, gv$sql_audit

    在内存中记录每条SQL以及部分统计信息,通过上面两个视图展示,可通过enable_sql_audit配置项打开/关闭。每台机器使用3GB内存(通过sql_audit_memory_limit配置项控制)环形队列记录最近的 SQL。

    当 enable_sql_audit 配置为 false,关闭 SQL Audit 时,只是停止向 SQL Audit 中增加记录(老的记录也就不会淘汰),v$sql_audit, gv$sql_audit 仍然可查。

    系统视图

    以下视图也能帮助诊断:

    • v$memory, gv$memory按租户查看每个模块内存使用量,可帮助确定block cache是否足够或内存泄漏问题。系统日志也会每隔10秒记录一次内存模块统计,可按[MEMORY]关键字过滤查看。

    • v$plan_cache_plan_stat, gv$plan_cache_plan_stat, v$plan_cache_plan_explain, gv$plan_cache_plan_explain展示plan cache里sql plan的执行计划以及plan cache中SQL的平执行次数和时间。可帮助定位系统中慢SQL并确认其执行计划是否符合预期。

    • __all_virtual_clog_stat展示每个副本的日志同步角色,状态,成员等。可查看是否有日志未同步,是否有partition无主等,如:是否有日志未同步:

      1. select * from __all_virtual_clog_stat where is_in_sync = 0 and is_offline = 0;

      是否有partition无主:

      1. select table_id, partition_idx, group_concat(role) roles from __all_virtual_clog_stat where is_offline = 0 group by 1,2 having roles not like '%LEADER%';