当前位置: 首页 > article >正文

7-简单巡检

KES的版本与license有效期

简单而又会产生灾难性的问题

使用version函数查看KES版本信息

test=# select version();

image-20241107144904823

查看license有效期

test=# select get_license_validdays(); 

image-20241107145222307

服务器的时区和时间

查看KES服务器的时区

test=# show timezone;
test=# show time_zone;
#两者皆可

image-20241107145430848

查看KES服务器的时间

test=# select now();				//查询至时间戳
test=# select current_timestamp;	 //查询至时间戳
test=# select sysdate;				//查询至时间
test=# select current_date;			//查询至日期

image-20241107150357606

启动时间与运行时长

查看数据库实例启动时间

test=# select sys_postmaster_start_time();

image-20241107151245292

查看KES无故障运行时长

test=# select date_trunc('second', current_timestamp -sys_postmaster_start_time()) as uptime;

image-20241107151455808

查看最近一次加载参数文件的时间

test=# select sys_conf_load_time();

image-20241107151949073

空间占用情况

查看数据库列表

1、使用ksql的参数-l

[kingbase@node1 ~]$ ksql -dtest -Usystem -l

image-20241107152245337

使用元命令\l

test=# \l

image-20241107152155864

2、使用数据字典

test=# select datname from sys_database;

image-20241107152514938

查看数据库占用的磁盘空间

1、统计当前数据库占用的磁盘空间

test=# select sys_database_size(current_database())/1024/1024 || 'MB'MB;

image-20241107153245112

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'));

image-20241107155411614

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'));

image-20241107160540646

3、统计表的记录数

test=# select count(*) || 'rows' "rows" from t01;

image-20241107160711937

数据库的连接信息

在巡检过程中,如在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';

image-20241107182054179

image-20241107182211490

会话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';

image-20241107183603513

2、在原先的会话1任意执行一个命令,由此可以看出该会话被断开

test=# \l
致命错误:  由于管理员命令中断联接
服务器意外地关闭了联接
	这种现象通常意味着服务器在处理请求之前
或者正在处理请求的时候意外中止

image-20241107183749710

小结

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的函数

命错误: 由于管理员命令中断联接
服务器意外地关闭了联接
这种现象通常意味着服务器在处理请求之前
或者正在处理请求的时候意外中止


http://www.kler.cn/a/403417.html

相关文章:

  • 真题-桂城2018年六年级
  • 高阶C语言补充:柔性数组
  • 经典算法:查找与排序
  • STM32 ADC 读取模拟量
  • 学习日志015--python单链表
  • 数据库笔记1
  • 23.<Spring图书管理系统(强制登录版本)>
  • ADB->ADB宏控开关控制
  • django基于django的民族服饰数据分析系统的设计与实现
  • 接口性能优化的技巧
  • Spring学习笔记_42——@CookieValue
  • Android CTA配置和3C认证、SRRC认证
  • IT资产管理工具-NetBox
  • Python爬虫 | Scrapy 爬虫框架学习
  • CAAS 和 IAAS
  • 工业机器视觉中图像质量评估
  • Spring Boot 注解
  • 问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
  • 安卓开发实现图像处理相关功能
  • 三十九、Python(pytest框架-中)
  • Spark核心组件解析:Executor、RDD与缓存优化
  • k8s1.31版本最新版本集群使用容器镜像仓库Harbor
  • Go Web服务中如何优雅平滑重启?
  • 基于Quartus Prime18.1的安装与FPGA的基础仿真(联合Modelsim)教程
  • js实现购物车功能
  • Qt问题:不同文件中相同命名空间的多个 Q_NAMESPACE