天天看點

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

想不出什麼好标題,也不想做什麼标題黨。說說今天工作中遇到的問題吧!先總結一句:了解應用的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.撰寫系統架構、現狀、調整備忘錄

根據對資料庫的研究和了解,不斷記錄資料庫的狀況,撰寫資料庫架構、現狀及調整備忘錄,不放過任何可能的優化與改進的機會。