我们在使用数据库的过程中,经常会遇到各种奇怪的问题。其中,读取数据卡住的问题,是少见并且难以定位的,很多时候大家都是在自己开发的系统寻找卡住的原因,而忽略的数据库造成的原因,结果是耽误时间,徒增损失。
本人做产品的过程中,偶尔会遇到产品正常运行,偶尔出现某些查询的结果集只读取一部分就完全没有输出的情况。
为了避免定位问题方向错误,这里使用了oracle官方的客户端连接数据库,做读取结果集的模拟操作。
queryCheck.sh
#!/bin/bash
startTime=`date`
echo "startTime:$startTime" >> queryTime.txt
sqlplus -s user/pass@db << EOFa
set pagesize 0 linesize 2000 feedback off tab off colsep |
select * from T_TEST;
disconnect;
quit;
EOFa
endTime=`date`
echo "endTime:$endTime" >> queryTime.txt
-
在脚本中,设置数据库的用户名user,密码pass,数据库db;
-
本例中将字段分隔符设为“|”,如果不喜欢,想用默认的TAB的话,可以将第三行改为【set pagesize 0 linesize 2000 feedback off tab off】
-
本次测试的查询语句是脚本中的【select * from T_TEST;】如果需要执行多个SQL,依次列入。如果需要执行SQL文件,也可以用@somesql.sql;
-
执行queryCheck.sh > outfile,就可将查询结果导出到outfile了。如果是不需要结果的,outfile为/dev/null。
-
使用tailf queryTime.txt看查询开始和结束时间,如果还没有结束就没有产生网络流量,则为数据库原因引起的查询卡住。
- 在执行之前,最好根据实际情况进行评估,条件允许的情况下,保留结果集,方便定位卡住的位置。
网友评论