【應用 業務】做資料庫技術支援的一點感悟

楊奇龍發表於2010-09-19

想不出什麼好標題,也不想做什麼標題黨。說說今天工作中遇到的問題吧!先總結一句:瞭解應用的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    AND a.vbillstatus= 1

SELECT
    a.pk_equipdaliy, a.vbillstatus
FROM
    ycam_equipdaliy a
WHERE
    -- AND COALESCE (dr, 0) = 0
   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.撰寫系統架構、現狀、調整備忘錄
根據對資料庫的研究和了解,不斷記錄資料庫的狀況,撰寫資料庫架構、現狀及調整備忘錄,不放過任何可能的最佳化與改進的機會。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-674412/,如需轉載,請註明出處,否則將追究法律責任。

相關文章