南大通用GBase 8a 集群如何唯一标识一条用户SQL

GBase 8a支持多节点的集群,每个节点都可以连接,每个连接可以发送执行多个SQL, 那如何唯一标识一条用户SQL呢?

参考

GBase 8a 集群审计日志audit_log攻略和使用方法

主机

唯一标识一台主机,通过主机名或者设定的IP。 建议主机名。

主机名@@hostname

标识当前节点的名字,如果你集群所有节点都没有修改主机名,而是默认的localhost,那么就无法区分了。

gbase> select @@hostname;
+------------+
| @@hostname |
+------------+
| rh6-1      |
+------------+
1 row in set (Elapsed: 00:00:00.00)

主机IP@@bind_address

GBase 8a服务默认侦听本地所有IP, 但其本身是支持只侦听必要的IP的,通过参数bind_address指定。默认值是::

gbase> show variables like '%bind%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| bind_address  | ::    |
+---------------+-------+
1 row in set (Elapsed: 00:00:00.00)

修改配置文件,增加或编辑bind_address参数,设置为IP地址后就可以查询到了。

GBase 8a 修改配置文件,增加或编辑bind_address参数,设置为IP地址
gbase> select @@bind_address;
+----------------+
| @@bind_address |
+----------------+
| 10.0.2.201     |
+----------------+
1 row in set (Elapsed: 00:00:00.00)

同时对比前后的操作系统端口差异也能看出不同。

默认侦听的是*,全部
[gbase@rh6-1 ~]$ lsof -i:5258
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gclusterd 2779 gbase   16u  IPv6  12567      0t0  TCP *:5258 (LISTEN)

修改参数重启后是
[gbase@rh6-1 gcinstall_862B43R30]$ lsof -i:5258
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
gclusterd 4568 gbase   16u  IPv4  27721      0t0  TCP rh6-1:5258 (LISTEN)

连接(ID)

标识在某个节点的数据库连接。 在登录数据库时,会记录连接方的IP,端口,登录用户等信息,服务端则指定一个sessinId进行服务。

show processlist 里面的ID列。

审计日志audit_log里面的thread_id列。

一个连接,可以指定多个SQL。

任务(TaskID)

标识某一个具体的SQL,包括创建存储过程,调用存储过程,都只算一个task。

可以从审计日志audit_log的taskid列获得。

注意taskid为0的,是数据库内部通讯,不是用户发起的,当然也包括语法错误,根本没执行的

开始时间(Start_time)

理论上前面几个已经可以唯一标识一个SQL任务了。但如果服务重启了,所有序列都会重置,所以可以加上这个开始时间。

审计日志的start_time列

show processlist里的time列是执行的时间,用now()的秒数减去time列,也可以计算出start_time。

审计日志样例

gbase> select thread_id,taskid,start_time,uid,host_ip,sql_text,status from audit_log order by start_time;
+-----------+--------+---------------------+-----+------------+-------------------------------------------------------------------------------------------------------------------+---------+
| thread_id | taskid | start_time          | uid | host_ip    | sql_text                                                                                                          | status  |
+-----------+--------+---------------------+-----+------------+-------------------------------------------------------------------------------------------------------------------+---------+
|        13 |      0 | 2022-05-25 10:23:19 |   1 | 10.0.2.201 | Ping                                                                                                              | SUCCESS |
|        13 |      0 | 2022-05-25 10:23:19 |   1 | 10.0.2.201 | set  SELF global audit_log=1                                                                                      | SUCCESS |
|        12 | 131092 | 2022-05-25 10:23:19 |   1 |            | set global audit_log=1                                                                                            | SUCCESS |
|        12 |      0 | 2022-05-25 10:23:22 |   1 |            | set a=1                                                                                                           | FAILED  |
|        12 | 131093 | 2022-05-25 10:23:26 |   1 |            | set @a=1                                                                                                          | SUCCESS |
|        12 | 131094 | 2022-05-25 10:23:30 |   1 |            | set @b=2                                                                                                          | SUCCESS |
|         6 |      0 | 2022-05-25 10:49:55 |   1 | 10.0.2.201 | Ping                                                                                                              | SUCCESS |
|         6 |      0 | 2022-05-25 10:49:55 |   1 | 10.0.2.201 | set  SELF global audit_log=1                                                                                      | SUCCESS |
|         3 | 147471 | 2022-05-25 10:49:55 |   1 |            | set global audit_log=1                                                                                            | SUCCESS |
|         3 | 147472 | 2022-05-25 10:49:58 |   1 |            | set @aa=1                                                                                                         | SUCCESS |
|         3 | 147473 | 2022-05-25 10:49:58 |   1 |            | set @bb=2                                                                                                         | SUCCESS |
|         6 |      0 | 2022-05-25 10:50:06 |   1 | 10.0.2.201 | Ping                                                                                                              | SUCCESS |
|         6 |      0 | 2022-05-25 10:50:06 |   1 | 10.0.2.201 | set  SELF global log_output='TABLE'                                                                               | SUCCESS |
|         3 | 147474 | 2022-05-25 10:50:06 |   1 |            | set global log_output='TABLE'                                                                                     | SUCCESS |
|         6 |      0 | 2022-05-25 10:52:55 |   1 | 10.0.2.201 | Ping                                                                                                              | SUCCESS |
|         6 |      0 | 2022-05-25 10:52:55 |   1 | 10.0.2.201 | set  SELF global audit_log=1                                                                                      | SUCCESS |
|         3 | 147477 | 2022-05-25 10:52:55 |   1 |            | set global audit_log=1                                                                                            | SUCCESS |
|         3 | 147478 | 2022-05-25 10:52:59 |   1 |            | drop procedure if exists testdb.p_test                                                                            | SUCCESS |
|         6 |      0 | 2022-05-25 10:52:59 |   1 | 10.0.2.201 | Ping                                                                                                              | SUCCESS |
|         6 | 147480 | 2022-05-25 10:52:59 |   1 | 10.0.2.201 | SET NAMES utf8                                                                                                    | SUCCESS |
|         6 |      0 | 2022-05-25 10:52:59 |   1 | 10.0.2.201 | Init DB                                                                                                           | SUCCESS |
|         6 |      0 | 2022-05-25 10:52:59 |   1 | 10.0.2.201 | CREATE SELF DEFINER="root"@"%" PROCEDURE "testdb"."p_test" ()
begin
    select 1;
    select 2;
    select 3;
end | SUCCESS |
|         3 | 147479 | 2022-05-25 10:52:59 |   1 |            | create procedure testdb.p_test()
begin
    select 1;
    select 2;
    select 3;
end                              | SUCCESS |
|         3 | 147484 | 2022-05-25 10:53:07 |   1 |            | call testdb.p_test()                                                                                              | SUCCESS |
+-----------+--------+---------------------+-----+------------+-------------------------------------------------------------------------------------------------------------------+---------+
24 rows in set (Elapsed: 00:00:00.00)

总结

组合上面的列,就可以唯一标识一个【用户】发起的SQL。

主机+连接+任务+开始时间

要排除如下条件的记录

  • taskid=0
  • status=FAILED