GBase 8s
运维管理
文章

sqltrace跟踪sql实验

NiJaT
发表于2023-10-10 17:51:37121次浏览0个评论

使用 SQLTRACE 配置参数可控制数据库服务器启动时的缺省跟踪行为。缺省情况下,不设置该参数。所设置的信息包括要跟踪的 SQL 语句数目和跟踪方式。

可以修改 onconfig 文件的任何用户均可修改 SQLTRACE 配置参数的值,并可影响启动配置。但是,只有用户 gbasedbt、root 或被授予 sysadmin 数据库连接特权的 DBSA 才可以使用 SQL 管理 API 命令来修改 SQL 跟踪的运行时状态。

要在数据库服务器启动时指定 SQL 跟踪信息,请执行以下操作:

  1. 设置 onconfig 文件中的 SQLTRACE 配置参数。

  2. 重新启动数据库服务器。

示例

onconfig 文件中的以下设置指定数据库服务器将收集有关系统上所有用户执行过的低级别信息,最多收集 2000 条,并分配大约 4 MB 内存 (2000 * 2 KB)。

SQLTRACE level=LOW,ntraces=2000,size=2,mode=global

如果仅使用部分已分配的缓冲区空间(例如,缓冲区空间的 42%),那么所分配的内存量仍然为 2 KB。

如果不想设置 SQLTRACE 配置参数并重新启动了服务器,那么可以运行以下 SQL 管理 API 命令,该命令提供的功能与为当前会话设置 SQLTRACE 的功能相同:

EXECUTE FUNCTION task("set sql tracing on", 100,"1k","med","user");  

在以用户方式启用 SQL 跟踪系统后,就可以启用对每个用户的跟踪。

 

实验

1.创建数据库用户

为以用户方式启用SQL跟踪做准备。创建用户时,创建两个新的操作系统用户,并赋予数据库的权限,再通过映射的方法创建两个数据库用户,一个属于gbasedbt组,另一个不做限制,并同时映射到daemon用户。共4个用户。

1)创建系统用户,并赋予数据库权限

#创建数据库用户

#这种方法,是在操作系统创建用户,密码健全和验证实在在操作系统验证的,验证完之后,权限的划分和校验是在数据库完成的。
useradd -g 用户组 -s /bin/bash -d /home/gbase -m gbuser           #创建用户
passwd gbuser                                                     #设置密码
dbaccess mydb -                                                   #选择数据库
grant dba to gbuser                                               #赋予dba权限

demo

创建gb01用户属于gbasedbt组,并赋予dba权限

[root@peixun-0054 ~]# useradd -g gbasedbt -s /bin/bash -d /home/gbase -m gb01
[root@peixun-0054 ~]# passwd gb01
Changing password for user gb01.
New password:****** 
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:****** 
passwd: all authentication tokens updated successfully.

[root@peixun-0054 ~]# su - gbasedbt
Last login: Tue Oct 10 15:19:32 CST 2023 on pts/4
[gbasedbt@peixun-0054 ~]$ dbaccess mydb -

Database selected.

> grant dba to gb01;

Permission granted.

创建gb02用户,属于gb02组,并赋予dba权限

[root@peixun-0054 home]# useradd  -s /bin/bash -d /home/gb02 -m gb02

[root@peixun-0054 home]# passwd gb02
Changing password for user gb02.
New password: 
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@peixun-0054 home]# su - gbasedbt
Last login: Tue Oct 10 17:41:32 CST 2023 on pts/4
[gbasedbt@peixun-0054 ~]$ dbaccess mydb -

Database selected.

> grant dba to gb02;

Permission granted.

2)通过映射到系统用户的方式创建数据库用户,并且赋予mydb数据库dba权限。

[root@peixun-0054 ~]# mkdir /etc/gbasedbt/
[root@peixun-0054 gbasedbt]# echo "User:daemon">/etc/gbasedbt/allowed.surrogates 
[root@peixun-0054 gbasedbt]# su - gbasedbt
Last login: Wed Oct 11 13:39:02 CST 2023 on pts/1
[gbasedbt@peixun-0054 ~]$ onmode -wf USERMAPPING='ADMIN'

Value of USERMAPPING has been changed to ADMIN.
[gbasedbt@peixun-0054 ~]$ 
[gbasedbt@peixun-0054 ~]$ onmode -cache surrogates
[gbasedbt@peixun-0054 ~]$ dbaccess sysuser - <<!
> create default user with properties user 'daemon';
> !

Database selected.


User created.



Database closed.

[gbasedbt@peixun-0054 ~]$ dbaccess sysuser - <<!
> create user gb03 with password "gbase123";
> create user gb04 with password "gbase123";
> !

Database selected.


User created.


User created.



Database closed.

[gbasedbt@peixun-0054 ~]$ dbaccess mydb - <<!
> grant dba to gb03,gb04 ;
> !

Database selected.


Permission granted.



Database closed.

[gbasedbt@peixun-0054 ~]$ 

2,开启SQLTRACE

开启sqltrace的方式有两种,在开头示例中已说明,在实验中直接采用第二种方式,不重启数据库服务,模式选择全局跟踪模式。并且查看sysmaster数据库中syssqltrace视图,是否成功跟踪到sql。

[gbasedbt@peixun-0054 ~]$ dbaccess sysadmin -

Database selected.

> EXECUTE FUNCTION task("set sql tracing on", 100,"1k","low","global");



(expression)  SQL Tracing ON: ntraces=500, size=984, level=Low, mode=Global.

1 row(s) retrieved.


> select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sysmaster:syssqltrace;



sql_id         39
sql_statement  EXECUTE FUNCTION task("set sql tracing on", 100,"1k","low","glob
               al")
sql_uid        1000
sql_sid        51
sql_address    1300070776

sql_id         38
sql_statement  UPDATE command_history   SET (cmd_ret_msg, cmd_ret_status) =   (
                ?, 0 ) WHERE cmd_number = 117 AND cmd_ret_msg = 'running'
sql_uid        1000
sql_sid        51
sql_address    1300070768

2 row(s) retrieved.

> select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sysmaster:syssqltrace;



sql_id         40
sql_statement  select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sys
               master:syssqltrace
sql_uid        1000
sql_sid        51
sql_address    1300070784

sql_id         39
sql_statement  EXECUTE FUNCTION task("set sql tracing on", 100,"1k","low","glob
               al")
sql_uid        1000
sql_sid        51
sql_address    1300070776

sql_id         38
sql_statement  UPDATE command_history   SET (cmd_ret_msg, cmd_ret_status) =   (
                ?, 0 ) WHERE cmd_number = 117 AND cmd_ret_msg = 'running'
sql_uid        1000
sql_sid        51
sql_address    1300070768

3 row(s) retrieved.

可以看到 sqltrace功能开启之后,就会有两条sql,两条sql的运行着都是id为1000的用户也就是gbasedbt用户,都在id为51的会话运行,sql地址相差8。

而且,我们查询sqltrace用的sql语句并没有显示,第二次在输入之后才能查得到。


3,用gb01,gb02用户进行查询操作,然后在查询syssqltrace视图。

1)gb01用户:

[gbasedbt@peixun-0054 ~]$ dbaccess - -
> connect to 'mydb@gbase01' user 'gb01';                      #gbasedbt用户切换到gb01用户
   ENTER PASSWORD:

Connected.

> info tables;                                                #查询数据库中的表


Table name

t1                 t2                 t3                 t4                

> 

我们可以看下sql跟踪效果

 select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sysmaster:syssqltrace;



sql_id         50
sql_statement   select tabname from gbasedbt . systables where tabid >= 100 ord
               er by tabname
sql_uid        1001
sql_sid        57
sql_address    1300070864

sql_id         49
sql_statement  select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sys
               master:syssqltrace
sql_uid        1000
sql_sid        51
sql_address    1300070856

sql_id         48
sql_statement  Database 'mydb'
sql_uid        1000
sql_sid        56
sql_address    1300070848

sqlid为48的语句对应的是切换用户的语句:虽然我们这句命令的目的是为了切换用户,但是切换用户不是sql,所以他只记录connect database的部分。

sqlid为50的语句对应的是查询数据库中的表

可以看出有时候我们输入的sql和跟踪的sql显示的可能不一样,但效果是一样的。

也能看出切换用户之后,sql_sid和sql_uid都发生了变化。gbasedbt用户的uid为1000,gb01用户的uid为1001.

2)gb02用户:

> connect to 'mydb@gbase01' user 'gb02';
   ENTER PASSWORD:

Disconnected.


Connected.

> select * from t4;


         id name                 

          1 abc                 

1 row(s) retrieved.

查询syssqltrace视图:

> select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sysmaster:syssqltrace ;  


这次切换用户的时候,虽然也是使用的和之前一样的语句,但是因为之前就已经连接过数据库,所以没有任何连接数据库的记录,只有最后连接完数据库查询t4表的记录。


结论:

1,一条语句中,sqltrace只跟踪sql部分。

2,有些命令不是sql语句,但是有和sql语句相同的效果,sqltrace会进行转换。

 

4,用gb03,gb04(映射到daemon用户的数据库用户)用户进行查询操作,然后在查询syssqltrace视图。

gb03用户:

> connect to 'mydb@gbase01' user 'gb03';
   ENTER PASSWORD:

Disconnected.


Connected.

> select * from t3;


         id name                 

          1 acb                 

1 row(s) retrieved.

gb04用户:

> connect to 'mydb@gbase01' user 'gb04';
   ENTER PASSWORD:

Disconnected.


Connected.

> select * from t4;


         id name                 

          1 abc                 

1 row(s) retrieved.

查看syssqltrace视图:

> select sql_id,sql_statement,sql_uid,sql_sid,sql_address from sysmaster:syssqltrace ;



sql_id         62
sql_statement  select * from t4
sql_uid        2
sql_sid        63
sql_address    1300070960

sql_id         61
sql_statement  select * from t3
sql_uid        2
sql_sid        59
sql_address    1300070952

我们发现,不同的数据库用户,映射到同一个系统用户的时候,syssqltrace视图中uid显示的就是所映射的系统用户的id。也就是说这种情况下没办法根据syssqltrace视图得知是哪个用户运行的sql。

这种情况下,可以通过sid来查看是哪个用书在执行sql语句。如下所示:

> select s.sid,s.username ,s.uid from syssessions s,syssqltrace t where t.sql_sid=s.sid and s.uid=2;


        sid username                                 uid 

         63 gb04                                       2
         59 gb03                                       2
         59 gb03                                       2

3 row(s) retrieved.

我们得知63会话是属于gb04用户的,59会话是属于gb03用户的。所以能知道gb03运行的是sql_id为61的语句,gb04运行的是sql_id为62的语句.

但是!!!!!syssessions表中的会话如果关闭了,就没办法查询sid了,也就是如果会话已经关闭了,切是通过映射到系统用户创建的数据库用户,SQL跟踪的时候没办法确定具体是哪个用户执行的sql。

 

 

 

 

 

 

评论

登录后才可以发表评论
加载中...