2015年2月24日 星期二

MVA學習筆記-SQL Server 管理入門 (四):自動化、維護與監控

MVA連結

SQL SERVER AGENT

  • 負責自動化的SQL SERVER元件
  • 以WINDOWS服務的方式執行
  • 支援T-SQL、POWERSHEEL、作業系統指令或執行應用程式
  • 週期性的執行
  • 可將作業直接產生指令碼或文件來方便移轉或保存
  • 在AGENT的屬性來設定歷程記錄的保留方式,避免留存資料量過大
  • AGENT的設定和歷程保留在msdb

警示與通知

透過DATABASE MAIL實作SMTP,讓DB可以發送EMAIL
AGENT會觀察WINDWOS裡有多少SQLSERVER錯誤訊息
嚴重層級17以上就真的嚴重了
自訂錯誤訊息從50000後開始,要搭配WITHLOG讓記錄寫入WINDOWS錯誤訊息
定義警示

DATABASE MAIL

可設定多個帳號以增加可靠度
管理\DATABASEMAIL利用UI來設定
新增操作員來接受錯誤訊息

資料庫維護


  • 確定資料庫的完整性
  • DBCC CHECKDB('DBNAME') 
  • 只毀索引PAGE的話,如果DBCC CHECKDB是NOINDEX的話是無錯的
  • SELECT TABLE的話也會是正常,但如果是WITH INDEX的話也會異常。


索引片段


  • SQL SERVER重組索引資料頁當修改資料造成資料頁分割

內部不連續

  • FILLFACTOR(僅有子頁層)
  • PAD_INDEX(包含根與中介層)

維護索引

REBUILD

  • 重建整個索引
  • 資料庫需要未使用的空間
  • 以單一交易執行,可能需要大量的交易記錄空間

REORGANIZE

  • 線上重新排序資料頁
  • 交易記錄使用量較少
  • 可以被中斷,但仍保有執行到當時的工作成果

線上索引作業

  • 可以線上建立、重建和刪除
  • 較離線慢,但需許使用者讀取資料
  • 需要額外的硬碟空間
  • 查詢資料片段語法
  • SELECT * FROM sys.dm_db_index_physical_stats(db_id('dbname'),object_id('t'),null,null,'DETAILED')
  • 在TABLE右鍵屬性查片段狀況也可以
  • 可以參考保哥的文章

追蹤與監控工作

動態管理檢視與函數概觀


  • sys.dm_exec_%-連接和執行
  • sys.dm_os_%-SQLOS相關資訊
  • sys.dm_tran_%-交易管理
  • sys.dm_io_%-IO相關資訊
  • sys.dm_db_%-資料庫範圍的資訊
  • 使用時必須指定sys結構描述,分別為當下狀態資訊與累積的歷史資訊
  • 累積的部份在db重開機之後就會歸零

使用效能監視器

  • 提供即時監控健康與效能的計數器(perfmon)
  • 監控重點:
  • CPU
  • Memory
  • Disk System
  • Network
  • SQL Server Counters

資料收集概觀


  • 收集多台機器的內容並保留在一個DB上面
  • 利用SSIS和SQL AGENT作業傳送資料到集中的資料庫
  • 用SSMS來存取報表

設定資料收集

  • 在一群的SQL SERVER主機中選一台來當資料收集主機,其它主機則個別設定好上傳資料的頻率以及要上傳的資料與保留期限。
  • 管理\資料收集\設定管理資料倉儲
  • 新增一個資料庫用來管理收集資料並授權
  • 在各機器上面都要設定資料收集,並連到資料倉儲主機

2015年2月2日 星期一

MVA學習筆記:SQL Server 管理入門(三)-安全性

MVA連結

SQL Server安全概論:


  • 連結db有兩種方式,一種是windows認證,或是sqlserver本身的認證。
  • sql2012之後有自主資料庫,可在資料庫內直接記錄可以登入的帳密。

授權概觀:


  • 認證-確認使用者身份
  • 授權-賦予主體對安全性實體擁有的權限有什麼。
  • 透過GRAND,DENY,REVOKE語法來賦予對物件的權限。
  • DENY>GRAND>REVOKE

建立資料庫使用者的方式:


  • 透過SSMS內的物件總管
  • T-SQL的CREATE USER語法
  • CREATE USER STUDENT FOR LOGIN [ADVENTWORKS\STUDENT]

管理DBO和GUEST存取:


  • SA登入和SYSADMIN角色的成員會對應到DBO使用者
  • SYSADMIN有無限存取的能力,完全無法DENY任何的權限。
  • GUEST預設是DISABLE,可以透過GRNAD CONNECT TO GUEST來啟用帳號

為特定資料庫建立使用者:


  • 在資料庫等級認證使用者-需要自主資料庫或部份自主資料庫
  • 三種型態:
  • 以WINDOWS帳戶為基礎的使用者,並未建立登入
  • 以WINDOWS群組為基礎的使用者,並未建立登入
  • 自主資料庫的使用者並賦予密碼(SQL2012之後功能)
  • 處理對應不上的SECURITY IDS

登入和資料庫使用者:


  • 都有名稱
  • 都有SECURITY IDENTIFIERS 稱為SIDS
  • 預設、建立SQL登入時都會賦予新的SID
  • 即使帳號相同也會建新的SID
  • WINDOWS登入的SID採WINDOWS提供的值
  • 將資料庫還原或附加到不同的執行個體後,一般會發生對應不上的問題
  • 以CREATE LOGIN語法建立登入時,搭配WITH SID選項, 參照HTTP://support.microsort.com/kb/918992
  • 以ALTER USER使用者WITH LOGIN=登入 語法修改資料庫內的使用者採用登入的SID

伺服器範圍的權限

伺服器層級的權限可以透過三種方式賦予

固定伺服器角色-盡量少用


  • sysadmin本身不做任何安全檢查 ,即使被deny還是可以做任何的操作。
  • public是伺服器內特殊的伺服器角色
  • 不被視為固定的伺服器角色,因為可修改他的權限。
  • 預設賦予的權限:VIEW ANY DATABASE,對預設端點有CONNECT權限。

使用者定義伺服器角色(2012之後才有,建議使用)


  • 可以透過負向表列(deny)來做權限的控管

資料庫範圍的權限

  • 理論同伺服器範圍的權限




With Grant選項


  • 被賦予權限的時候搭配可讓被授予者再將該權限授予其他人。
  • CASCADE可以用來移除被授予權限者再授予出去的權限。

預存程序安全


  • 在呼叫前需要EXECUTE權限
  • 修改需要ALTER權限
  • 檢視定義需要VIEW DEFINITION權限
  • GRAND EXECUTE ON SP TO MAN

使用者自訂函數安全

  • 使用純量值函數前需EXECUTE權限
  • 使用資料表值函數前需要SELECT權限
  • 在CHECK條件約束、DEFAULT值或計算欄位使用,需要REFERENCES權限

Managed Code安全-這段不懂



管理Ownership Chains

ABC三人,1TABLE,2VIEW,2VIEW來源為1TABLE的資料,當B將2VIEW授權給A的時候,A有權限看2VIEW,但無法看1TABLE資料,當1TABLE權限被轉移至C的時候,A連2VIEW的權限也會被拿掉,必需由C再重新授權才行。

安全稽核


  • 2008之後新增的功能
  • 基於擴充事件的事件追蹤與記錄機制
  • 2012企業版有完整功能,其它版本有基本功能(開放SERVER等級)
  • 稽核等級分伺服器等級與資料庫等級

設定稽核流程

  • 建立定義目的地
  • 檔案
  • 應用程式記錄(任何有權力的使用者都可以讀取)
  • 安全性記錄(需賦予SQLSERVER 服務帳戶產生安全性稽核使用者權限
  • 建立稽核規格(伺服器或資料庫)
  • 啟用稽核和規格(預設停用)
  • 檢視記錄

2015年1月12日 星期一

MVA學習筆記:SQL Server管理入門(二)

MVA連結

SQL交易記錄概觀:

交易流程:


  • 應用程式輸入資料變更=>在buffer cache找到或載入資料頁修改資料=>變更被記錄在交易記錄(ldf)=>checkpoint將dirty pages更新到資料檔

復原模式應用:


  • 簡單

  • 無法使用交易記錄備份
  • 自動清除交易記錄讓空間需求量最小

  • 完整

  • 管理資料庫需要交易記錄備份
  • 減少資料檔損毀造成的損失
  • 可以回復到特定時間點

  • 大量記錄

  • 管理資料庫需要交易記錄備份
  • 一般可提升bulk copy的行為效能
  • 針對一些bulk操作可因最小記錄而減少交易記錄使用的空間

備份策略:


  • 可容納的資料損失?
  • 使用何種備份類型?
  • 誰來執行?
  • 誰來規劃?
  • 頻率為何?
  • 多久做一次還原測試?
  • 是否搭配協助廠商工具?
  • 使用何種備份媒體? 

SQL SERVER備份類型:

  • 完整-所有檔案和部份交易記錄
  • 備份完整的資料庫
  • 備份交易記錄檔作用中(active)的部份,以回復資料庫
  • SQL2008之後提供了備份壓縮功能,不過針對沒有壓縮率的資料就不需要特別使用

  • 差異-上次完整之後有變更的資料庫資料

  • 備份前一次完整資料備份之後有變更的extents
  • 備份交易記錄檔作用中(active)的部份,以回復資料庫
  • 差異備份間彼此無關

  • 部份-primary檔案群組,每個讀/寫檔案群組,以及特定的唯讀檔案群組

  • 交易記錄-在ldf內記錄的任何資料庫變更

  • 僅備份交易記錄
  • 備份從最後一次成功的交易記錄備份到當下的記錄結尾

  • 備份交易記錄結尾-在還原之前備份交易記錄的結尾記錄

  • 如果mdf、ndf都已損毀,但ldf沒有損壞,可以利用此備份,在做還原之後再將所有交易記錄還原。 
  •  在循序還原之前用來擷取交易記錄的結尾,等同執行一次一般的記錄備份。
  • 當接下來就要開始還原,可使用norecovery(將資料庫狀態改為recovering)
  • 當資料檔遺失或損毀,但交易記錄檔仍完整,可使用continue_after_error 

  • 檔案/檔案群組-指定特定的檔案和檔案群組

  • 只複製備份-資料庫或交易記錄

  • 在兩個資料庫之後搬移資料從A拿去B,又不想破壞原來的備份還原順序使用
  • 只複製交易記錄備份不會清掉交易記錄
  • 只複製完整備份不會影響差異備份

確認備份完整性的選項:

  • 鏡像備份裝置
  • 備份集最多可以四份(企業版支援)
  • 總和檢查碼(checksum)備份選項
  • 驗證備份(restore verifyonly),搭配checksum選項較為有用

檢視備份資料:

  • SQLSERVER透過msdb資料庫一組資料表追縱所有的備份作業
  • 還原的時候SQLSERVER UI會根據你的備份來建議你做最佳還原方式
  • 可以從備份媒體取得資訊
  • RESTORE LABELONLY傳回含有給定備份裝置所識別的備份媒體之相關資訊的結果集
  • RESTORE HEADERONLY傳回含有特定備份裝置上的所有備份組之所有備份標題資訊的結果集
  • RESTORE FILELISTONLY傳回含有資料庫清單的結果集及備份組所包含的記錄檔

備份考量:

  • 備份是線上同時進行,不限制使用者存取,可能因為I/O負係低其它作業效能
  • 一般備份時使用CPU約10%以內的資源,但有啟用壓縮時會拉高使用率
  • 一般備份作業時,資料庫需處理上線狀態
  • 當資料庫損毀時仍可以執行交易記錄備份
  • 交易記錄檔必需是完整的

還原類型:


  • 簡單模式
  • 完整模式
  • 還原系統資料庫
  • 僅還原受損檔案
  • 進階的還原選項,包含online、piecemeal、page還原

準備還原備份:


  • 可能需要執行結尾記錄備份(只適用大量記錄和完整)
  • 確認要還原的備份內容

還原流程的階段:

  • SQLSERVER資料庫的回復流程分三階段
  • 分析與資料複製:建立檔案並複製資料到檔案內,分REDO和UNDO
  • REDO:從還原的記錄將交易結果更新到資料檔
  • UNDO:在還原的當下,將未完成的交易回復
  • REDO和UNDO稱為RECOVERY

WITH RECOVERY選項:

  • 資料庫必須要完成還原才能上線使用
  • WITH NORECOVERY還原選項保持資料庫正在還原狀態,允許對資料庫執行額外的還原作業。

WITH STANDBY選項:

  • 可以唯讀的方式查詢未還原的資料庫,透過待命資料庫檔案存放UNDO階段的細節資料。
  • 建立待命伺服器提供資料的唯讀查詢
  • 在多個交易記錄回復之間查閱資料庫
  • 在人為災難時非常好用

回復到特定時間點:

  • 讓資料庫可以回到特定的時間點,相關記錄都存在交易記錄備份中
  • 定義特定時間點的方式,透過交易名稱標記
  • 資料庫最好是完整復原
  • 交易記錄若包含大量記錄,回復的特定時間點剛好落在大量記錄復原模式的最小記錄行為區段,將導致回復失敗。
  • restore log xx from disk='xx' with standby='xx' ,stopat='時間點'

資料的移轉:

  • ETL:EXTRACT TRANSFORM LOAD
  • 在伺服器間複製或搬移資料
  • 將查詢的資料輸出成檔案
  • 從檔案將資料載入資料表
  • 從檢視讀取或輸入資料
  • 轉換定序或BIG5轉UNICODE

資料轉換可用的工具:

  • BULK COPY PROGRAM(BCP)
  • BULK INSERT
  • OPENROWSET(BULK)
  • IMPORT/EXPORT WIZARD(SSIS)
  • XML BULK LOAD

強化資料轉換效能:

  • 停用條件約束、索引和觸發
  • 減少鎖定,考慮使用TABLOCK以加速載入
  • 在目的端透過SELECT INTO會比從來源端做來的有效率
  • 減少交易記錄,採BULK MODE或是SIMPLE MODE
  • 減少資料轉換,採用NATIVE格式
  • 來源跟目的皆為SQLSERVER的話採NATIVE模式效率好
  • LOCK量會從ROWLOCK到PAGELOCK再到TABLOCK
  • SQL SERVER INTEGRATION SERVICES 概觀(SSIS):
  • 提供開發ETL解決方案豐富的架構

SSIS封裝包含:

  • 資料來源和目的
  • 控制和資料流程
  • 各種不同的轉換
  • 可執行SSIS封裝的方式
  • DTEXECUI和DETEXC命令列工具
  • SQLSERVER AGENT作業
  • 開發SSIS封裝的方式
  • SSDT
  • 匯入/匯出精靈

BCP:

  • 直接在CMD處執行命令
  • 中介的通常是一個檔案
  • 產生格式檔
  • bcp Northwind.dbo.customers format nul -T -c -x -f Cust.xml
  • 匯出
  • bcp Northwind.dbo.customers out "e:\temp\Cust.dat" -T -c
  • 匯入
  • bcp tempdb.dbo.customers in Cust.dat -T -f Cust.xml

BULK INSERT語法:

  • 提供與BCP近似的選項
  • 執行在SQLSERVER應用程式內
  • 有CHECK_CONSTRAINTS和FIRE_TRIGGERS選項

MVA學習筆記:SQL Server管理入門(一)

MVA連結

硬體需求:


  • 就愈高級愈好=..=

軟體需求:


  • 避免安裝在DOMAIN CONTROLLER
  • 建議安裝在64位元的作業系統
  • .NET FRAMEWORK 3.5 AND 4

決定檔案存放位置:

  • 透過壓力測試來決定硬碟數量
  • 硬碟分頁大小建議設定64k
  • 收交易記錄檔和資料檔案放在不同的實體位置上
  • 使用適當的RAID設定
  • DATAFILE、mdf、ndf一般採RAID5
  • 基於效能和維護來決定檔案的數量和位置
  • 確定交易記錄需求(ldf檔)
  • 一般是放RAID1
  • 交易記錄一般只需要一個,因為交易記錄是循序寫入

服務帳號:

  • 獨立建立服務帳號
  • 在SQLSERVER安裝時所賦予的帳號,或是透過SQLSERVER組態管理員設定的帳號,會自動賦予所需的權限

設定定序:

  • 決定文字間的大於、等於、等於
  • WINDOWS定序與WINDOWS的規則相同
  • SQL定序與早期的SQLSERVER用法相同
  • 預設的定序
  • 跨國企業的定序建議以英文定序設定

SQLSERVER資料存放:

  • 主要資料檔案-.mdf
  • 次要資料檔案-.ndf
  • 交易記錄檔案-.ldf
  • 資料表跟索引存放在資料頁,並以Extent群組管理
  • Extent:8個連續的8kb資料頁
  • 資料與LOG會設計存放在不同硬碟上面

確定足夠的檔案容量:

  • 估計資料、交易記錄和tempdb的容量
  • 系統資料庫只有一個tempdb,但所有database都會共享它,所以要放在讀取快速的I/O上,如SSD
  • 設定合理的大小
  • 賦予新增資料足夠的大小,不要經常擴增
  • 監控資料和交易記錄檔的使用
  • 手動擴增計劃
  • 允許自動增長,以防不預期的需求

Tempdb:

  • 存放內部物件的暫存資料、記錄版本、使用者物件
  • 執行個體重起的時候會重建
  • 依SQLSERVER執行個體的使用方式與負載會佔用不同大小的空間
  • 需要依靠真實的負載來測試
  • 放到獨立而快速的I/O子系統確保效能
  • 為其建立與實體CPU等量等大的檔案數(最多8個資料檔)
  • 透過測試確認最佳的值

擴增和縮小資料庫檔案:

  • 可以手動變動
  • 可以自動擴增,但應該避免,應計劃手動擴增
  • 可以縮小檔案,DBCC SHRINKDATABASE...易造成資料庫擺放資料破碎


2015年1月7日 星期三

MVA學習筆記:SQLServer例行管理

MVA連結

每日檢核項目:

檢核記錄檔:


  • SQLServer錯誤記錄檔
  • WindowsServer事件檢視器
  • 硬體異常記錄
  • 排程作業是否正常
  • 效能記錄檔
  • 是否raid硬碟故障

每週檢核項目:

確認備份檔案可用性


作業系統、SQLServer、應用程式更新

SQLServer Management Studio報表

資料庫交易記錄檔是否異常成長

每月檢核項目:

  • 執行備份還原演練
  • 變更管理
  • DBCC檢查
  • 容量規劃/基準比較
  • 健全狀況
  • 改善計劃

可利用SP快速查詢LOG

  • exec sp_readerrorlog
  • 參考連結
  • exec xp_readerrorlog
  • sp_readerrorlog的底層一樣是使用xp去作業,但多了一個權限的限制。
  • sp_cycle_errorlog-關閉目前記錄檔,重新開始。

可以利用Power Shell來取得LOG

  • # 取得在 2014-07-01 之後的事件檢視器內的 Application Event Log  
  • #get-eventlog -logname Application -After "2014-08-01"

  • # 只取 SQL Server 的訊息
  • #get-eventlog -logname Application -After "2014-08-01" -Source "MSSQLSERVER"

  • # 只取 SQL Server 的錯誤訊息 
  • get-eventlog -logname Application -After "2014-07-01" -Source "MSSQLSERVER"  -EntryType "Error"

  • # 存到 CSV 檔案內
  • get-eventlog -logname Application -After "2014-08-01" -EntryType "Error" -Source "MSSQLSERVER" |
  • export-csv -Path C:\TEST.csv -NoTypeInformation -Encoding "unicode"

軟硬體執行環境分析

  1. 電源管理:透過電源管理可以避免CPU自動降頻。
  2. 硬體效能:CRYSTALDISKMARK
  3. 效能監視器:轉出CSV之後透過分析表來分析。
  • 2008以前執行『performance monitor』
  • 2008之後在伺服器管理員的診斷\效能

索引維護

  • 只要對基礎資料進行CURD作業,SQLSERVER會自動維護索引,但過一段時間之後,這些修改就可能使索引中的資訊變成散佈於資料庫中,當根據索引鍵值的邏輯順序頁面與資料檔中的實體順序不相符時,就會有片段產生。
  • 片段嚴重的索引可能會造成查詢效能降低並使回應變慢。
  • sys.dm_db_index_physical_stats取得相關資訊。
SELECT
OBJECT_NAME(s.object_id) tablename, i.name indexname,
index_type_desc,index_level, avg_fragmentation_in_percent,avg_page_space_used_in_percent, page_count

FROM sys.dm_db_index_physical_stats(DB_ID(N‘資料庫名稱'), NULL, NULL, NULL , 'SAMPLED') s
JOIN sys.indexes i ON s.object_id = i.object_id and s.index_id = i.index_id
ORDER BY avg_fragmentation_in_percent DESC

  • 利用維護計劃來做索引維護
  • 可以透過指令來針對部份TABLE做索引重建
  • 透過報表可以看索引實體統計資料瞭解索引狀況。
  • Fragmentation>30,建議重建索引。5~30選擇重新組織索引。
  • 重建索引時,索引保留在線上<-這功能只有在Enterprise版本才有支援。


2014年4月24日 星期四

Webapi-CORS實作

參考來源1:http://www.dotblogs.com.tw/joysdw12/archive/2013/05/25/web-api-cors.aspx
參考來源2:http://blog.kkbruce.net/2013/05/aspnet-web-api-cors-preview-full-featured-profiling.html
最後採用:使用 Thinktecture.IdentityModel 套件實作 CORS
即參考來源1。
不過還是有讀一下kkbruce老師的說明。
延伸閱讀:http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/

2014年3月19日 星期三

WebApi-強制格式為json

教學來源:保哥 連結
Global.asax 檔案的 Application_Start() 事件裡加入語法
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear()
感謝保哥教學。