① 怎麼寫一個腳本檢查oracle資料庫表空間,如果利用率超過80%,就執行一條加表空間的sql
您好
SELECT UPPER(F.TABLESPACE_NAME) "表空間名",
D.TOT_GROOTTE_MB "表空間大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
F.TOTAL_BYTES "空閑空間(M)",
F.MAX_BYTES "最大塊(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1;
② 你用什麼方法檢查PHP腳本的執行效率(通常是腳本執行時間)和資料庫SQL的效率(通常是資料庫Query時間),
一般是在你要檢查的代碼開頭記錄一個時間,結尾記錄一個時間。取差值
但這個時間一般來說都很快,在一秒以內,所以不能直接用mktime(),我給你個我寫的函數
function getmicrotime(){
list($usec,$sec) = explode(" ",microtime());
$num = ((float)$usec+(float)$sec);
return sprintf("%.4f",$num);
}
用法:
$t_start = getmicrotime();
//這里放你要檢查的代碼
$t_end = getmicrotime();
echo $t_end - $t_start;
輸出的單位是秒,"%.4f"代表精確到小數點後四位,這個可以自行更改
③ 請教:mysql 運行一段時間後速度變慢問題
我們先來看第一個階段,MySQL慢的診斷思路,一般我們會從三個方向來做:
第一個方向是MySQL內部的觀測
第二個方向是外部資源的觀測
第三個方向是外部需求的改造
1.1 MySQL 內部觀測
我們來看MySQL內部的觀測,常用的觀測手段是這樣的,從上往下看,第一部分是Processlist,看一下哪個SQL壓力不太正常,第二步是explain,解釋一下它的執行計劃,第三步我們要做Profilling,如果這個SQL能再執行一次的話, 就做一個Profilling,然後高級的DBA會直接動用performance_schema ,MySQL 5.7 以後直接動用sys_schema,sys_schema是一個視圖,裡面有便捷的各類信息,幫助大家來診斷性能。再高級一點,我們會動用innodb_metrics進行一個對引擎的診斷。
除了這些手段以外,大家還提出了一些亂七八糟的手段,我就不列在這了,這些是常規的一個MySQL的內部的狀態觀測的思路。除了這些以外,MySQL還陸陸續續提供了一些暴露自己狀態的方案,但是這些方案並沒有在實踐中形成套路,原因是學習成本比較高。
1.2 外部資源觀測
外部資源觀測這部分,我引用了一篇文章,這篇文章的二維碼我貼在上面了。這篇文章是國外的一個神寫的,標題是:60秒的快速巡檢,我們來看一下它在60秒之內對伺服器到底做了一個什麼樣的巡檢。一共十條命令,這是前五條,我們一條一條來看。
1.uptime,uptime告訴我們這個機器活了多久,以及它的平均的負載是多少。
2.dmesg -T | tail,告訴我們系統日誌里邊有沒有什麼報錯。
3.vmstat 1,告訴我們虛擬內存的狀態,頁的換進換出有沒有問題,swap有沒有使用。
4. mpstat -P ALL,告訴我們CPU壓力在各個核上是不是均勻的。
5.pidstat 1,告訴我們各個進程的對資源的佔用大概是什麼樣子。
我們來看一下後五條:
首先是iostat-xz 1,查看IO的問題,然後是free-m內存使用率,之後兩個sar,按設備網卡設備的維度,看一下網路的消耗狀態,以及總體看TCP的使用率和錯誤率是多少。最後一條命令top,看一下大概的進程和線程的問題。
這個就是對於外部資源的診斷,這十條命令揭示了應該去診斷哪些外部資源。
1.3 外部需求改造
第三個診斷思路是外部的需求改造,我在這里引用了一篇文檔,這篇文檔是MySQL的官方文檔中的一章,這一章叫Examples of Common Queries,文檔中介紹了常規的SQL怎麼寫, 給出了一些例子。文章的鏈接二維碼在slide上。
我們來看一下它其中提到的一個例子。
它做的事情是從一個表裡邊去選取,這張表有三列,article、dealer、price,選取每個作者的最貴的商品列在結果集中,這是它的最原始的SQL,非常符合業務的寫法,但是它是個關聯子查詢。
關聯子查詢成本是很貴的,所以上面的文檔會教你快速地把它轉成一個非關聯子查詢,大家可以看到中間的子查詢和外邊的查詢之間是沒有關聯性的。
第三步,會教大家直接把子查詢拿掉,然後轉成這樣一個SQL,這個就叫業務改造,前後三個SQL的成本都不一樣,把關聯子查詢拆掉的成本,拆掉以後SQL會跑得非常好,但這個SQL已經不能良好表義了,只有在診斷到SQL成本比較高的情況下才建議大家使用這種方式。
為什麼它能夠把一個關聯子查詢拆掉呢?
這背後的原理是關系代數,所有的SQL都可以被表達成等價的關系代數式,關系代數式之間有等價關系,這個等價關系通過變換可以把關聯子查詢拆掉。
上面的這篇文檔是一個大學的教材,它從頭教了關於代數和SQL之間的關系。然後一步步推導怎麼去簡化這句SQL。
第一,MySQL本身提供了很多命令來觀察MySQL自身的各類狀態,大家從上往下檢一般能檢到SQL的問題或者伺服器的問題。
第二,從伺服器的角度,我們從巡檢的腳本角度入手,伺服器的資源就這幾種,觀測手法也就那麼幾種,我們把伺服器的資源全部都觀察一圈就可以了。
第三,如果實在搞不定,需求方一定要按照資料庫容易接受的方式去寫SQL,這個成本會下降的非常快,這個是常規的MySQL慢的診斷思路。
④ 如何檢查mysql從資料庫是否正常運行,腳本
一般在從庫執行show slave status,看behind值是否為0來判斷。
更准確的一些的方法是在主庫做一個表,每秒insert一個時間戳,在從庫讀取,來看時間差是否超過1秒。
⑤ qtp 怎樣添加資料庫檢查點(轉)
將來在運行腳本的過程中,QTP又根據查詢語句從當前的資料庫中獲取實際數據,然後將實際數據與預期數據相比較,從而得知檢查點是否成功。 2.修改查詢結果 檢查點語句生成以後,會產生一個DbTable對象,該對象在關鍵字視圖可以看到,在倉庫中也存在。可以通過設置該DBtable對象的object properties屬性「Source」來修改SQL語句。修改了SQL語句就表示修改了查詢結果。修改了SQL語句後,不能相應的修改預期數據表。 3.如何理解檢查點的屬性(checkpoint properties) 上面的表是創建檢查點時截取的。(無論什麼時候打開本屬性窗口, 表中的數據都不會改變,但可以通過窗口中的「Configure value->Constant」來手工修改表中的數據,通過這種方式修改了數據後,就相當於對截圖進行了修改。如果通過「Configure value->Parameter」來將單元格的數據參數化,雖然看起來是數據被修改,但是如果再選擇Constant,數據就會恢復,因此通過參數化數據的方法,不會真正影響截圖的數據。) 4.指定要檢查的區域 在表中指定想要檢查的區域。(區域中的顯示的值就是預期值。預期值可以是常數,也可以是參數變數。當在Cell Identification頁中設置列by position時,本表的列必須與實際查詢表的列相對應,否則檢查不能通過。如在生成檢查點語名時查詢語句為「select username,id,realname from sys_user t」,後來通過修改object properties,將查詢語句改為「select username,realname,id from sys_user t」,則執行檢查時是不能通過的,因為查詢表中第2、3列的數據已經不能與截取的表相對應。同理,如果在Cell Identification頁中設置行by rownumber時,也會有同樣的問題存在。) 以下是屬性框三個頁簽中的內容: (1)Expected Data—設置預期值,可以是常量或參數。如,可以要求QTP從DAta table中取值作為預期值。 (2)Settings—設置預期值與實際值相比較時的語法規則。 (3)Cell Identification—指導QTP放置被檢查的數據。如,假設你想檢查位於檢查點屬性框中第一行第2列的數據,但是你明白,每運行一次測試腳本,查詢出來的數據的行的排序可能發生改變。因此,讓QTP通過列名和行row containing a known value in akey column來定位單元格,而不是通過列數或行數來定位單元格。 5.檢查點屬性窗: Checkpoint timeout—指定檢查點運行的最長時限,QTP在檢查點通過(在本時間范圍內)或超時後,才進行下一步操作。如果在最長時限時還沒有檢查通過,則本檢查失敗。 例如,檢查點裝載數據需要一定的時間,增長checkpoint timeout時間,可保證檢查點有足夠的時間通過檢查,不會超時失敗。 注:Checkpoint timeout選項僅僅對table檢查點有效,對於database檢查點無效。 Insert statement—在新增檢查點時,指明檢查點語句在腳本中的插入位置。 注意:Insert statement選項在錄制或修改檢查點時無效,只在新增檢查點時有效。 注意:當一列是key column時,該列不一定是被檢查的列,key column的數據僅用來幫助確定被檢查的數據行。 6.指定數據的比較規則 默認情況下,認為真實數據單元是字元串型,並進行精確檢查,但是忽略空格。 (1)Verification type (2)Exact match 默認。 精確匹配。選中此項,則進行精確匹配;不選中,則只要預期值包含在真實值之中即可。 注意:只有當Verirication type為String Content時,才顯示這個選項。 (3)Ignore space 默認。在比較時忽略單元格中的空格。添加或減少空格不會影響檢查結果。 注意:只有當Verirication type為String Content時,才顯示這個選項。 (4)Match case 區分字母的大小寫。 注意:只有當Verirication type為String Content時,才顯示這個選項。 (5)Min / Max Cell Identification頁簽包括以下選項: (1)Identify columns 指定將與預期數據相比較的實際數據單元在實際數據表中的列位置。 By position—根據列的順序位置來定位(即預期數據表中的第N列對應實際數據表中的第N列)。如果列位置產生位移,就會導致不匹配。本選項一般用於Table檢查點。 By column name—根據列名來定位(即預期數據表中的列名對應實際數據表中的列名)。列的位移不對檢查點產生影響。一般用於database檢查點,對於Table檢查點無效。 (2)Identify rows 指定將與預期數據相比較的實際數據單元在實際數據表中的行位置。 By row number—默認。根據行的順序位置來定位(即預期數據表中的第N行對應實際數據表中的第N行)。如果行發生位移,就會導致不匹配。 By selected key column(s)—選中此項以後,可以設置關鍵列,關鍵列列名旁有一個「鑰」標記。在定位行時,到實際數據表的關鍵列中查找與預期數據表關鍵列的值相匹配的值,所找到的第1個匹配值則是正確的行。行的順序位移不影響檢查結果。如果資料庫中有多行同時滿足條件,則QTP只檢查第1條記錄。關鍵值可以是多個列的聯合值。 在對關鍵列進行匹配時,使用Setting頁簽的verification type選項中設置的匹配規則。 註:只有當選中了By selected key column(s)選項時,本選項才有效。 當選擇by row number時,屬性窗中預期值所在的行數,應該與真實數據所在的行數相同,否則匹配失敗。因此行移位都會導致檢查失敗。 當選擇by selected key column(s)時,屬性窗口中預期值可以在任意行位置。執行檢查時,以該行Key column列的值為條件在資料庫中進行篩選,如果選出了符合條件的記錄,則將該記錄與預期值進行比較,如果記錄數據全部匹配,則檢查通過。(當有多個Key Column列時,則篩選條件為這些列的數據的聯合)。 要注意幾個問題: (1) 只有被打勾的數據才被檢查,其它沒打勾的即使不匹配也沒關系。 (2) Key column列的數據如果沒有打勾,也不會被檢查,它只是提供查詢條件。 (3) 屬性窗口數據表中的數據本身就是默認預期數據,當然用戶可以對這些預期數據進行修改。 (4) 在屬性窗口數據表中的數據是相對固定的,除非用戶在本屬性窗口中特殊別進行了修改。 (5) 本屬性窗口數據表中的所看到的數據都是預期數據,真實數據表是看不到的。真實數據表在每次執行腳本時都有可能不同。 (6) 在運行結果(result)中,如果檢查失敗,則可點擊「checkpoint 『表名』」看到檢查結果表。雙擊表中的單元格,彈出窗口顯示該單元格的預期值與真實值。當然,本結果表中顯示的仍然是預期值。 (7) 如果在屬性窗口的數據表中設置了一個檢查點數據,但是資料庫中有多條滿足條件的數據,則只檢查第一條滿足條件的數據,如果第1條檢查完全匹配,則通過,如果不匹配,則失敗。 (8) 如果在屬性窗口的數據表中設置了多個相同的檢查點數據,但資料庫中只有一條滿足條件的數據,該條數據只與第1個檢查點進行匹配檢查。其它幾個檢查點失敗。
⑥ 檢查mysql資料庫是否存在壞表
[代碼] [Shell/批處理]代碼#!/bin/bash #此腳本的主要用途是檢測mysql伺服器上所有的db或者單獨db中的壞表 #變數說明 pass mysql賬戶口令 name mysql賬號名稱 data_path mysql目錄路徑 directory_list 目錄列表 file_list文件列表 db_name 資料庫名稱 repair_count單庫中待修復的表總數 #變數說明 repair_count_all所有庫中待修復的表總數 mysql_version mysql版本 _file_name 數據表名稱 echo -e "此腳本的主要用途是檢測mysql伺服器上所有的資料庫或者單獨資料庫中的壞表\n\n" pass=123456 name=root read -p "輸入mysql存儲路徑: " choose data_path=$choose unset choose read -p "請輸入mysql命令路徑: " mysql_version #標准輸入、標准輸出、標准錯誤輸出的文件標示符 由 0、1、2標識 read -p "請選擇是檢查伺服器上所有資料庫還是指定的資料庫 1:檢查全部資料庫 2:只檢查指定資料庫: " choose if [ $choose == 1 ]; then cd $data_path for directory_list in $(ls) do if [ -d $directory_list ];then if [ "mysql" != "${directory_list}" -a "test" != "${directory_list}" ];then cd ${directory_list} echo "當前檢查資料庫為:"${directory_list} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" >> /tmp/check_table_all.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${directory_list}.${_file_name} 2>&1 >> /tmp/check_table_all.log done cd .. fi fi done cat /tmp/check_table_all.log | grep "Table is marked as crashed" > /tmp/check_table_repair.log repair_count_all=` awk 'END{print NR}' /tmp/check_table_repair.log ` echo -e "所有資料庫用有${repair_count_all}張表需要修復!" more /tmp/check_table_repair.log else read -p "請輸入要檢查的資料庫名稱: " db_name cd ${data_path}/${db_name} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" >> /tmp/check_${db_name}.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${db_name}.$_file_name 2>&1 >> /tmp/check_${db_name}.log done cat /tmp/check_${db_name}.log | grep "Table is marked as crashed" > /tmp/check_${db_name}_Repair.log repair_count=`awk 'END{print NR}' /tmp/check_${db_name}_Repair.log` echo -e "${db_name}中共有${repair_count}個表需要修復!\n " more /tmp/check_${db_name}_Repair.log fi
⑦ 怎麼查看mysql資料庫中的表是否損壞
可以使用語句檢查表。如果結果的msg_text部分是好的,那麼你的表是健康的。反之,則表明mysql資料庫中的表有損壞。另外有些厲害的高手一額可以通過運行腳本來檢測。
MyISAM表可以採用以下方法進行修復:使用reapair table或myisamchk來修復。如果修復無效,採用備份恢復表。
階段1:檢查你的表
如果你有很多時間,運行myisamchk *.MYI或myisamchk -e *.MYI。使用-s(沉默)選項禁止不必要的信息。如果mysqld伺服器處於宕機狀態,應使用--update-state選項來告訴myisamchk將表標記為'檢查過的'。
你必須只修復那些myisamchk報告有錯誤的表。對這樣的表,繼續到階段2。如果在檢查時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。
階段2:簡單安全的修復
注釋:如果想更快地進行修復,當運行myisamchk時,你應將sort_buffer_size和Key_buffer_size變數的值設置為可用內存的大約25%。
首先,試試myisamchk -r -q tbl_name(-r -q意味著「快速恢復模式」)。這將試圖不接觸數據文件來修復索引文件。如果數據文件包含它應有的一切內容和指向數據文件內正確地點的刪除連接,這應該管用並且表可被修復。開始修復下一張表。否則,執行下列過程:
在繼續前對數據文件進行備份。使用myisamchk -r tbl_name(-r意味著「恢復模式」)。這將從數據文件中刪除不正確的記錄和已被刪除的記錄並重建索引文件。
如果前面的步驟失敗,使用myisamchk --safe-recover tbl_name。安全恢復模式使用一個老的恢復方法,處理常規恢復模式不行的少數情況(但是更慢)。如果在修復時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。
階段3:困難的修復
只有在索引文件的第一個16K塊被破壞,或包含不正確的信息,或如果索引文件丟失,你才應該到這個階段。在這種情況下,需要創建一個新的索引文件。按如下步驟操做:
把數據文件移到安全的地方。使用表描述文件創建新的(空)數據文件和索引文件:
shell> mysql db_name
mysql> SET AUTOCOMMIT=1;
mysql> TRUNCATE TABLE tbl_name;
mysql> quit
如果你的MySQL版本沒有TRUNCATE TABLE,則使用DELETE FROM tbl_name。將老的數據文件拷貝到新創建的數據文件之中。回到階段2。現在myisamchk -r -q應該工作了。你還可以使用REPAIR TABLE tbl_name USE_FRM,將自動執行整個程序。
階段4:非常困難的修復
只有.frm描述文件也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被創建以後,描述文件就不再改變了。
從一個備份恢復描述文件然後回到階段3。你也可以恢復索引文件然後回到階段2。對後者,你應該用myisamchk -r啟動。
如果你沒有進行備份但是確切地知道表是怎樣創建的,在另一個資料庫中創建表的一個拷貝。刪除新的數據文件,然後從其他資料庫將描述文件和索引文件移到破壞的資料庫中。這樣提供了新的描述和索引文件,但是讓.MYD數據文件獨自留下來了。回到階段2並且嘗試重建索引文件。
⑧ 如何通過shell腳本來檢查或監控MYSQL資料庫
db2 connect to [dbname] db2 "select min(a) from b;" > t.txtdb2 terminatedate=`cat t.txt | tail -2 | head -1` echo $date
⑨ MCGS組態軟體腳本編程,實時資料庫已經定義了數據對象,檢查卻通不過!
是你用錯了,op.Value是字元串,字元串比較!strComp函數
望採納。。。。
⑩ 需要檢查頁面查詢的結果和資料庫結果是否一致 怎麼用python自動化寫一個腳本
#!/usr/bin/env python import sys str = True while (str): dig = int(input()) if dig > 100: print 'please input mun between 0~100' elif dig >= 90: print 'A' elif dig >= 80: print 'B' elif dig >= 70: print 'C' elif dig >= 60: prin...