通过SQL解析TraceID找到对应主机信息

前言

◦日常运维过程中,我们在做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
3 个赞

赞一个:+1:

学习了, 感谢分享

点赞,太厉害了