本文將介紹透過資料庫複製來備份和還原 SQL Database 上的資料庫。
【情境說明】
有使用 SQL Server 這類的 DBMS 的朋友都知道,資料庫一定要定期備份,否則資料庫中的資料遭到誤刪或誤改,想要還原可是很麻煩的一件事。資料庫備份/還原這件事情在 SQL Server 上到 Cloud 後一樣重要,因此使用 Windows Azure SQL Database(以下簡稱 SQL Database)該做的備份作業還是不能少,筆者將針對 SQL Database 上可以使用的方法來進行一系列的介紹,本文先介紹使用資料庫複製來建立資料庫複本,透過複本的建立讓您的備份/還原策略更加完善。
【查看資料庫複本的過程】
針對 SQL Database 的特性,微軟開發了一系列適用於 SQL Database 的 T-SQL 語法,您可以利用 sys.dm_database_copies 檢視來查看有哪些資料庫正在進複製作業尚未完成。範例如下:
select *
from sys.dm_database_copies
若您在 sys.dm_database_copies 檢視查不到資料,代表目前並沒有任何資料庫複製作業正在進行。此外,您可以利用 sys.databases 系統資料表的 state_desc 資料行來查看資料庫複製的進度,當 state_desc 為 ONLINE 表示複製完成,state_desc 為 COPYING 表示正在複製,state_desc 為 SUSPECT 表示複製失敗。若發生複製失敗則必須透過 DROP DATABASE 敘述來移除新資料庫。
【建立資料庫複本】
您可以利用 CREATE DATABASE 敘述搭配 AS COPY OF 來建立資料庫複本,簡要的語法如下:
CREATE DATABASE 新資料庫名稱AS COPY OF [原伺服器名稱].原資料庫名稱
下列程式碼示範建立 Northwind 資料庫的複本於同一台 SQL Database 伺服器:
CREATE DATABASE NWAS COPY OF Northwind
執行結果如下:
建立複本時,請特別注意下列事項:
1. 允許跨 SQL Database 伺服器上建立資料庫複本。
2. 資料庫複本必須在同一區域的 SQL Database 伺服器。但 SQL Database 可能由多個實體叢集所構成,無法跨叢集進行資料庫複製,您可以透過 ping <sql database server> 的方式來查看來源和目的端的伺服 器使否 IP 相同來判斷是否可以複製資料庫。
3. 萬一您要複製的資料庫和目的資料庫在不同實體叢集,則必須透過匯出/匯入服務來想辦法讓來源和目的的資料庫位於同一實體叢集。
4. 資料庫複本和其正本相同,其計費費率與來源資料庫相同,在計算每個伺服器最多 150 個資料庫時一併計入。
5. 複製資料庫時會造成原資料庫的負載增加,執行作業時應選擇離峰時間進行。
6. 您必須使用具備下列權限的登入才可以複製資料庫,若要跨伺服器複製,必須在兩部伺服器上擁有相同的登入名稱和密碼,在目的地伺服器登入必須是 dbmanager 角色,在來源資料庫中登入必須是 dbo。
由於複製資料庫的時間會根據你的資料庫大小以及系統忙碌程度而有所不同,若您在資料庫複製過程中想要取消複製作業,可以利用 DROP DATABASE 直接移除新的資料庫即可。
【由資料庫複本還原資料庫】
要將資料庫複本還原可以使用 ALTER DATABASE 敘述搭配 MODIFY NAME 的方式來達成由複本取代正本的目的,作法如下:
--步驟一、假設Northwind.Region的RegionDescription資料行都被更新為123UPDATE dbo.Region
SET RegionDescription = '123'GO
SELECT *
FROM dbo.Region
GO
--步驟二、利用ALTER DATABASE 搭配 MODIFY NAME 來將 Northwind 改名為 Northwind-BAKALTER DATABASE NorthwindMODIFY NAME = [Northwind-BAK]
GO
--步驟三、將Northwind的複本NW,改名為NorthwindALTER DATABASE NWMODIFY NAME = Northwind
GO
【參考資料】
- Windows Azure SQL Database 備份和還原
- Transact-SQL 參考 (Windows Azure SQL Database)