想不出什麼好标題,也不想做什麼标題黨。說說今天工作中遇到的問題吧!先總結一句:了解應用的dba才是一名合格的dba!
開發人員要求解決一條sql 語句問題。即過濾自身,比如
id
1
2
3
4
點id=1的那行,顯示id in (2,3,4)的就對了
起初以為很簡單,寫了一條大緻如下:
select * from t where not exists
(select 1 from t t1 where t1.id=:id
and t.id=t1.id)
這個是測試的語句,一個是笛卡爾乘積,一個是關聯查詢。嚴格的說要有性能上的考量().
select
a.pk_equipdaliy,a.vbillstatus
from
ycam_equipdaliy a ,
ycam_equipdaliy b
where
b.vbillstatus = 1
-- and coalesce (dr, 0) = 0
--and a.pk_equipdaliy!=b.pk_equipdaliy
and a.pk_equipdaliy<b></b>
and a.vbillstatus= 1.pk_equipdaliy
a.pk_equipdaliy, a.vbillstatus
ycam_equipdaliy a
a.pk_equipdaliy in
(
select
b.pk_equipdaliy
from
ycam_equipdaliy b
where
b.vbillstatus = 1
and a.pk_equipdaliy !=b.pk_equipdaliy
)
and a.vbillstatus = 1
兩條在資料庫裡面跑時,都能得到正确的結果,但是當寫到應用層,由java代碼調用時,結果卻一直報錯。
判斷sql本身沒有問題,在開發執行調試狀态時,同時在執行上述sql 語句時,發現表被鎖住了。于是一步一步調試,調試到執行sql擷取結果集時,問題出現了,sql語句所查詢的表的一個字段 vbillstatus被修改由原來的3變為1。導緻執行上述sql時,資料一緻性遭到了破壞。于是梳理業務應用和業務邏輯。底層的代碼的确在 “稽核” 這一步,就把字段值修改了!最後隻能通過應用程式而不是sql語句來解決問題。
總結一下:今天花了半天的時間來處理這個問題,最終解決了!對于資料庫技術上沒有什麼收獲,但是感悟是:作為一個行業軟體的服務供應商的資料庫技術支援,一定要了解應用,了解業務流程。這樣才能準确而快速的定位問題的所在,進而更快的解決資料庫問題。
附上蓋國強大師對dba 七點建議:
1.實時監控資料庫告警日志
這是必須進行的工作,并且應該根據不同的嚴重級别,發送不同級别的告警,及時了解資料庫的變化與告警。
2.實時監控資料庫的重要統計資訊
實施監控對于資料庫運作至關重要、能夠表征資料庫重要變化的統計資訊,并且據此發送報警資訊。那麼應當監控哪些統計資訊呢?大家可以思考一下,對于單機、rac環境各不相同。
3.部署自動的statspack/awr報告生成機制
每天檢查前日的awr報告,熟悉資料庫的運作狀況,做到對于資料庫了如指掌
4.每天至少優化和熟悉一個top sql
根據awr或statspack報告,每天至少了解或熟悉一個top sql,能優化的要提出優化和調整建議
5.部署完善的監控和資料采樣系統
dba應該對資料庫部署完善的監控系統,并對重要資訊進行采樣,能夠實時或定期生成資料庫重要名額的曲線圖,展現資料庫的運作趨勢。
6.全面深入的了解應用架構
不了解應用的dba是沒有前途的dba,對應用了解不深入的dba算不上expert,是以一定要深入了解應用。
7.撰寫系統架構、現狀、調整備忘錄
根據對資料庫的研究和了解,不斷記錄資料庫的狀況,撰寫資料庫架構、現狀及調整備忘錄,不放過任何可能的優化與改進的機會。