前言
◦日常运维过程中,我们在做SQL诊断或异常诊断时,经常需要用到traceid信息,由于OB是分布式数据库,我们需要通过traceid找到其对应的服务器所在地址,方法多种,如: 通过GV$OB_SQL_AUDIT中traceid、svr_ip字段确认其所在服务器。 整理了下基于官方文档对traceid的格式描述,总结通过SQL语句及构建一个存储过程的方式对traceid做转换,快速获得trace_id对应的服务器地址信息。
TRACE_ID的信息格式
以’YB420BA65073-000605D9B87AE704-0-0’为例
- Y为默认开始字符
- 第一段以’-'符号开始即为 端口+IP信息,如’B420BA65073’部分,均为16进制数据
- 端口信息:B42
- 第1部分IP:0B
- 第2部分IP:A6
- 第3部分IP:50
- 第4部分IP:73
set @trace_id='YB420BA65073-000605D9B87AE704-0-0';
select
@trace_id,
substring_index(@trace_id,'-',1) as IP_PORT_HEX,
substr(@trace_id,5,2) as ip1,
substr(@trace_id,7,2) as ip2,
substr(@trace_id,9,2) as ip3,
substr(@trace_id,11,2) as ip4,
substr(@trace_id,2,3) as port
from dual;
-- 分段截取traceid
+-----------------------------------+--------------+-----+-----+-----+-----+------+
| @trace_id | IP_PORT_HEX | ip1 | ip2 | ip3 | ip4 | port |
+-----------------------------------+--------------+-----+-----+-----+-----+------+
| YB420BA65073-000605D9B87AE704-0-0 | YB420BA65073 | 0B | A6 | 50 | 73 | B42 |
+-----------------------------------+--------------+-----+-----+-----+-----+------+
-- 转换16进制为10进制格式输出
SELECT @TRACE_ID,
CONCAT(CONV(SUBSTR(@TRACE_ID, 5, 2), 16, 10),'.',
CONV(SUBSTR(@TRACE_ID, 7, 2), 16, 10),'.',
CONV(SUBSTR(@TRACE_ID, 9, 2), 16, 10),'.',
CONV(SUBSTR(@TRACE_ID, 11, 2), 16, 10),':',
CONV(SUBSTR(@TRACE_ID, 2, 3), 16, 10)) AS IP_PORT
FROM DUAL;
+-----------------------------------+--------------------+
| @trace_id | IP_PORT |
+-----------------------------------+--------------------+
| YB420BA65073-000605D9B87AE704-0-0 | 11.166.80.115:2882 |
+-----------------------------------+--------------------+
构建转换函数
- 直接构建一个trace_id转换函数,方便调用
DELIMITER $$
CREATE PROCEDURE process_trace_id(IN trace_id VARCHAR(255))
BEGIN
SELECT
trace_id AS trace_id,
SUBSTRING_INDEX(trace_id, '-', 1) AS IP_PORT_HEX,
SUBSTRING(trace_id, 5, 2) AS ip1,
SUBSTRING(trace_id, 7, 2) AS ip2,
SUBSTRING(trace_id, 9, 2) AS ip3,
SUBSTRING(trace_id, 11, 2) AS ip4,
SUBSTRING(trace_id, 2, 3) AS port,
CONCAT(CONV(SUBSTR(TRACE_ID, 5, 2), 16, 10),'.',
CONV(SUBSTR(TRACE_ID, 7, 2), 16, 10),'.',
CONV(SUBSTR(TRACE_ID, 9, 2), 16, 10),'.',
CONV(SUBSTR(TRACE_ID, 11, 2), 16, 10),':',
CONV(SUBSTR(TRACE_ID, 2, 3), 16, 10)) AS IP_PORT
FROM dual;
END $$
DELIMITER ;
函数调用
obclient [oceanbase]> call process_trace_id('YB420BA65073-000605D9B87AE704-0-0')\G
*************************** 1. row ***************************
trace_id: YB420BA65073-000605D9B87AE704-0-0
IP_PORT_HEX: YB420BA65073
ip1: 0B
ip2: A6
ip3: 50
ip4: 73
port: B42
IP_PORT: 11.166.80.115:2882