要求如下:
1、資料庫mydata1中有個sms_info表,表中記錄格式如下:
- +-----------+------------------+------+-----
- | Field |
- +-----------+------------------+------+-----
- | id | 12345
- | number | 136123456789 表示人員電話聯絡號碼
- | service | check_ping nagios監控服務名
- | message | ping不通……………… nagios警示資訊
- | send_time | 2011-09-12 13:25:16 簡訊發送時間
- | is_send | y y表示成功傳送簡訊,n表示發送失敗
- +-----------+------------------+------+-----
這個表的作用是,儲存 nagios 警示時,哪個服務報的警,在什麼時間,警示資訊,聯絡了誰,以及簡訊是否發送成功。
2、資料庫mydata2中有個contact表,表中記錄格式如下:
- +-----------+------------------+------+-----
- id 12345
- phone 136123456789
- contact_name 張三
- +-----------+------------------+------+-----
這個表記錄有電話號碼的所屬營運人員。
實現需要實現的是,統計出各個服務在1月份各發送了多少簡訊給相關營運人員。
一個服務,在警示的時候,可能有多個連絡人,在警示的時候,它需要傳送簡訊去警示,每個連絡人都需要發送一次簡訊。所以我的工作是,統計出這個服務在1月份這個時間段裡,發送給它各個連絡人的簡訊次數有多少次。成功的次數,失敗的次數。
樣本如下:
- "服務名 日期 營運人員 成功次數 失敗次數
- check_category 2012-1-1 0:05:06 張三:187********* 739 11
- check_category 2012-1-1 0:05:08 李四:186********* 750 2
- check_update 2012-1-1 0:05:23 馬六:151********* 538 17
- check_update 2012-1-1 0:05:23 張三:187********* 539 16
- www.blo-httpd 2012-1-1 0:06:56 老五:135********* 6 0
- www.blo-httpd 2012-1-1 0:09:56 老五:135********* 9 1
check_category服務在1月份 成功發送給張三 739次簡訊,失敗11次。
check_update服務在1月份 成功發送給馬六 538次簡訊,失敗17次。
實現代碼如下:
- #!/usr/bin/perl -w
-
- use strict;
- use DBI;
-
-
-
- open (OUTFILE,">>outfile");
-
- #串連資料庫
- my $dbh = DBI->connect("DBI:mysql:database=mydata1;host=localhost", "root", "123456", {'RaiseError' => 1});
- my $dbh_contact_name = DBI->connect("DBI:mysql:database=mydata2;host=localhost","root","123456",{'RaiseError' => 1});
-
- # 取得1月份所有的服務名
- my $sth = $dbh->prepare("select service from data_info where SUBSTRING(send_time,1,7)='2012-01' group by service order by send_time ");
-
- #設定格式,否則perl取出的資料會亂碼
- $dbh->do("SET NAMES 'utf8'");
- $dbh_contact_name->do("SET NAMES 'utf8'");
- $sth->execute();
-
- # 輸出 模式為:
- print OUTFILE ("服務名\t\t\t\t\t\t\t 日期\t\t\t\t\t 營運人員 \t\t\t\t\t 成功次數\t\t失敗次數\t\n");
-
- #從資料庫中取出資料並儲存到檔案中
-
- while(my $service_name = $sth->fetchrow_array()) {
-
- my @rows = (); #儲存從資料庫中取得的資料
-
-
- #統計每個服務發送的資訊的次數,分別為成功發送的次數和失敗次數
-
- my $service_sms = $dbh->prepare("select service,send_time,number,count(*) from sms_info where SUBSTRING(send_time,1,7)='2012-01' and service='$service_name' and is_send='y' group by number order by send_time ;") ;
- $service_sms->execute();
-
-
- #獲得每一個服務發送資訊的總次數
- #取出電話號碼,用於在mydata2資料庫中尋找相關人名
-
- my $total = $dbh->prepare("select COUNT(*) from sms_info where SUBSTRING(send_time,1,7)='2012-01' and service='$service_name' group by number order by send_time ") ;
- $total->execute();
-
- while(($rows[0],$rows[1],$rows[2],$rows[3]) = $service_sms->fetchrow_array()){
- $rows[4] = $total->fetchrow_array() - $rows[3];
- my $contact_name = $dbh_contact_name->prepare("select contact_name from contact where phone=$rows[2]");
- $contact_name->execute();
-
- $rows[5] = $contact_name->fetchrow_array();
-
- print OUTFILE " $rows[0] \t $rows[1] \t $rows[5]:$rows[2] \t $rows[3]\t $rows[4]\n";
- }
- }
- close(OUTFILE);
-
- $dbh->disconnect();
- $dbh_contact_name->disconnect();