在上一篇文章己經把鏡像同步建立好了,
接著分享在資料庫維運時可能遇到的鏡像操作問題。
問題一、原本的主機發生問題(如硬碟故障或其它硬體有問題時),如何切換到備援機?
可以連至主機進行鏡像手動容錯移轉(manual failover)至備援機
USE [master]
ALTER DATABASE [APPSYS] SET PARTNER FAILOVER;
如果仍無法移轉,在容許資料遺失的情況下可執行以下指令
USE [master]
ALTER DATABASE MyDB SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS
或者至備援機斷開鏡像。
--連至備援端DB移除資料庫鏡像
USE [master]
--中斷鏡像同步後,如主體端DB沒有做過Log備份,都可以再次設定鏡像同步
ALTER DATABASE [APPSYS] SET PARTNER OFF;
--將資料庫恢復成RECOVERY模式,可進行存取的狀態
RESTORE DATABASE [APPSYS] WITH RECOVERY;
問題二、如何監控鏡像同步的情況?
可查詢sys.database_mirroring查詢當下鏡像的情況:
select db_name(database_id) as '資料庫名稱',mirroring_state_desc as '鏡像狀態' from sys.database_mirroring
where mirroring_state is not null
鏡像狀態可能的狀態有:
Unknown、正在同步處理、已同步處理、已暫停、已中斷連接
只要透過排程(Job)來定期執行以上語法,再判斷回傳鏡像狀態為己暫停或是己中斷連接時,
即發送通知給相關人員即可。
問題三、鏡像機制中斷後重建時要注意什麼?
在鏡像中斷後,只要主體端無任何備份(導致交易紀錄截斷)
仍可以直接進行鏡像同步,無需在備援機再次還原DB。
但假如主體端己經過做備份,則是仍須要到主體端備份DB後再至備援機進行DB還原才可以進行鏡像同步。
問題四、假設己容錯移轉至備援機,如何讓前端系統程式能使用相同的登入帳號(Login)?
在主體端可以使用微軟(KB提供的語法建立二支Store Procedure:sp_hexadecimal、sp_help_revlogin,
再執行exec sp_help_revlogin可顯示全部Login的建立Script,再拿去備援機執行即可複製Login。
exec sp_help_revlogin
--顯示Login Create Script
CREATE LOGIN [tt01] WITH PASSWORD = 0x01005B429E7F53752B8B2B8DE7D5F97512738BA25CC527490C78 HASHED, SID = 0x51236A2E950F2A4680B087495907AFE3, DEFAULT_DATABASE = [APPSYS], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF
問題五、如果遇到主機需要進行硬體維修或網路中斷時,可透過鏡像暫停和繼續來避開作業時間。
--暫停鏡像,以利後續作業
ALTER DATABASE APPSYS SET PARTNER SUSPEND;
--恢復鏡像
ALTER DATABASE APPSYS SET PARTNER RESUME;
--需等待後續的資料同步完成
參考資料:
鏡像狀態 (SQL Server)
https://docs.microsoft.com/zh-tw/sql/database-engine/database-mirroring/mirroring-states-sql-server
監視資料庫鏡像 (SQL Server)
https://docs.microsoft.com/zh-tw/sql/database-engine/database-mirroring/monitoring-database-mirroring-sql-server
ALTER DATABASE (TRANSACT-SQL) 資料庫鏡像
https://docs.microsoft.com/zh-tw/sql/t-sql/statements/alter-database-transact-sql-database-mirroring
如何在 SQL Server 2005 和 SQL Server 2008 的執行個體之間傳送登入和密碼https://support.microsoft.com/zh-tw/help/918992/how-to-transfer-logins-and-passwords-between-instances-of-sql-serve