试用 ob_admin 工具解析 clog
这两天看到社区问答区有用户问到了一个 ob_admin 这个工具使用上的问题。之前从来没用过这个工具,这次就试着用一下这个 ob_admin,看看主要有哪些功能,顺便在这里做一个简单的记录。
安装
先是按照官网资料安装一下 ob_admin,我这里直接通过源码编译安装。
其中的 make 这步超级慢,条件允许的话,直接改成 make -j 32 ob_admin 去并行编译吧。
最后 cp 这步,官网上写的路径好像有些小问题,不过大家肯定都能自己调整对。
[xiaofeng.lby@obvos-dev-d3 /home/xiaofeng.lby/work/obn/code_master]
bash build.sh debug --init
cd build_debug
make ob_admin
sudo cp tools/ob_admin/ob_admin /usr/local/bin
使用 log_tool 进行 clog 解析
先执行一条 dml:insert into t1 values(1, 2);
然后通过 oceanbase.__all_virtual_sql_audit 可以查到对应 dml 的 transaction_id。
select query_sql, transaction_id from oceanbase.__all_virtual_sql_audit where query_sql like 'insert%' order by request_time desc;
+-----------------------------+----------------+
| query_sql | transaction_id |
+-----------------------------+----------------+
| insert into t1 values(1, 2) | 11434882 |
+-----------------------------+----------------+
1 row in set (0.028 sec)
找到对应的 clog 文件,对应租户(tenant_1002)下最新的这个文件应该就是了,一会儿需要用到这个路径。这里顺带学习了一下 clog 目录探究这篇社区博客。
[xiaofeng.lby@obvos-dev-d3 /data/xiaofeng.lby/obn.xiaofeng.lby.11.158.31.20.obs0.obn/clog/tenant_1002/1001/log]
$ls -ltr
-rw-r--r-- 1 xiaofeng.lby users 67108864 Sep 13 16:17 81
最后参照 ob_admin log_tool 的官网文档来使用即可,输入 ob_admin log_tool 之后,会给出用法有哪些。
[xiaofeng.lby@obvos-dev-d3 /home/xiaofeng.lby/work/obn/code_master/build_debug]
$ob_admin log_tool
succ to open, filename=ob_admin.log, fd=3, wf_fd=2
old log_file need close, old = ob_admin.log new = ob_admin.log
succ to open, filename=ob_admin.log, fd=3, wf_fd=2
succ to open, filename=ob_admin_rs.log, fd=4, wf_fd=2
Usages:
$ob_admin log_tool dump_log log_files ## ./ob_admin log_tool dump_log log_files... ##将log文件中的内容全部打印出来
$ob_admin log_tool dump_tx_format log_files ## ./ob_admin log_tool dump_tx_format log_files ##将log文件中的事务相关内容以json格式打印
$ob_admin log_tool dump_filter 'filter_conditions' log_files ## ./ob_admin log_tool dump_filter 'tx_id=xxxx;tablet_id=xxx' '$path'## 按照过滤条件将log文件中的事务相关内容打印,目前支持按照事务id(tx_id=xxxx),tablet_id(tablet_id=xxxx)进行过滤,多个条件之间以;隔开
$ob_admin log_tool stat log_files ## ./ob_admin log_tool stat 1
$ob_admin log_tool dmp_meta log_files ## ./ob_admin log_tool dump_meta 1
一些注意事项:
1. 为避免在clog目录生成一些ob_amdin的输出文件,强烈建议使用绝对路径
2. log_files 支持绝对路径、相对路径
3. log_files 支持同时解析多个文件
4. 支持解析归档文件
5. 如何通过LSN快速定位日志:
1. 获取文件ID: BLOCK_ID=LSN/(64MB-4KB)
2. 根据LSN去输出文件中执行grep操作
可以通过上面查到的 tx_id 进行过滤,不过结果不是 json 格式,不太好看。
[xiaofeng.lby@obvos-dev-d3 /home/xiaofeng.lby/work/obn/code_master/build_debug]
$ob_admin log_tool dump_filter 'tx_id=11434882' /data/xiaofeng.lby/obn.xiaofeng.lby.11.158.31.20.obs0.obn/clog/tenant_1002/1001/log/81
succ to open, filename=ob_admin.log, fd=3, wf_fd=2
old log_file need close, old = ob_admin.log new = ob_admin.log
succ to open, filename=ob_admin.log, fd=3, wf_fd=2
succ to open, filename=ob_admin_rs.log, fd=4, wf_fd=2
{ BlockId: 81: LSN: 5489661028 TxID: 11434882 scn: 1694591575020587545 TxBlockHeader: {org_cluster_id:1, log_entry_no:0, tx_id:{txid:11434882}, scheduler:"11.158.31.20:22602"} ###<TxRedoLog>: { txctxinfo: {LOG_TYPE:1, mutator_size_:308, ctx_redo_info_.cluster_version_:17180000256} MutatorMeta: 0x7ffead794a50 data_crc=af37ea8 meta_size=28 data_size=280 row_count=4 MutatorRows: { RowHeader: {mutator_type_str_:"MUTATOR_TABLE_LOCK", mutator_type_:1, tablet_id_:{id:49403}} TableLock: {row_size:40, table_id:18446744073709551615, table_version:0, lock_id:{obj_type:2, obj_id:202273}, owner_id:{id:0}, mode:4, lock_type:1, seq_no:1694591575014936, create_timestamp:1694591575019964, create_schema_version:1694522384895568} RowHeader: {mutator_type_str_:"MUTATOR_ROW", mutator_type_:0, tablet_id_:{id:202273}} NORMAL_ROW: { RowKey: {"BIGINT UNSIGNED":10} TableVersion: 1694522384895568 NewRow Cols: { 0: {len: 8, flag: 0, null: 0, ptr: 0x7ffead793978, hex: 0A00000000000000, int: 10} 1: {len: 8, flag: 0, null: 0, ptr: 0x7ffead7939b0, hex: 0100000000000000, int: 1, num_digit0: 0} 2: {len: 8, flag: 0, null: 0, ptr: 0x7ffead7939e8, hex: 0200000000000000, int: 2} } OldRow Cols: {} DmlFlag: INSERT ModifyCount: 0 AccChecksum: 2829748958 Version: 1694590221627542 Flag: 0 SeqNo: 1694591575014936 NewRowSize: 27 OldRowSize: 0 ColumnCnt: 3 } RowHeader: {mutator_type_str_:"MUTATOR_TABLE_LOCK", mutator_type_:1, tablet_id_:{id:49403}} TableLock: {row_size:40, table_id:18446744073709551615, table_version:0, lock_id:{obj_type:2, obj_id:1152921504606849140}, owner_id:{id:0}, mode:4, lock_type:1, seq_no:1694591575014937, create_timestamp:1694591575020277, create_schema_version:1694522384895544} RowHeader: {mutator_type_str_:"MUTATOR_ROW", mutator_type_:0, tablet_id_:{id:1152921504606849140}} NORMAL_ROW: { RowKey: {"INT":1},{"BIGINT UNSIGNED":10} TableVersion: 1694522384895568 NewRow Cols: { 0: {len: 8, flag: 0, null: 0, ptr: 0x7ffead793978, hex: 0100000000000000, int: 1, num_digit0: 0} 1: {len: 8, flag: 0, null: 0, ptr: 0x7ffead7939b0, hex: 0A00000000000000, int: 10} } OldRow Cols: {} DmlFlag: INSERT ModifyCount: 0 AccChecksum: 1763018073 Version: 1694590221628685 Flag: 0 SeqNo: 1694591575014937 NewRowSize: 24 OldRowSize: 0 ColumnCnt: 2 } } } ###<TxCommitInfoLog>: { Size: 40 Members: {LOG_TYPE:64, scheduler_:"11.158.31.20:22602", participants_:[{id:1001}], upstream_:{id:-1}, is_sub2pc_:false, is_dup_tx_:false, can_elr_:true, incremental_participants_:[], cluster_version_:17180000256, app_trace_id_str_:"", app_trace_info_:"", prev_record_lsn_:{lsn:18446744073709551615}, redo_lsns_:[], xid_:{gtrid_str:"", bqual_str:"", format_id:1, gtrid_str_.ptr():"data_size:0, data:", bqual_str_.ptr():"data_size:0, data:", g_hv:0, b_hv:0}} } ###<TxCommitLog>: { Size: 30 Members: {LOG_TYPE:256, commit_version_:{val:18446744073709551615, v:3}, checksum_:2311708179, incremental_participants_:[], multi_source_data_:[], trans_type_:0, tx_data_backup_:{start_log_ts_:{val:18446744073709551615, v:3}}, prev_lsn_:{lsn:18446744073709551615}, ls_log_info_arr_:[]} } }
也可以先不过滤,让结果是 json 格式,再在结果中 grep 一下之前查到的 tx_id 对应的数字 11434882。这种比上面的那种更易读。
{
"BlockId": "81",
"LSN": 5489661028,
"TxID": 11434882,
"scn": 1694591575020587545,
"TxBlockHeader": "{org_cluster_id:1, log_entry_no:0, tx_id:{txid:11434882}, scheduler:\"11.158.31.20:22602\"}",
"###<TxRedoLog>": {
"txctxinfo": "{LOG_TYPE:1, mutator_size_:308, ctx_redo_info_.cluster_version_:17180000256}",
"MutatorMeta": "0x7fff1e2bb2d0 data_crc=af37ea8 meta_size=28 data_size=280 row_count=4",
"MutatorRows": {
"RowHeader": "{mutator_type_str_:\"MUTATOR_TABLE_LOCK\", mutator_type_:1, tablet_id_:{id:49403}}",
"TableLock": "{row_size:40, table_id:18446744073709551615, table_version:0, lock_id:{obj_type:2, obj_id:202273}, owner_id:{id:0}, mode:4, lock_type:1, seq_no:1694591575014936, create_timestamp:1694591575019964, create_schema_version:1694522384895568}",
"RowHeader": "{mutator_type_str_:\"MUTATOR_ROW\", mutator_type_:0, tablet_id_:{id:202273}}",
"NORMAL_ROW": {
"RowKey": "{\"BIGINT UNSIGNED\":10}",
"TableVersion": 1694522384895568,
"NewRow Cols": {
"0": "{len: 8, flag: 0, null: 0, ptr: 0x7fff1e2ba1f8, hex: 0A00000000000000, int: 10}",
"1": "{len: 8, flag: 0, null: 0, ptr: 0x7fff1e2ba230, hex: 0100000000000000, int: 1, num_digit0: 0}",
"2": "{len: 8, flag: 0, null: 0, ptr: 0x7fff1e2ba268, hex: 0200000000000000, int: 2}"
},
"OldRow Cols": {},
"DmlFlag": "INSERT",
"ModifyCount": 0,
"AccChecksum": 2829748958,
"Version": 1694590221627542,
"Flag": 0,
"SeqNo": 1694591575014936,
"NewRowSize": 27,
"OldRowSize": 0,
"ColumnCnt": 3
},
"RowHeader": "{mutator_type_str_:\"MUTATOR_TABLE_LOCK\", mutator_type_:1, tablet_id_:{id:49403}}",
"TableLock": "{row_size:40, table_id:18446744073709551615, table_version:0, lock_id:{obj_type:2, obj_id:1152921504606849140}, owner_id:{id:0}, mode:4, lock_type:1, seq_no:1694591575014937, create_timestamp:1694591575020277, create_schema_version:1694522384895544}",
"RowHeader": "{mutator_type_str_:\"MUTATOR_ROW\", mutator_type_:0, tablet_id_:{id:1152921504606849140}}",
"NORMAL_ROW": {
"RowKey": "{\"INT\":1},{\"BIGINT UNSIGNED\":10}",
"TableVersion": 1694522384895568,
"NewRow Cols": {
"0": "{len: 8, flag: 0, null: 0, ptr: 0x7fff1e2ba1f8, hex: 0100000000000000, int: 1, num_digit0: 0}",
"1": "{len: 8, flag: 0, null: 0, ptr: 0x7fff1e2ba230, hex: 0A00000000000000, int: 10}"
},
"OldRow Cols": {},
"DmlFlag": "INSERT",
"ModifyCount": 0,
"AccChecksum": 1763018073,
"Version": 1694590221628685,
"Flag": 0,
"SeqNo": 1694591575014937,
"NewRowSize": 24,
"OldRowSize": 0,
"ColumnCnt": 2
}
}
},
"###<TxCommitInfoLog>": {
"Size": 40,
"Members": "{LOG_TYPE:64, scheduler_:\"11.158.31.20:22602\", participants_:[{id:1001}], upstream_:{id:-1}, is_sub2pc_:false, is_dup_tx_:false, can_elr_:true, incremental_participants_:[], cluster_version_:17180000256, app_trace_id_str_:\"\", app_trace_info_:\"\", prev_record_lsn_:{lsn:18446744073709551615}, redo_lsns_:[], xid_:{gtrid_str:\"\", bqual_str:\"\", format_id:1, gtrid_str_.ptr():\"data_size:0, data:\", bqual_str_.ptr():\"data_size:0, data:\", g_hv:0, b_hv:0}}"
},
"###<TxCommitLog>": {
"Size": 30,
"Members": "{LOG_TYPE:256, commit_version_:{val:18446744073709551615, v:3}, checksum_:2311708179, incremental_participants_:[], multi_source_data_:[], trans_type_:0, tx_data_backup_:{start_log_ts_:{val:18446744073709551615, v:3}}, prev_lsn_:{lsn:18446744073709551615}, ls_log_info_arr_:[]}"
}
}
其他功能
官网上说 ob_admin 还支持一些其他功能,这些就等后面有需求的时候再去试用了~