GBase 8s
其他
文章

GBase 8s SQLIDEBUG跟踪ODBC调用过程

GBase社区管理员
发表于2024-01-02 15:04:35117次浏览0个评论

我们在通过应用程序访问GBase 8s数据库,或者调试应用程序过程中,往往需要对应用程序访问数据库的过程进行跟踪,以便排查故障,调优程序。SQLIDEBUG就是GBase 8s自带的trace工具,能够将应用程序调用数据库的详细过程记录下来。

1、跟踪unix/linux客户端odbc程序调用

打开trace开关

通过在客户端设置SQLIDEBUG环境变量打开trace开关。例如,在环境变量文件(ksh为.profile,bsh为.bash_profile)中设置:export SQLIDEBUG=2:/tmp/8s/sqlidebug.txt环境变量生效后,运行odbc程序过程中,在/tmp/8s目录中自动产生sqlidebug.txt_xxx格式的文件。例如,sqlidebug.txt _10679_0_22cb1e0。应用程序通过ODBC与数据库的交互信息均被记录在/tmp/8s/ sqlidebug.txt _10679_0_22cb1e0文件中。

解析trace 文件

SQLIDEBUG trace产生的文件为二进制文件,需要通过sqliprint命令进行解析。解析语法如下:

sqliprint -o /tmp/8s/trace.txt/tmp/8s/sqlidebug.txt_10679_0_22cb1e0 

trace.txt文件即为解析后的跟踪信息。

gbasedbt@linux-tnrw:/tmp/8s> more trace.txt 

SQLIDBG Version 1

S->C (4)Time: 2017-04-13 10:20:10.82588

SQ_INTERNALVER

Internal Version Number: 316

 

C->S (14)Time: 2017-04-13 10:20:10.82589

SQ_PROTOCOLS

Cprotocol stream len = 8

byte[0] = ff

byte[1] = fe

byte[2] = 9f

byte[3] = fe

byte[4] = 74

byte[5] = aa

byte[6] = 72

byte[7] = 93

SQ_EOT

 

S->C (16)Time: 2017-04-13 10:20:10.82596

SQ_PROTOCOLS

Sprotocol stream len = 9

byte[0] = bd

byte[1] = be

byte[2] = 9f

byte[3] = fe

byte[4] = 7f

byte[5] = b7

byte[6] = ff

byte[7] = ef

byte[8] = e0

SQ_EOT

 

C->S (188)Time: 2017-04-13 10:20:10.82606

SQ_INFO

INFO_ENV

Name Length = 12

Value Length = 98

"DBTEMP"="/tmp"

"SHELL"="/bin/bash"

"SUBQCACHESZ"="10"

"PATH"="/home/gbasedbt/gbase8s/bin:/home/gbasedbt/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"

"NODEFDAC"="no"

INFO_DONE

SQ_EOT

 

S->C (2)Time: 2017-04-13 10:20:10.82614

SQ_EOT

 

C->S (32)Time: 2017-04-13 10:20:10.82614

SQ_CONNECT

"stores_demo" [11]

"stores_demo" [11]

 

C->S (66)Time: 2017-04-13 10:20:10.82618

SQ_COMMAND

# values: 0

CMD.....: "select fname , lname from customer where lname < "C"" [52]

SQ_NDESCRIBE

SQ_WANTDONE

SQ_EOT

 

S->C (86)Time: 2017-04-13 10:20:10.82655

SQ_DESCRIBE

Stmt Type...........: 2

Server Stmt Id......: 0

Estimated Cost......: 0

Size of output tuple: 30

# output fields.....: 2

Size of string table: 12

0) Field 'fname'

Index into string table: 0

Starting offset in tuple: 0

Type....................: CHAR; NULLABLE

Length : 15 (0xf)

 

1) Field 'lname'

Index into string table: 6

Starting offset in tuple: 15

Type....................: CHAR; NULLABLE

Length : 15 (0xf)

SQ_DONE

Warning..: 0x10

# rows...: 0

rowid....: 0

serial id: 0

SQ_COST

estimated #rows: 9

estimated I/O..: 3

SQ_EOT

 

其中:C->S代表客户端向服务器发送请求,S->C代表服务器响应客户端请求。且每个通信环节都有时间戳,通信内容。

关闭trace开关

去掉SQLIDEBUG环境变量即可。

 

2、跟踪windows客户端odbc程序调用

打开trace开关

windows中打开SQLIDEBUG同unix/linux原理相同。以win7为例,步骤如下:

我的电脑à属性→高级系统设置→环境变量→在系统变量中新建,变量名为SQLIDEBUG,变量值为“2:文件路径”

注意:windows下,路径名称盘符后面需要双斜杠。

设置好环境变量后,运行odbc程序访问数据库,自动在E盘下产生sqlidebug.txt_xxx格式的文件。例如,sqlidebug.txt_3864_1196_b85b58

解析跟踪文件

cmd中执行:>sqliprt E:\\ sqlidebug.txt_3864_1196_b85b58 >>E:\\trace.txt

则可将跟踪信息解析到E盘trace.txt文件。

 

3、跟踪 JDBC程序调用

通过在URI中增加SQLIDEBUG参数实现。  URI格式参考:"jdbc:gbasedbt-sqli://172.16.3.15:9088/testdb:user=gbasedbt;password=gbasedbt;gbasedbtserver=gbaseserver;SQLIDEBUG=C:\\JDBCTrace.txt";

java程序运行过程中自动产生C:\\JDBCTrace.txtXXX文件,例如,JDBCTrace.txt1492053131600.0通过sqliprt来解析:

sqliprt C:\\JDBCTrace.txt1492053131600.0 >>C:\\trace.txt

 

常见问题1:

在linux下执行sqliprint时可能会出现如下报错,导致解析内容中不包含时间戳:

Warning: the timestamp format you have chosen is wrong.

No timestamp will be generated in the output file.

Please choose the correct type for the [-platform type] argument.

解决办法:根据产生debug文件平台的不同,配置不同的- platform参数。例如,在x86 linux平台加上” -platform IEEEM”即可解决:

sqliprint -platform IEEEM sqlidebug.txt1500345140359.0 > sqlidebug.txt
评论已关闭