wukaiqiang 发布的文章

使用脚本批量Telnet测试端口是否连通
在一些情况下,我们无法安装nc,ansible等工具,所以一些批量操作,我们只能使用shell实现。下面分享一个近期工作中使用到的批量Telnet端口的脚本,希望对大家能够帮助:

脚本内容:

#!/bin/bash
check_telnet(){
for ip_port in $(cat ip_info|grep -v '^#')
do
    CHECK_PORT=$(echo $ip_port|awk -F: '{print $2}')
    CHECK_IP=$(echo $ip_port|awk -F: '{print $1}')
    echo -e "\n"| telnet $CHECK_IP $CHECK_PORT |grep "Connected to\|Escape character" >/dev/null
    if [ $? -eq 0 ];then
        echo "$LOCALIP result $CHECK_IP $CHECK_PORT connected"
    else
        echo "$LOCALIP result $CHECK_IP $CHECK_PORT can not Connected"
    fi
done
}
check_telnet >result.log

ip_info 列表内容

请使用ip:port 或者 域名:port 的格式编辑以下内容;

如果是一个列表,可以使用#对不进行测试的IP进行注释

192.168.1.1:8080
192.168.1.2:22
#192.168.1.3:8090
baidu.com:8080

使用方法
./telnet_batch,sh
————————————————
版权声明:本文为CSDN博主「story-xu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31457413/article/details/107590571

1、《基于Oracle的SQL优化》
链接:https://pan.baidu.com/s/1l-7MjKef4vKbBrs5gATdWg
提取码:wkqq
2、《收获不止oracle》
链接:https://pan.baidu.com/s/1h_CWm0gQim9IvbKWJevULQ
提取码:wkqq
3、《rac集群管理》
链接:https://pan.baidu.com/s/153973bd1MnzMlkcqBop2Zw
提取码:wkqq
4、《oracle管理》
链接:https://pan.baidu.com/s/1JMxJnhPHt-vcruferwzZpg
提取码:wkqq
5、《收获不止sql优化》
链接:https://pan.baidu.com/s/1Gwjtvwe7rZZBfhC1Qum_Ig
提取码:wkqq

sql 执行频率

一、通过 show status 命令了解各种sql的执行频率

mysql客户端连接成功后,通过show[session|global] status命令,可以查看服务器的状态,如果不加默认为session(session级为当前连接的统计结果,global级为自数据库上次启动到现在的统计结果)。
Eg: show status like 'Com_%';

com_xx表示每个xx语句的执行次数,通常着重看curd操作次数(这些参数适用于所有存储引擎);

Com_insert:执行select操作的次数,一次查询只累加1;
Com_select:执行insert操作的次数,批量插入的insert操作只累加一次;
Com_delete:执行update操作次数,提交和回滚均会累加;
Com_update:执行delete操作次数。
针对innodb存储引擎的表操作,累加的算法比如:show status like 'Innodb_rows_%';

show status like 'connections';----- 试图连接mysql数据库的次数

show status like ‘uptime’;-- 服务器工作时间

show status like ‘slow_queries’; – 慢查询的次数

二、定位执行效率较低的sql语句

​ 通过慢查询日志定位哪些sql执行效率低下,用–log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time 秒的sql语句的日志文件,具体可参看后面的日志管理部分。
​ 慢查询日志在查询结束以后才记录,所以在应用反正执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前mysql在进行的线程,包括线程的状态,是否锁表等,可以实时查看sql的执行情况,同时对一些锁表操作进行优化。

三、通过explain分析低效sql的执行计划

追查到效率低的sql后,可以通过explain或desc命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序,eg:统计某个email为租赁电影拷贝所支付的总金额,需要关联客户表customer和付款表payment,并且对付款金额amount字段做求和操作,相应sql的执行计划如下:
explain select sum(amount) from customer a ,payment b where 1=1 and a.customer_id=b.customer_id and email ='JANE.BENNETT@SAKILACUSTOMER.ORG'\G

下面对每个列进行简单说明:
select_type:表示select的类型,常见取值 simple(简单表,即不适用表连接或者子查询),primary(主查询,即外层的查询),union(union中的第二个或者后面的查询语句),subquery(子查询中的第一个select)等。
table:输出结果集的表。
possible_keys:表示查询时可能使用的索引,不表示出现在这里的就是表的全部索引。
key:表示实际使用的索引。
key_len:使用到索引字段的长度。
rows:扫描行的数量。
extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。

type:表示mysql在表中找到所需行的方式,或者叫访问类型,常见如下(性能由左至右由最差变道最好):all 、 index 、 range 、 ref、 eq_ref 、 const,system 、 null

在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接、有多少活跃链接、有没有执行时间过长的链接等。数据库的各种异常也能通过链接情况间接反应出来,特别是数据库出现死锁或严重卡顿的时候,我们首先应该查看数据库是否有异常链接,并杀掉这些异常链接。本篇文章将主要介绍如何查看数据库链接及如何杀掉异常链接的方法。

1.查看数据库链接

查看数据库链接最常用的语句就是 show processlist 了,这条语句可以查看数据库中存在的线程状态。普通用户只可以查看当前用户发起的链接,具有 PROCESS 全局权限的用户则可以查看所有用户的链接。

show processlist 结果中的 Info 字段仅显示每个语句的前 100 个字符,如果需要显示更多信息,可以使用 show full processlist 。同样的,查看 information_schema.processlist 表也可以看到数据库链接状态信息。

普通用户只能看到当前用户发起的链接

mysql> select user();

| user() |

| testuser@localhost |

1 row in set (0.00 sec)

mysql> show grants;

| Grants for testuser@% |

| GRANT USAGE ON . TO 'testuser'@'%' |

| GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'testuser'@'%' |

2 rows in set (0.00 sec)

mysql> show processlist;

| Id | User | Host | db | Command | Time | State | Info |

| 769386 | testuser | localhost | NULL | Sleep | 201 | | NULL |

| 769390 | testuser | localhost | testdb | Query | 0 | starting | show processlist |

2 rows in set (0.00 sec)

mysql> select * from information_schema.processlist;

| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |

| 769386 | testuser | localhost | NULL | Sleep | 210 | | NULL |

| 769390 | testuser | localhost | testdb | Query | 0 | executing | select * from information_schema.processlist |

2 rows in set (0.00 sec)

授予了PROCESS权限后,可以看到所有用户的链接

mysql> grant process on . to 'testuser'@'%';

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> show grants;

| Grants for testuser@% |

| GRANT PROCESS ON . TO 'testuser'@'%' |

| GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'testuser'@'%' |

2 rows in set (0.00 sec)

mysql> show processlist;

| Id | User | Host | db | Command | Time | State | Info |

| 769347 | root | localhost | testdb | Sleep | 53 | | NULL |

| 769357 | root | 192.168.85.0:61709 | NULL | Sleep | 521 | | NULL |

| 769386 | testuser | localhost | NULL | Sleep | 406 | | NULL |

| 769473 | testuser | localhost | testdb | Query | 0 | starting | show processlist |

4 rows in set (0.00 sec)

通过 show processlist 所得结果,我们可以清晰了解各线程链接的详细信息。具体字段含义还是比较容易理解的,下面具体来解释下各个字段代表的意思:

Id:就是这个链接的唯一标识,可通过 kill 命令,加上这个Id值将此链接杀掉。

User:就是指发起这个链接的用户名。

Host:记录了发送请求的客户端的 IP 和 端口号,可以定位到是哪个客户端的哪个进程发送的请求。

db:当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL 。

Command:是指此刻该线程链接正在执行的命令。

Time:表示该线程链接处于当前状态的时间。

State:线程的状态,和 Command 对应。

Info:记录的是线程执行的具体语句。

当数据库链接数过多时,筛选有用信息又成了一件麻烦事,比如我们只想查某个用户或某个状态的链接。这个时候用 show processlist 则会查找出一些我们不需要的信息,此时使用 information_schema.processlist 进行筛选会变得容易许多,下面展示几个常见筛选需求:

只查看某个ID的链接信息

select * from information_schema.processlist where id = 705207;

筛选出某个用户的链接

select * from information_schema.processlist where user = 'testuser';

筛选出所有非空闲的链接

select * from information_schema.processlist where command != 'Sleep';

筛选出空闲时间在600秒以上的链接

select * from information_schema.processlist where command = 'Sleep' and time > 600;

筛选出处于某个状态的链接

select * from information_schema.processlist where state = 'Sending data';

筛选某个客户端IP的链接

select * from information_schema.processlist where host like '192.168.85.0%';

2.杀掉数据库链接

如果某个数据库链接异常,我们可以通过 kill 语句来杀掉该链接,kill 标准语法是:KILL [CONNECTION | QUERY] processlist_id;

KILL 允许使用可选的 CONNECTION 或 QUERY 修饰符:

KILL CONNECTION 与不含修改符的 KILL 一样,它会终止该 process 相关链接。

KILL QUERY 终止链接当前正在执行的语句,但保持链接本身不变。

杀掉链接的能力取决于 SUPER 权限:

如果没有 SUPER 权限,则只能杀掉当前用户发起的链接。

具有 SUPER 权限的用户,可以杀掉所有链接。

遇到突发情况,需要批量杀链接时,可以通过拼接 SQL 得到 kill 语句,然后再执行,这样会方便很多,分享几个可能用到的杀链接的 SQL :

杀掉空闲时间在600秒以上的链接,拼接得到kill语句

select concat('KILL ',id,';') from information_schema.processlist

where command = 'Sleep' and time > 600;

杀掉处于某个状态的链接,拼接得到kill语句

select concat('KILL ',id,';') from information_schema.processlist

where state = 'Sending data';

select concat('KILL ',id,';') from information_schema.processlist

where state = 'Waiting for table metadata lock';

杀掉某个用户发起的链接,拼接得到kill语句

select concat('KILL ',id,';') from information_schema.processlist

user = 'testuser';

这里提醒下,kill 语句一定要慎用!特别是此链接执行的是更新语句或表结构变动语句时,杀掉链接可能需要比较长时间的回滚操作。

总结:

本篇文章讲解了查看及杀掉数据库链接的方法,以后怀疑数据库有问题,可以第一时间看下数据库链接情况。
————————————————
版权声明:本文为CSDN博主「y咯p秒杀软」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_35990581/article/details/113952377