ORACLE:使用tcpdump 監控客戶端發過來的所有SQL語句
思路:
第一步:捉取1521埠的接收到的資料包;
直接捉取的命令如下: tcpdump -ttAvennSs 0 -i em1 src 10.50.xxx.xxx and dst port 1521
第二步:使用python 解析資料包中的SQL語句,並儲存到檔案裡
第三步: 配置crontab 定期執行包含tcpdump 的shell,並定期使用tcp.py解析資料庫包
實現步驟與指令碼:
(1) 建立python 指令碼tcp.py,用於處理捉取到資料包,提取客戶端發過來的SQL。
(2)捉取1521埠接收到的資料庫,並呼叫tcp.py 提取資料包中的SQL語句。
shell指令碼名稱 tcp1521.sh ,程式碼如下:
(3) 配置crontab,定期執行tcp521.sh
必須要定期執行,否則資料包檔案會過大,容易撐爆磁碟空間。
#tcpdump sql
00 */2 * * * root /home/oracle/script/tcpdumpsql/tcp1521.sh >/dev/null 2>&1
第一步:捉取1521埠的接收到的資料包;
直接捉取的命令如下: tcpdump -ttAvennSs 0 -i em1 src 10.50.xxx.xxx and dst port 1521
第二步:使用python 解析資料包中的SQL語句,並儲存到檔案裡
第三步: 配置crontab 定期執行包含tcpdump 的shell,並定期使用tcp.py解析資料庫包
實現步驟與指令碼:
(1) 建立python 指令碼tcp.py,用於處理捉取到資料包,提取客戶端發過來的SQL。
點選(此處)摺疊或開啟
-
#!/usr/bin/python
-
# -*- coding: UTF-8 -*-
-
# tcpdump -ttAvennSs 0 -i em1 src 10.50.xxx.xxx and dst port 1521
-
# 需要兩個輸入引數 :
-
# 第一個引數 -- tcpdump 捉取到的SQL資料包檔案及路徑
-
# 第二個引數 -- 存放SQL語句的檔名及路徑
-
# 使用例項:python tcp.py /root/temp.data /root/sql.txt
-
import sys
-
-
def find_sql(p_str):
-
vstr = p_str.upper()
-
if vstr.find('SELECT ') > 0:
-
vsqltext = p_str[vstr.find('SELECT '):].strip().strip('.')
-
elif vstr.find('AUTH_') > 0 and vstr.find('AUTH_ALTER_SESSION') == -1 and vstr.find('AUTH_SESSKEY') == -1:
-
vsqltext = p_str[vstr.find('AUTH_')-20:].strip().strip('.')
-
#print vsqltext[0:vsqltext.find('.')].strip("'")
-
elif vstr.find('UPDATE ') > 0:
-
vsqltext = p_str[vstr.find('UPDATE '):].strip().strip('.')
-
elif vstr.find('DELETE ') > 0:
-
vsqltext = p_str[vstr.find('DELETE '):].strip().strip('.')
-
elif vstr.find('CREATE ') > 0:
-
vsqltext = p_str[vstr.find('CREATE '):].strip().strip('.')
-
elif vstr.find('ALTER ') > 0 and p_str.find('from Oracl1e Corporation. Copyright 2003 Oracle Corporation') == -1:
-
vsqltext = p_str[vstr.find('ALTER '):].strip().strip('.')
-
elif vstr.find('BEGIN') > 0:
-
vsqltext = p_str[vstr.find('BEGIN'):].strip().strip('.')
-
elif vstr.find('WITH ') > 0:
-
vsqltext = p_str[vstr.find('WITH '):].strip().strip('.')
-
elif vstr.find('DROP ') > 0:
-
vsqltext = p_str[vstr.find('DROP '):].strip().strip('.')
-
elif vstr.find('CALL ') > 0:
-
vsqltext = p_str[vstr.find('CALL '):].strip().strip('.')
-
else:
-
return '0'
-
return vsqltext
-
-
if __name__ == '__main__':
-
strlist1 = []
-
strlist2 = []
-
str = ''
-
v_pkg_two = 0
-
filestr = sys.argv[1]
-
v_sqlfilestr = sys.argv[2]
-
#print sys.argv[1]
-
#print sys.argv[2]
-
if filestr == '':
-
print 'please input tcp data filename'
-
exit
-
if v_sqlfilestr == '':
-
print 'please input filename that is use to save tcp sql!'
-
exit
-
fow = open(v_sqlfilestr, 'a')
-
#開啟檔案
-
fo = open(filestr,'r')
-
for line in fo:
-
# 檔案行是否包含'ethertype IPv4',如果包含則為包的第一行
-
is_pkg_begin = line.find('ethertype IPv4')
-
# 判斷是否為包的第一行
-
if is_pkg_begin > 0:
-
# 列印包資訊,首次執行不列印
-
if len(strlist1) > 0:
-
vmac_ip = strlist1[0] + ' ' + strlist1[1] +' ' + strlist2[0] + ' ' + strlist2[2][0:-1]
-
vsql = find_sql(str)
-
if vsql <> '0':
-
fow.writelines('\n' + vmac_ip + '\n' + vsql)
-
#print vsql
-
#break
-
str = ''
-
# next
-
strlist1 = line.split(' ')
-
#將要讀取的檔案下一行為包的第二行
-
v_pkg_two = 1
-
#判斷是否為包的第二行
-
elif v_pkg_two == 1:
-
# 重置第二行識別符號
-
v_pkg_two = 0
-
#去掉左邊的空格
-
strlist2 = line.lstrip().split(' ')
-
else:
-
# 每個包可能有多行資料,需要組合起來
-
str = str + line
-
# 關閉開啟的檔案
-
fo.close
- fow.close( )
(2)捉取1521埠接收到的資料庫,並呼叫tcp.py 提取資料包中的SQL語句。
shell指令碼名稱 tcp1521.sh ,程式碼如下:
點選(此處)摺疊或開啟
- #!/bin/bash
- # tcpdump -ttAvennSs 0 -i bond0 dst port 1521 > /dev/shm/tcpdata/tcpdata1521.data
- vdate=`date +%Y%m%d`
- vsqlfile=/home/oracle/script/tcpdumpsql/tcp_sql_${vdate}.txt
- vpythonscript=/home/oracle/script/tcpdumpsql/tcp.py
- #獲取日期
- vdatetime=`date +%Y%m%d%H%M%S`
- #捉取到的資料包的存放目錄,定期從srcfile遷移到dstfile
- vfilepath='/dev/shm/tcpdata/data'
- vfilepath1='/dev/shm/tcpdata'
- dstfile=${vfilepath}/tcp${vdatetime}
- srcfile=${vfilepath1}/tcp1521.data
- cd /dev/shm
- mkdir -p $vfilepath
- if [ ! -d $vfilepath ]; then
- echo "$vfilepath not a path"
- exit
- fi
- #if [ ! -f $srcfile ]; then
- # echo "$srcfile not exists"
- # exit
- #fi
- # 從srcfile遷移到dstfile
- mv ${srcfile} ${dstfile}
- # 結束tcpdump 程式(如果不結束,沒辦法遷移檔案)
- killall tcpdump
- # 開啟新的tcpdump 程式
- tcpdump -ttAvennSs 0 -i em1 dst port 1521 > ${srcfile} &
- # 查詢捉取到的資料包檔案,並遍歷使用tcp.py 解析資料包
- filelist=`ls $vfilepath|sort -k9`
- for file in $filelist
- do
- echo $vfilepath/$
- # 呼叫tcp.py 解析資料包,存放到$vsqlfile檔案裡
- /usr/bin/python $vpythonscript $vfilepath/$file $vsqlfile
- # 刪除已解析的資料包檔案
- rm -rf $vfilepath/$file
- done
(3) 配置crontab,定期執行tcp521.sh
必須要定期執行,否則資料包檔案會過大,容易撐爆磁碟空間。
#tcpdump sql
00 */2 * * * root /home/oracle/script/tcpdumpsql/tcp1521.sh >/dev/null 2>&1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10995764/viewspace-2124028/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle-監控sql語句的過載率OracleSQL
- Oracle使用審計監控使用者執行過的SQL語句OracleSQL
- Oracle 資料庫監控SQL語句Oracle資料庫SQL
- 監控oracle的觸發器語句(轉)Oracle觸發器
- 監控使用高cpu的sql語句指令碼SQL指令碼
- zabbix監控客戶端安裝客戶端
- Nagios for Aix監控客戶端iOSAI客戶端
- 監控database上的客戶端ip地址Database客戶端
- 「Oracle」客戶端 PL/SQL DEVELOPER 安裝使用Oracle客戶端SQLDeveloper
- Splunk新增LINUX客戶端新增監控Linux客戶端
- Oracle常用效能監控語句解析Oracle
- oracle監控資料泵匯入和匯出的sql語句OracleSQL
- Nagios 監控windows客戶端安裝教程iOSWindows客戶端
- oracle自定義過程來獲得完整的sql語句OracleSQL
- 如何使用Redshift客戶端工具SQL Workbench來連線Redshift客戶端SQL
- Oracle SQL 語句的執行過程OracleSQL
- 效能監控方面的一些SQL語句SQL
- mysql捕捉所有SQL語句MySql
- 不安裝Oracle客戶端也能使用PL/SQL instantclientOracle客戶端SQLclient
- (轉)oracle資料庫中所有外來鍵約束失效SQL語句Oracle資料庫SQL
- 免安裝Oracle客戶端使用Oracle客戶端
- 理解oracle執行sql語句的過程OracleSQL
- oracle的sql語句OracleSQL
- Oracle 10g RAC客戶端配置監聽Oracle 10g客戶端
- OPC客戶端開發過程整理客戶端
- 使用hint來調優sql語句SQL
- 監控 SQL Server 的執行狀況--常用檢測語句SQLServer
- oracle之PLSql語言(二)sql語句的使用OracleSQL
- Zookeeper之Curator(1)客戶端對節點的一些監控事件的api使用客戶端事件API
- oracle 通過sql profile為sql語句加hintOracleSQL
- Windows客戶端的JProfiler遠端監控Linux上的Tomcat伺服器Windows客戶端LinuxTomcat伺服器
- oracle sql語句OracleSQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- 跨平臺的 SQL 客戶端SQL客戶端
- MQTTJava客戶端的使用MQQTJava客戶端
- redis客戶端的使用Redis客戶端
- 通過java來格式化sql語句JavaSQL
- 透過java來格式化sql語句JavaSQL