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 目录,包含以下部分:
election.log election.log.wf: 选举模块日志
rootservice.log rootservice.log.wf: rootservice模块日志
observer.log observer.log.wf: 除以上两个模块外其它所有日志
系统日志按日志量和重要/紧急程度分为以下几个级别:
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控制。
系统日志示例:
[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)
格式如下:
[日期 时间] 日志级别 [日志模块] 代码文件名:行号 [线程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:
select * from __all_rootservice_event_history where module = 'server';
- server级事件
记录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无主等,如:是否有日志未同步:
select * from __all_virtual_clog_stat where is_in_sync = 0 and is_offline = 0;
是否有partition无主:
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%';