日志参考
OceanBase 数据库在运行过程中会自动生成日志。维护工程师通过查看和分析日志,可以了解 OceanBase 数据库的启动和运行状态。
日志概述
主要介绍日志清单、日志级别、查看日志的方法等。
日志清单
列出了 OceanBase 数据库运行日志和操作日志的清单。OceanBase 数据库日志清单如下表所示。
| 日志名称 | 日志路径 | 说明 |
|---|---|---|
| observer.log | OBServer 服务器的 "~/ appname /log"目 录下。 | 记录 OBServer 启动过程以及启动后的运行情况。 |
| Clog | OBServer服务器的 "~/ datadir /clog"目 录下。 | Commit Log,所有 Partition 共用,日志可能是乱序的,记录事务、PartitionService 提供的原始日志内容。此目录下的日志基于 Paxos 协议在多个副本之间同步。 |
| Ilog | OBServer服务器的 "~/ datadir /ilog"目 录下。 | Index Log,所有 Partition 共用,单 Partition 内部日志有序,记录 Partition 内部log_id>clog(file_id, offset) 的索引信息。每个副本自行记录。 |
| Slog | OBServer服务器的 "~/ datadir /slog"目 录下。 | 记录 Storage Log,指 SSTable 操作日志信息。 |
关于 Commit Log:
事务的日志包括:Redo Log、Prepare Log、Commit Log、Abort Log、Clear Log 等。其中,Redo Log 记录了事务的具体操作,比如某一行数据的某个字段从
A修改为B。Prepare Log 记录了事务的 Prepare 状态;Commit Log 表示这个事务成功 Commit,并记录 Commit 的信息,例如,事务的全局版本号;Clear Log 用于通知事务清理事务上下文 ;Abort Log 表示这个事务被回滚。
日志清单中的 Clog 是指广义的 Commit Log,代表整个事务的所有日志信息。
日志级别
介绍 OceanBase 日志的级别及每类级别的含义。当启动或运行异常时,可维护工程师可以通过日志级别和内容分析和定位异常原因。OceanBase 数据库的运行日志中的级别及含义如下表所示。日志级别从高到底排列。
| 日志级别 | 含义 |
|---|---|
| ERROR | 严重错误,用于记录系统的故障信息,且必须进行故障排除,否则系统不可用。 |
| WARN | 警告,用于记录可能会出现的潜在错误。 |
| INFO | 提示,用于记录系统运行的当前状态,该信息为正常信息。 |
| TRACE | 与DEBUG相比更细致化的记录事件消息。 |
| DEBUG | 调试信息,用于调试时更详细的了解系统运行状态,包括当前调用的函数名、参数、变量、函数调用返回值等。 |
启动和运行日志
日志文件种类
observer.log:OceanBase 数据库所有的启动过程和启动后的运行过程中的日志。election.log:选举模块记录的日志。rootservice.log:RootService 模块记录的日志wf日志:只记录日志级别在 WARN 级别以上(包括 WARN 级别)的日志信息,打开该类日志文件,可以看到只有 WARN 和 ERROR 级别的日志。
查看日志
介绍了查看 OceanBase 数据库日志的方法。
假设 OBServer 服务所在的IP为"10.10.10.2",查看日志的步骤如下:
登录 OceanBase 数据库服务器(以10.10.10.2为例)。
执行以下命令,进入日志文件所在的目录。
cd ~/oceanbase/log执行以下命令,查看已写入的日志记录。
more observer.log或者执行以下命令,查看正在写入的日志记录。
tail observer.log
日志格式
日志记录主要由六部分组织:记录时间、日志级别、[模块名]、文件名:行号、线程ID和日志内容。关于模块名,是按OceanBase的功能模块划分,可以分为 CLIENT、CLOG、COMMON、ELECT、LIB、PROXY、RPC、RS、SERVER、SHARE、SQL、STORAGE、TLOG等。每个模块下又有子模块,它以点隔开的形式写在模块后面。例如:SQL.PARSER中 SQL 表示 SQL 模块,SQL.PARSER 表示 SQL 模块下的 PARSER 子模块。
日志样例
[2015-08-06 15:34:30.006962] INFO [SQL.RESV] ob_basic_session_info.cpp:220 [84753][Y0-0] use database success.(database_name=oceanbase)
日志种类详解
election日志
日志打印级别默认为 INFO 级别,即只有 INFO 及以上级别的日志数据才会打印到日志文件中,可通过 system parameter syslog_level 来查看当前设置的日志级别。
日志文件的大小不超过 256MB,如果当前
election.log或者election.log.wf文件大小超过 256M,那么会被进行切片,切片规则为将当前文件带上后缀yyyyMMddHHmmss重命名,后缀时间为当前时间,同时新生成一个election.log或者election.log.wf,切片生成的文件名如下:[admin@OceanBase /home/admin/oceanbase/log] $ls -alh | egrep '[0-9]{14}' | grep election | grep -v wf -rw-r--r-- 1 admin admin 256M Jul 7 05:34 election.log.20160707053424 -rw-r--r-- 1 admin admin 256M Jul 7 05:38 election.log.20160707053821 [admin@OceanBase /home/admin/oceanbase/log] $ls -alh | egrep '[0-9]{14}' | grep election | grep wf -rw-r--r-- 1 admin admin 256M Jul 7 02:09 election.log.wf.20160707020914
日志数据格式:
election.log和election.log.wf拥有相同的日志数据格式,均为:[ time] log_level [module_name] function_name (file_name:file_no) [thread_id][Ytrace_id0-trace_id1] [log=last_log_print_time]log_data[admin@OceanBase244000095.sqa.ztt /home/admin/oceanbase/log] $tail -f election.log [2016-07-17 01:02:28.610938] INFO [ELECT] statistics (ob_election_rpc.cpp:81) [23006][YB420AF40EB8-1602012] [log=27]election rpc statistics(total_process=16, avg_fly_us=-23, avg_wait_us=36, avg_handle_us=18) [2016-07-17 01:02:34.211369] INFO [ELECT] statistics (ob_election_rpc.cpp:81) [23006][YB420AF40EB8-16020B3] [log=29]election rpc statistics(total_process=16, avg_fly_us=-28, avg_wait_us=35, avg_handle_us=16) [2016-07-17 01:02:39.811105] INFO [ELECT] statistics (ob_election_rpc.cpp:81) [23004][YB420AF40EB8-1602136] [log=35]election rpc statistics(total_process=16, avg_fly_us=-30, avg_wait_us=35, avg_handle_us=15)
日志数据格式说明如下表所示。
| 参数 | 说明 |
|---|---|
| time | 该条日志打印的时间 |
| log_level | 该条日志的级别 |
| module_name | 打印该条日志的语句所在模块 |
| function_name | 打印该条日志的语句所在的函数 |
| file_name | 打印该条日志的语句所在的文件 |
| file_no | 打印该条日志的语句所在文件的具体行数 |
| thread_id | 打印该条日志的线程的线程号。 |
| trace_id0-trace_id1 | 该条日志的 traceid,由 traceid0 和 traceid1 组成,该 traceid 可通过 RPC 在各个 OBServer 间传递,从而可以根据 traceid 号来获取相互之间有关联关系的日志数据 |
| last_log_print_time | 写上一条日志所用的数据,单位为 us,即在程序中调用一次日志打印所用的时间,当前的时间记录的是上一条日志打印所用的时间,通过该时间可以精确知道日志打印耗费时间,从日志数据中可以看到该值大部分时候是 0,有时会是 10us 级别的。由于日志打印时是多个线程同时向同一个 Buffer 来打印,所以会有临界区代码保护,从而是会出现 10us 日志打印时间的 |
| log_data | 具体的日志数据 |
observer 和 rootservice 日志
日志级别:同 election 日志
日志文件大小及切片规则:同 election 日志
日志数据格式:
observer.log和rootservice.log日志数据格式相同,格式如下:[ time ] log_level [module_name] file_name:fine_no [thread_id][Ytrace_id0-trace_id1] [lt=last_log_print_time]log_dataobserver.log.wf和rootservice.log.wf日志数据格式相同,后两个相对于前两者的区别是打印了函数名称,格式如下:[ time ] log_level [module_name] function_name (file_name:fine_no) [thread_id][Ytrace_id0-trace_id1] [lt=last_log_print_time]log_data[
日志数据格式说明:同 election 日志
控制切片文件数量:
通过设置系统参数
max_syslog_file_count的值来控制日志文件数量保留的数量,当为0时表示 observer 进程自己不对日志文件数量进行控制,当为一个非 0 正数时,observer进程会将每一类日志文件数量都控制不超过该数量,即如果设置max_syslog_file_count为100, 则observer.log、observer.log.wf、rootservice.log、rootservice.log.wf的日志文件数量各自都不会超过100 个。这里需要特别注意的一点是,只有在设置了max_syslog_file_count为非 0,observer 进程才会开始统计切片生成的日志文件列表,只有当改日志文件列表中的文件数量超过设定值后,observer 进程才会进行老的日志切片文件的删除。通过启动 observer 进程时,在
-o参数中指定max_syslog_file_count的值。
事务日志
Clog 和 Ilog 记录所有的事务日志信息。不用于用户查看和定位系统问题。通过内部定制的工具 log_tool 来解析日志信息。
存储日志
Slog 记录所有的存储(SSTable)日志信息。不用于用户查看和定位系统问题。通过内部定制的工具 log_parser 来解析日志信息。




