7-简单巡检
KES的版本与license有效期
简单而又会产生灾难性的问题
使用version函数查看KES版本信息
test=# select version();
查看license有效期
test=# select get_license_validdays();
服务器的时区和时间
查看KES服务器的时区
test=# show timezone;
test=# show time_zone;
#两者皆可
查看KES服务器的时间
test=# select now(); //查询至时间戳
test=# select current_timestamp; //查询至时间戳
test=# select sysdate; //查询至时间
test=# select current_date; //查询至日期
启动时间与运行时长
查看数据库实例启动时间
test=# select sys_postmaster_start_time();
查看KES无故障运行时长
test=# select date_trunc('second', current_timestamp -sys_postmaster_start_time()) as uptime;
查看最近一次加载参数文件的时间
test=# select sys_conf_load_time();
空间占用情况
查看数据库列表
1、使用ksql的参数-l
[kingbase@node1 ~]$ ksql -dtest -Usystem -l
使用元命令\l
test=# \l
2、使用数据字典
test=# select datname from sys_database;
查看数据库占用的磁盘空间
1、统计当前数据库占用的磁盘空间
test=# select sys_database_size(current_database())/1024/1024 || 'MB'MB;
2、统计所有数据库占用的磁盘空间总量
test=# select (sum(sys_database_size(datname))/1024/1024) || 'MB' MB from sys_database;
-[ RECORD 1 ]-------------
mb | 64.3183355331420898MB
查看表和索引的大小
1、统计表的空间占用
sys_size_pretty这个函数可以将字节大小转换成人类可读的模式,sys_relation_size函数返回的是表的物理磁盘的大小,”||“用于拼接多个字符
这里将"select sys_relation_size(‘t01’)"返回的结果除以1024,然后在将其和kb拼接起来
test=# select sys_relation_size('t01')/1024 || 'kb' kb;
test=# select sys_size_pretty(sys_relation_size('public.t01'));
2、统计表和与表关联的索引占用空间总量
使用sys_total_relation_size函数
test=# select sys_total_relation_size('t01')/1024 || 'kb' kb;
test=# select sys_size_pretty(sys_total_relation_size('t01'));
3、统计表的记录数
test=# select count(*) || 'rows' "rows" from t01;
数据库的连接信息
在巡检过程中,如在docker下部署KES数据库
查看当前登录数据库的名称
test=# select current_catalog;
current_catalog
-----------------
test
(1 行记录)
test=# select current_database();
current_database
------------------
test
(1 行记录)
查看当前会话信息
1、查看当前会话的客户端IP和端口
test=# select inet_client_addr(),inet_client_port();
inet_client_addr | inet_client_port
------------------+------------------
192.168.40.111 | 14346
(1 行记录)
2、查看服务器的IP和端口
test=# select inet_server_addr(),inet_server_port();
inet_server_addr | inet_server_port
------------------+------------------
192.168.40.111 | 54321
(1 行记录)
3、查看当前会话的后台进程ID
test=# select sys_backend_pid(); //查看
sys_backend_pid
-----------------
23134
(1 行记录)
test=# \! ps aux | grep 23134 | grep -v grep //验证
kingbase 23134 0.0 0.5 735144 20812 ? Ss 16:27 0:00 kingbase: system test 192.168.40.111(14350) idle
查看数据库中的连接信息
从sys_stat_activity表中查询datname,usename,client_addr,client_port这几个字段
test=# select datname,usename,client_addr,client_port from sys_stat_activity;
datname | usename | client_addr | client_port
---------+---------+----------------+-------------
| | |
| system | |
| system | |
test | system | 192.168.40.111 | 14350
| | |
| | |
| | |
(7 行记录)
查看会话执行的SQL信息
1、确认参数track_activities值为on
test=# show track_activities ;
track_activities
------------------
on
(1 行记录)
2、只看正在运行的SQL信息
查看状态(state)为非idle的状态
test=# select datname,usename,query,state from sys_stat_activity where state not like 'idle%';
-[ RECORD 1 ]------------------------------------------------------------------------------------
datname | test
usename | system
query | select datname,usename,query,state from sys_stat_activity where state not like 'idle%';
state | active
查看耗时较长的SQL
原理是查询当前的时间减去开始的时间(query_start),通过在sys_stat_activity视图中查询current_timestamp字段得到当前的时间
where state != ‘idle’ 要求状态不是在线
order by 1 desc 为降序排列
test=# select current_timestamp - query_start as runtime,datname,usename,pid,query
test-# from sys_stat_activity
test-# where state != 'idle'
test-# order by 1 desc;
-[ RECORD 1 ]-----+------------------------------
current_timestamp | 2024-11-07 16:54:30.396887+08
实验1:事务阻塞会话的简单处理
会话1----实验准备
1、使用system用户登录数据库test
[kingbase@node1 ~]$ ksql test system
2、为保证实验不受影响,先删除t01数据库(使用不会报错的方式删除)
test=# drop table if exists t01;
注意: 表 "t01" 不存在
DROP TABLE
3、创建表t01,字段为id和name,字段类型分别为int和text
test=# create table t01(id int,name text);
CREATE TABLE
4、向表t01中插入数据(1,‘a’)、(2,‘b’)和(3,‘c’)
test=# insert into t01 values (1,'a');
INSERT 0 1
test=# insert into t01 values (2,'b');
INSERT 0 1
test=# insert into t01 values (3,'c');
INSERT 0 1
5、查看当前是否有事务在运行
test=# commit;
警告: 没有事物在运行中
COMMIT
会话1-----关闭自动提交、删除记录
1、查看当前会话后台进程ID
test=# select sys_backend_pid();
sys_backend_pid
-----------------
23274
(1 行记录)
2、将自动提交关闭
就是将AUTOCOMMIT给关闭掉,因为KES数据库默认是开启自动提交的
test=# \set AUTOCOMMIT off
3、删除表t01中id为1的那行数据
test=# delete from t01 where id=1;
DELETE 1
会话2-----做与会话1同样的操作,结果:发生锁等待事件
锁等待产生的原因:会话1和会话2都删除了表t01中的id=1的行
如果会话1长时间没有去提交这个事务,会话2就没有办法执行,那么会话2就会去找DBA(数据库管理员),寻求怎么解决
DBA会处理这件事情,如何处理呢?通过sys_stat_activity来查看test的状态
通过观察wait_event_type等待的类型是不是产生一些事件,导致会话2没有办法进行
查看会话2的状态下wait_event_type是否为Lock
如果为Lock,会导致锁不上这条记录,只有锁上这条记录才能操作。所以此时是无法操作的
这时就要对会话1进行kill的处理
1、另外开启一个会话,使用system用户登录数据库test
[kingbase@node1 ~]$ ksql test system
2、查询当前会话的后台进程ID
test=# select sys_backend_pid();
sys_backend_pid
-----------------
23527
(1 行记录)
3、关闭自动提交
test=# \set AUTOCOMMIT off
4、删除表t01中id为1的那行数据
执行完下述命令时,就会发现会话2不动了,这就产生了锁等待事件
test=# delete from t01 where id=1;
会话3-----查询会话状态
1、打开横向输出
\x
2、查看当前会话登录后台进程ID
test=# select sys_backend_pid();
-[ RECORD 1 ]---+------
sys_backend_pid | 23636
3、查看sys_stat_activity视图中关于test的内容
通过观察会话1、2、3的状态,可以在各个会话中wait_event_type和wait_event中看出会话1和会话2都是异常的,会话三是正常的
wait_event_type为Client表示等待事件,通常由客户端触发;wait_event_type为Lock表示锁状态
wait_event为ClientRead表示系统正在从客户端读取数据,wait_event为transactionid表示系统正在等待特定事务ID完成相关操作或资源释放
test=# select * from sys_stat_activity where datname='test';
会话3-----清理导致阻塞的会话(杀掉会话1),最重要
使用sys_terminate_backend(会话1ID)函数来kill掉会话1
test=# select sys_terminate_backend(23274);
-[ RECORD 1 ]---------+--
sys_terminate_backend | t
当我们执行完上述这一条kill会话1的命令,与此同时,会话2的锁等待事件也消失了,因为这个时候,delete表t01那行数据已经被释放掉了
会话2–会话1被断开(事务自动回滚)
1、确认:会话2由锁等待状态转为正常状态
通过pid的对比可以看到原先的会话2变成了现在的会话1
test=# select * from sys_stat_activity where datname='test';
2、在原先的会话1任意执行一个命令,由此可以看出该会话被断开
test=# \l
致命错误: 由于管理员命令中断联接
服务器意外地关闭了联接
这种现象通常意味着服务器在处理请求之前
或者正在处理请求的时候意外中止
小结
KES中取消一条运行时间很长的SQL语句是"sys_cancel_backend"
注:
1、sys_cancel_backend:取消指定会话当前正在执行的SQL操作,会话还存在,回滚未提交事务
2、sys_terminate_backend:中断指定会话,回滚未提交事务
sys_stat_activity系统表
1、可以看到连接的状态信息
2、可以看到连接执行的SQL语句文本,以及过去所执行的SQL语句
3、可以看到事务开始的时间
这个实验主要是记住几个函数和系统视图及其功能
sys_stat_activity:系统视图,这里面有数据库中所有会话的状态信息
sys_backend_pid():用于会话ID的函数
命错误: 由于管理员命令中断联接
服务器意外地关闭了联接
这种现象通常意味着服务器在处理请求之前
或者正在处理请求的时候意外中止