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> 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