f 一月 2020 ~ 迪貝之家

Microsoft SQL Server Log Shipping

SQL 7就有的技術,簡單的說就是資料庫複本資料同步的技術,而這份複本可以開放讀取的功能以分散營業資料庫的負載,也可純粹當成備援資料庫,不管是在本地還是異地。怎麼達成? 透過SQL Agent自動化排程進行備份、傳檔及復原等作業。

Oracle GolGateden

機房搬遷跨Site能即時同步資料庫利器

Nagios 資料庫維運自動化

一開始設計這架構時,就排除使用remote agent的想法因為在專業分工的組織下,要求安裝新軟體於既有系統是一件不太可行的方案,既然身為DBA就只能把資料庫instance當作是一個最大的agent 想辦法在資料庫內做到我想做的事情

This is default featured post 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured post 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

有點了解Opensource 這個領域

這兩天研究Nagios4 的nerd 功能
發覺有些問題,所以在github詢問
case 如連結
Nagios 4 query handler : nerd
我是依照官方的文件進行版本4.4.5安裝
雖然開了一個issue
但我也是主動去查看他們的社群
確實是有一篇提到解法
github的負責人也回覆了相同的解法
但是實測卻是有問題
我心裡想,該不會是4.4.5的bug吧
所以就往回測4.4.4
結果也不work
又想...這個功能我是在書上看到的
Learning Nagios 4
而且官方的New Feature上也有描述
應該確實是有這個功能
我就下載了github上最舊的版本4.3.3
一測...居然過了
所以我就把我的測試過程Po上
github負責人自己也做了測試
所以就發佈我提的問題是個bug
在4.4.0之後就發生了
他立馬就做了修改
我是昨天晚上11點多仔細看了一下他的回覆
他是要我抓下他從4.4.5分支出來的source進行test
測試之後,確實解決了
因為是我開的issue
所以我就把測試過程po上後
結了該case
結合之前測試AWS Dynamodb時
使用Opensource PAWS的經驗
也是在github上開了一個case
DynamoDB Marshaler #360
我在猜啦~~對Nagios這家公司來說
Core其實是一個平台
你不進行客製就沒功用
所以open了也沒差
反而像我這類人,有需求使用它的話
就是在幫他們進行功能測試
他們應該也很樂見你花時間做這些事情
這就是所謂的contribution
雙方都互利的一件事

總比有人吹牛畫大餅
去要了幾千萬建置大型軟體
連個屁也生不出一個

其實這就是決策面的問題了
你是要給員工高薪呢??
還是要被廠商當冤大頭
花了大錢後才抱怨push不動
好肥的一隻羊阿........

Ubuntu 16.04 安裝Instant Client、 sqlcmd 及psql


  • Oracle Instant Client 19.5 的安裝
Oracle沒出Ubuntu/Debian的Oracle Instant Client的deb安裝檔
只能下載相關的rpm檔後,再透過alien工具來安裝
client rpm 的載點
怎麼安裝?
Ubuntu這家公司有提供步驟
照著做應該沒甚麼問題
我的環境就是參考它的步驟安裝的
只碰到過一個問題
就是tnsnames.ora似乎沒辦法被參考到
另外我的oratop是從一個18c的營運環境抓下來的
所以執行它的時候
會出現找不到18c的share library
只要在lib的目錄裡
手動將錯誤裡的library名稱
建出一個soft link指向真正的library名稱
就可以解決了
看一下lib目錄的其它soft link指向
就能知道是哪一個library了


  • 安裝sqlcmd
這在微軟擁抱了Linux之後
在幾個常用的linux distribution
微軟移植sqlcmd就是正常的了
它也給了很詳盡的步驟


  • 安裝psql 
這就更簡單了,網路上隨便google一下
就會有答案了
apt-get install -y postgresql-client

我的資料庫維運自動化

Nagios Core

一開始設計這架構時,就排除使用remote agent的想法


因為在專業分工的組織下,要求安裝新軟體於既有系統


是一件不太可行的方案,既然身為DBA


就只能把資料庫instance當作是一個最大的agent


想辦法在資料庫內做到我想做的事情


即使Nagios Core 本身就有NSCA或NPRE等
甚或整合SNMP


我也一律不考慮使用


如果在資料庫session內做不到


就透過Nagios plugin check_by_ssh


來透過ssh 連線到target主機執行我要執行的指令

與其說Ngaios是個監控系統
不如說我是把它拿來幫我執行日常檢核作業自動化軟體


DB Genres 監控項目 解說
Postgres query over threshold current_timestamp - pg_stat_activity.query_start
WAIT QUERY pg_stat_activitywaiting
connection count count pg_stat_activity
wrap transaction id 200000000 - age(pg_database.datfrozenxid)
Disk Usage check_by_ssh plugin call remote script
Log Check check_by_ssh plugin call remote pgbadger
MSSQL Idle Session With Open TXN sys.dm_exec_sessions, sys.dm_tran_session_transactions超過5天的idle session,但仍帶有open transaction
DBDSKSPACE CHECK MASTER..xp_fixeddrives資料檔所在的磁碟槽位小於5GB
FGSPACE CHECK sys.filegroups, sys.database_filesFILE GROUP 使用率監控 使用率>80% and 可用空間<10G
LOG CHECK master.dbo.xp_readerrorlog掃描偵測系統紀錄是否有Failed、Error等字串
Password Expired CHECK LOGINPROPERTY(sys.sql_logins.name,'DaysUntilExpiration') 密碼到期日 < 6天
query over threshold sys.dm_exec_requests,sys.databasesover 10mins
Transaction ReplicationLogReader Latency master.dbo.sp_replcounters
Transaction Replication Dist to sub Latencyd dbo.sp_replmonitorsubscriptionpendingcmds
Oracle Tablespace Check dba_free_space,dba_data_filesFILE GROUP 使用率監控 使用率>80% and 可用空間<10G
ASM DiskGroup Usage check_by_ssh plugin call remote script
query over threshold expect , oratop -bn1
Disk Usage check_by_ssh plugin call remote script
Log Check check_by_ssh plugin call remote tfactl analyze or adrci
RAC CRS or HAS Status check_by_ssh plugin call remote crsctl command

Shell Variable Scope

我在寫Nagios的plugin,跑一個while loop
但是有個變數(output)就是塞不進去
shell loop variable scope
透過+x 去查看執行狀況
variable scope
明明就有assign 值阿????
怪了~~怎麼跳出loop 後就變成NULL
想起兩年半前剛來這裡的時候
寫script的時候,也碰到同樣問題
只是當時東西很多
我就直接寫到檔案,再去讀檔
但這次不行,得找出原因來
還好今天找到了
底下這兩段話,寫得夠清楚了
pipe sub-shell
 pipe sub-shell
改寫如下,就解了:

SQLNET.OUTBOUND_CONNECT_TIMEOUT 的利用時機

因為在ADG 的資料同步監控Perl程式裡
用了RMF(Remote Management Framework)
裏所使用的dblink
RMF
寫這隻程式的時候,有點擔心會不會碰到網路瞬斷後
程式就直接拋error
因為error 一拋, OP Center就叫修
值班DBA就被接到緊急叫修的電話
上系統一看又沒問題,徒然浪費人力而已
所以當時我就找了資料庫的參數設定
是否有相應的參數設定能控制DBLINK的連線 TIMEOUT
結果是沒有
後來念頭轉到oracle net相關參數是否有相應的設定
就找到了SQLNET.OUTBOUND_CONNECT_TIMEOUT及
SQLNET.SEND_TIMEOUT,當時設了7200
也不確定是否work
直到去年底, 客戶DR機房維修斷電沒接到通知
AP Leader剛好在用DR資料庫查詢資料連不上去
就撥了電話問我,有沒有接到OP Center叫修
當下是沒接到任何電話叫修,因為我就是當時的值班DBA
所以我很肯定沒接到緊急叫修
我上了系統透過dgmgrl 指令做檢測
還真的是有問題,我就剛好利用這個機會測試監控程式在網路斷線時會不會有問題
我就把兩個參數值都調成10
SQLNET.OUTBOUND_CONNECT_TIMEOUT=10
SQLNET.SEND_TIMEOUT=10
再去執行Perl的監控程式
就拋出error了
今天查了metalink資料
Oracle Net (SQL*Net) Timeout Parameters (Doc ID 1560775.1)
這一篇就寫得很清楚了
SQLNET.OUTBOUND_CONNECT_TIMEOUT
這個參數的設定才是我所要的

怎麼判斷Log Shipping 資料同步是否有異常

每天日檢我會登入從屬資料庫instance做兩個動作來判斷同步是否有問題
1. 執行下列t-sql語句,來確認上一次成功完成restore的時間是不是距離現在太久,通常大於30分鐘就必須要留意了。以我的環境是從士林機房跨到板橋機房來觀察的話,就我看了一整年的經驗,很少超過15分鐘的。但一切還是得取決於你的系統的交易量及專線的網路頻寬
use msdb;
go
select DATEDIFF(minute , last_restored_date,
 CURRENT_TIMESTAMP )
from log_shipping_monitor_secondary
go

2.用t-sql查看系統紀錄,可參考我的PO文 T-SQL 查看SQL Server 系統記錄檔

Nagios 排除監控時段

為什麼要排除監控? 我自身的案例有兩個
1.我定義的long query是running 10分鐘 &&  waiting > 1分鐘,系統絕大多數的request 都不會超過這個門檻值。但有些時段就是會有batch作業跑超過10分鐘,總不能為了一棵樹而放棄了整個森林,因此乾脆就排除那些batch的運作時段。
2.我定義的空間(file group 或交易記錄檔)監控門檻的使用率是>80% && available <10G。但最近有個例子,大表索引的重整作業因交易記錄檔空間不夠一直失敗(放進Nagios監控後,才凸顯了這個問題,已經給了70GB),幾經溝通與測試,最後改用重組(reorganize)取代重整(rebuild)。因為reorg小區段資料作業的特性,即使它運作失敗,也不會導致已整理完的部分完全被rollback,因此次趟的運作,可以接續上次的失敗點來進行。但即便如此,大表的重組也用了超過60GB的交易記錄檔空間,也就大於了我設定的門檻。既然是已知的現象,當然就可以排除監控了。
它(timeperiods)的設計理念是,不管是或非監控時段,都是你自行設定的物件,所謂的排除,就是在你所定義的監控時段內,剔除掉你所定義的非監控時段。
好繞舌喔~~ 我們先來看我所定義的排除時段。
Nagios timeperiods objects
我定義了一個名稱叫做exclude_1 的排除時段,它所定義的時間點是,晚上八點~九點。
我們接著看,怎麼在Nagios預設的 7*24的時段納入exclude_1,來達到我們設定的目的。
我們用exclude Directive 把先前定義的exclude_1納進7*24的設定內,你當然可以在Internet上找到其他的設定方法,來達成相同的目的。
這是Nagios 官方文件的參考Time Period Definition
########異動於今日2020/01/17###########
經過這兩個禮拜的實際implement
exlude timeperiode物件如果只有一個
看起來是正常
但是涵蓋了兩個,似乎schedule的換算會有問題
而且受影響的似乎不是只有套用該exclude物件
#2020/01/25 於Nagios 4 文件中確定是3的bug

Nagios Timeperiiod
因此我透過正面表列來取代exclude
結果運作就正常了
Nagios Timeperiod

SQL Server Log Shipping 切換

如果你建置過Log Shipping,預設的排程間隔是15分鐘,所以有人告訴我,整個切換的時間大概至少要30分鐘。我個人是喜歡事情在我的掌控底下,所以我會依照底下3個console的貼圖,勾選停掉相應的排程後,再手動依序執行3個排程。在哪裡找設定畫面? 你從哪設定Log Shipping,當然就是在哪裡進行設定

停掉備份作業
Log Shipping
停掉Copy作業
Log Shipping
停掉Restore作業
Log Shipping
點選確定離開Log Shipping的畫面後,當然就是分別到主要資料庫及從屬的資料庫的Instance,手動依序分別執行相應的排程。正常來說,這三個job都會有一個向下的箭頭,我這裡只是為了示意,貼了大約10個月前準備的擷圖
主要資料庫Instance 備份排程
Log Shipping
從屬資料庫Instance Copy 及Restore排程
Log Shipping
當這些都做完之後,為確保兩個資料庫的資料不因還有資料庫內未退出的session所做的意外的DML而造成兩個資料庫的資料不一致,我會執行下列SQL 語句查看是否還有session掛著
select *
from sys.dm_exec_sessions a, sys.databases b
where a.database_id= b.database_id
and b.name = 'ur_db_name'
如果只有幾個,就手動砍session 囉!! 如果是像我的案例,IIS重開之後,從原本的4000多個剩下900多個,我就只能請負責WSFC的兄弟幫我重開資料庫Instance了
當確認都無session殘留後,就是手動backup log備出交易記錄檔備份,傳到從屬機後,下正規的restore log指令後,從屬資料庫自然就開起來了。
上述就是我昨晚進行機房搬遷,啟動另一個DC內資料庫的步驟。