不停機處理oracle超過最大processes數故障
在做oracle資料庫管理的時候,經常會有使用者遇到超過最大程式數的錯誤,表現為新的連線無法登入資料庫。一致提示超過最大的process數 。其實這個問題,如果使用者是測試環境,好解決。直接關閉資料庫或者直接kill掉所有的“LOCAL=NO”的程式。
但是很多情況是,使用者無法接受停機,或者kill掉所有的遠端連線。基於以上情況,寫了如下指令碼
#!/usr/bin/perl
#write by wulei
#get the first parameter
$arg1="";
chomp($arg1);
while($arg1 eq "")
{
print "please input your first parameter:";
$arg1=<STDIN>;
chomp($arg1);
if($arg1 ne ""){
@temp1=`ps -eo lstart,pid,args | grep '$arg1' | grep -v grep`;
$process_count=`ps -eo lstart,pid,args | grep '$arg1' | grep -v grep | wc -l`;
chomp($process_count);
if($process_count eq "0")
{
$arg1="";
print "we got 0 processes,please retry!n";
next;
}
print "We will kill $process_count(count) processesn";
print "All the processes list below!!!!!!!!!!!!!!!!!n";
print "#############################################################n";
print @temp1;
}
chomp($arg1);
}
#get the second parameter
$arg2="";
chomp($arg2);
while($arg2 eq "")
{
print "n";
print "n";
print "############################################################n";
print "#[null] kill all the process we had got #n";
print "#[num ] kill the process start at before sysdate-number #n";
print "if you want exit,enter 'ctrl+c' #n";
print "############################################################n";
print "please input your second parameter:";
$arg2=<STDIN>;
chomp($arg2);
if($arg2 eq "")
{
print "Are you sure,to kill all the process above:[y/n]";
$confirm=<STDIN>;
chomp($confirm);
if($confirm eq "Y" or $confirm eq "y")
{
#kill all the process ,we got it
@result=`ps -eo pid,args | grep '$arg1' | grep -v grep`;
print "Kill List !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!n";
print "###################################################################n";
foreach $result (@result)
{
@result1=split(/s+/,$result);
chomp($result1[0]);
if($result1[0] ne ""){
#`kill -9 '$result1[0]'`;
print $result1[0]." ".$result1[1]." ".$result1[2]."n";
push(@kill_Queue,$result1[0]);
}
}
$killQueueLen=@kill_Queue;
print "###################################################################n";
print "We will kill '$killQueueLen' processes!!n";
print "Are you sure about kill the processes above?[y/n]";
$yesorno=<STDIN>;
chomp($yesorno);
if($yesorno eq "Y" or $yesorno eq "y")
{
print "###################################################################n";
foreach $kill_Queue (@kill_Queue)
{
print $kill_Queue;
chomp($kill_Queue);
if($kill_Queue ne "")
{
`kill -9 '$kill_Queue'`;
}
}
}
elsif($yesorno eq "N" or $yesorno eq "n")
{
@kill_Queue=();
$arg2="";
next;
}
else
{
print "###################################################################n";
print "JUEST Y or N!!!!n";
print "###################################################################n";
next;
}
print "OKn";
exit;
}
elsif($confirm eq "N" or $confirm eq "n")
{
exit 0;
}
else
{
print "Please input [y/n]:";
next;
}
}
else
{
if($arg2 =~ /^[+-]?d+$/)
{
@result=`ps -eo lstart,pid,args | grep $arg1 | grep -v grep`;
my @kill_Queue="";
print "killed listn";
print "###################################################################n";
foreach $result ( @result)
{
if($result ne "")
{
@result1 =split(/s+/,$result);
$time_start=$result1[1]." ".$result1[2]." ".$result1[3]." ".$result1[4];
$format_time=`date -d '$time_start' '+%Y/%m/%d %T'`;
chomp($format_time);
$pro_st_time=`date +%s -d '$format_time'`;
$a1=`date`;
chomp($a1);
chomp($pro_st_time);
chomp($kill_time);
$cur_time=`date +%s -d '$a1'`;
$kill_time=$cur_time-$arg2;
if($pro_st_time > $kill_time)
{
print $result1[5]." ".$result1[6]." ".$result1[7]."n";
push(@kill_Queue,$result1[5]);
}
}
else
{
next;
}
}
$killQueueLen=@kill_Queue-1;
print "###################################################################n";
print "We will kill '$killQueueLen' processes!!n";
print "Are you sure about kill the processes above?[y/n]";
$yesorno=<STDIN>;
chomp($yesorno);
if($yesorno eq "Y" or $yesorno eq "y")
{
foreach $kill_Queue (@kill_Queue)
{
chomp($kill_Queue);
if($kill_Queue ne "")
{
`kill -9 '$kill_Queue'`;
}
}
}
elsif($yesorno eq "N" or $yesorno eq "n")
{
$arg2="";
next;
}
}
}
print "retry";
}
print "End of the scriptn";
print "================================================================n";
指令碼的基本功能就是,可以資料要過濾的程式例如"LOCAL=NO“,然後獲得所有匹配程式的開始時間和程式內容。然後,需要資料要kill的程式是在當前時間點之前多少秒開始的程式。如果輸入null的話。就是kill掉所有匹配的程式。如果輸入1000的話,就是kill掉所有在過去1000秒鐘開始的標記為”LOCAL=NO“的所有的程式。
執行完過程之後,就應該可以連線到資料庫中。調整process引數。保證系統正常執行,然後再查詢導致此錯誤的原因。
這樣的話,我們就可以儘可能的減少對系統的影響。
當前指令碼知識在linux上測試過,沒有在其他類unix系統測試。
©著作權歸作者所有:來自51CTO部落格作者swswfas的原創作品,如需轉載,請註明出處,否則將追究法律責任
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2821117/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle更新Opatch故障處理Oracle
- Oracle 10g RAC故障處理Oracle 10g
- Oracle 11.2.0.4 Dataguard兩則故障處理Oracle
- Oracle DG同步失敗故障處理(二)Oracle
- Oracle client安裝the jre is 0故障處理Oracleclient
- 【故障處理】ORA-600:[13013],[5001]故障處理
- 【CHECKPOINT】Oracle檢查點優化與故障處理Oracle優化
- Oracle密碼過期處理Oracle密碼
- 聊聊介面最大併發處理數
- linux故障處理Linux
- 故障分析 | Greenplum Segment 故障處理
- oracle中的processes,session,transaction引數詳解OracleSession
- GPON網路故障如何處理?GPON網路故障處理流程
- oracle 19c varchar2超過4000位元組處理Oracle
- oracle密碼過期處理辦法Oracle密碼
- Oracle impdp遷移資料後主鍵丟失故障處理Oracle
- MySQL show processlist故障處理MySql
- 微服務的故障處理微服務
- teams登入故障處理
- MySQL單表最大記錄數不能超過多少?MySql
- 修改 Nginx 程式最大可開啟檔案數(worker processes和worker connections)Nginx
- Nginx 超時事件的處理機制Nginx事件
- Oracle SQL處理OracleSQL
- 線上故障處理手冊
- oracle使用者鎖住、過期處理方式Oracle
- Oracle CPU使用率過高問題處理Oracle
- 記一次一波三折的Oracle RAC故障處理Oracle
- 資料庫故障處理優質文章彙總(含Oracle、MySQL、MogDB等)資料庫OracleMySql
- mysql GTID主從複製故障後不停機恢復同步流程MySql
- 詳述一條SQL引發的高CPU故障處理過程SQL
- MySQL:5.7.11 超過最大開啟檔案數crash原因解析MySql
- oracle系統表空間過大問題處理Oracle
- 【故障處理】TNS-04610問題
- GaussDB(分散式)例項故障處理分散式
- ORA-01591錯誤故障處理
- 如何處理HTTP 503故障問題?HTTP
- Oracle壞塊處理Oracle
- oracle異常處理Oracle