原文鏈接:http://www.gis8.net/Article/arcgis/200611/362.htm
隨著GIS應用系統在復雜性、集成性、并發性等方面的要求不斷增加,系統所需的空間數據量在急劇地增長,同時用戶對空間數據并發訪問的需求也越來越突出。以傳統的文件形式存儲和表示空間數據的方法顯然已經無法滿足這些需求。由于ArcSDE本身所具有的海量數據存儲、多用戶并發訪問、版本管理、長事務處理等強大優勢,在GIS應用系統中引入ArcSDE作為空間數據存儲和管理引擎,變得越來越普遍。ArcSDE作為空間數據庫引擎,在ArcGIS 8.1系列軟件中屬于服務器端的產品,在整個產品框架中,處于數據中心的重要地位,它利用Oracle、DB2、SQL Server、Informix等關系型數據庫在數據存儲、數據完整性等方面的先進技術手段,將海量空間數據(包括矢量數據和柵格數據)有機地組織和管理起來,通過其內部異步緩沖、空間索引等先進的機制,提供對空間數據的多用戶高效并發訪問。
除了存儲空間數據并提供訪問,對于空間數據的備份和恢復,是空間數據管理中最重要的工作環節之一,也是保障空間數據安全的重要方式。首先,空間數據本身在應用過程中不斷地被更新變動,所以經常會需要備份不同時期,不同的空間數據版本;第二,存儲介質的意外損壞會導致嚴重的空間數據丟失,因此需要定期對空間數據對象的整體進行完全備份;第三,有時出于調整的必要,需要在不同服務器、甚至不同數據庫管理系統之間進行空間數據的移植和轉換。
在采用文件形式空間數據的時代,空間數據的備份僅僅是操作系統中的文件拷貝、備份和歸檔的過程;而空間數據的恢復也不過是復制、覆蓋的操作;在基于ArcSDE和關系型數據庫的空間數據庫時代,空間數據的備份更多的依賴于關系型數據庫的備份和恢復技術,當然也不能缺少ArcSDE所提供的備份工具。按照備份的方式和對象,ArcSDE中空間數據的備份和恢復可以分為如下兩類:指定空間數據對象的備份恢復,和整體空間數據庫的備份恢復。
一、 指定空間數據對象的備份和恢復
這種方式主要用于備份指定的空間數據對象,比如某個圖層和要素類、其中的某些滿足特定條件的記錄、甚至特定的版本。實現這種備份方式的方法主要是利用ArcSDE提供的管理工具:sdeexport和sdeimport命令。它們的位置在%ArcSDEHOME%\bin\中。其中,sdeexport用于將空間數據從ArcSDE Server上備份為單獨的數據文件,而sdeimport用于將經由sdeexport備份的數據文件恢復到ArcSDE Server中。
這一方式的缺點在于不能一次備份完整的空間數據庫。但是也有個明顯的優點,在于通過sdeexport和sdeimport工具,可以將空間數據在不同的關系型數據庫管理系統(RDBMS)之間進行移植。
1. 備份全部記錄
使用sdeexport命令的缺省方式即可,比如:
(1) 將指定的圖層備份到備份文件
sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -i jerry_oracle -u sde -p sde
就是將名為jerry_oracle的sde服務(ArcSDE for Oracle8i)中的指定圖層“dcxq”按缺省方式備份到文件d:\dcxq.exp中。
(2) 利用操作系統命令,拷貝備份文件到目標服務器上
(3) 將備份文件恢復至目標RDBMS中
sdeimport -o create -l newDcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde
此操作將備份文件恢復到名為jerry_sqlsvr的sde服務(ArcSDE for SQLServer)中,圖層名為:newDcxq。
2. 備份部分記錄
sdeexport命令中添加-w參數和一個條件選擇表達式即可,比如:
(1) 將指定圖層中滿足條件的記錄備份到備份文件
sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -w xzqy = '徐匯區' -i jerry_oracle -u sde -p sde
就是將名為jerry_oracle的sde服務(ArcSDE for Oracle8i)內的指定圖層“dcxq”中所有"徐匯區"的人口調查小區備份到文件d:\dcxq.exp中。
(2) 利用操作系統命令,拷貝備份文件到目標服務器上
(3) 將備份文件恢復至目標RDBMS中
sdeimport -o create -l XHDcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde
此操作將備份文件恢復到名為jerry_sqlsvr的sde服務(ArcSDE for SQLServer)中,圖層名為:XHDcxq。
3. 備份特定數據版本
sdeexport命令中添加-v參數和一個版本名稱即可,比如:
(1) 將指定圖層的特定版本備份到備份文件
sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -V verAPR -i jerry_oracle -u sde -p sde
此操作將名為jerry_oracle的sde服務(ArcSDE for Oracle8i)內的指定圖層“dcxq”的verAPR版本備份到文件d:\dcxq.exp中。
(2) 利用操作系統命令,拷貝備份文件到目標服務器上
(3) 將備份文件恢復至目標RDBMS中
sdeimport -o create -l APRdcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde
此操作將備份文件恢復到名為jerry_sqlsvr的sde服務(ArcSDE for SQLServer)中,圖層名為:APRDcxq。
二、 整體空間數據庫的備份和恢復
ArcSDE空間數據庫的整體備份和恢復,實質上很大程度上是其所在的數據庫或者數據庫對象的備份和恢復問題。當然完整的ArcSDE數據備份應當還包括dbtune.sde,giomgr.defs,dbinit.sde和services.sde等文件。
數據庫的備份和恢復有很多種類。在不同的數據庫管理系統中,更是千差萬別??傮w上,大都可以分為靜態轉儲和動態轉儲兩個類型。靜態轉儲是在系統中無事務處理時進行的轉儲操作,因而這種方式得到的一定是一個數據一致性的副本。靜態轉儲的優點是操作簡單,保證數據一致性,但是缺點也很明顯,轉儲操作必須等待用戶事務結束才能進行,而新的事務必須等待轉儲操作結束才能執行,因此會降低數據庫的可用性。動態轉儲是指轉儲操作與用戶事務并發進行,轉儲期間允許數據庫進行存取和修改操作,它不必等待所有運行的事務結束,也不會影響新事務的運行,但是無法保證副本中的數據正確、有效、完整。所以在動態轉儲期間,往往會建立日志文件。后備文件加上日志文件就可以把數據庫恢復到正確的狀態。
1. Oracle數據庫
(1) 兩種歸檔模式(archive mode)
Oracle有兩中歸檔模式:NO ARCHIVELOG和ARCHIVELOG。在NO ARCHIVELOG模式(該模式為缺省模式)下的數據庫操作不歸檔在線日志重做文件。當存儲介質損壞時,NO ARCHIVELOG模式的數據庫只能恢復到上一次的備份點上。ARCHIVELOG模式的數據庫可以通過上一次的備份和歸檔日志重做文件相結合的方式,恢復到介質損壞之前的點上。
以NO ARCHIVELOG模式創建的Oracle數據庫可以切換至ARCHIVELOG模式。
(2) 多種備份與恢復方式
Oracle中的數據備份和恢復方式包括:脫機備份與恢復、邏輯備份與恢復、熱備份與恢復。
* 脫機備份與恢復:脫機備份是一種靜態轉儲技術,備份在數據庫關閉、不工作的狀態下進行。脫機備份包括兩種實現方式:第一種是使用Oracle提供的工具Backup/Recover;第二種是利用操作系統的復制功能,復制數據文件,即:冷備份。
* 邏輯備份與恢復:邏輯備份與恢復是指將數據庫、用戶和表等對象的內容整個轉出到一個二進制文件,然后在需要的時候通過轉入恢復到原來的形式。這種方式可以備份整個數據庫,指定用戶和指定表的內容。
* 熱備份與恢復:脫機備份和邏輯備份通常是用戶不訪問數據庫時的靜態備份操作。這些備份只保證數據備份前的一致性和完整性,不保證備份期間的數據一致性。為了保證數據的即時一致性,在備份數據的同時還需要備份日志文件。數據庫運行在ARCHIVELOG方式下,同時作數據和日志文件的備份稱為熱備份。
(3) 實現步驟
選擇使用何種備份方式,由具體的數據備份需求所決定。具體的Oracle數據庫備份實現步驟需要參考Oracle相關文檔,比如《Oracle8 Backup and Recovery Guide》。本實例采用Oracle中的邏輯備份,使用了exp和imp工具,以sde用戶方式備份和恢復整體空間數據。
* 備份數據庫:使用Oracle中的exp命令,以sde用戶方式備份所有相關數據。
* 恢復數據庫:使用Oracle中的imp命令,以sde用戶方式恢復后備數據文件。
* 恢復ArcSDE系統文件:如果有必要,在恢復oracle數據之后,需要恢復安裝ArcSDE的程序文件;另外還需要從備份機器上恢復dbtune,giomgr.defs,dbinit.sde,和services.sde文件。
2. SQLServer數據庫
(1)備份和恢復方式
在MS SQL Server中,ArcSDE利用單獨的用戶數據庫SDE(缺省名)來管理和組織空間數據。
SQLServer不僅可以在同一臺服務器上備份和恢復數據庫,還允許通過備份和恢復的方式在不同服務器之間很輕松地移動數據庫。MS SQL Server也允許將一個服務器上的數據庫備份恢復到另外一臺服務器上。
如果要將數據庫備份恢復到另外一臺服務器上,兩臺服務器上的code page和排序方式必須相同。比如,不能把用二進制排序方式(Binary Sort Order,BSO)建立的數據庫恢復到一個配置為缺省排序方式(字典順序,dictionary)的服務器上。當然,可以通過在master數據庫中運行'sp_helpsort'存儲過程設定服務器的排序方式。
數據庫的備份操作同時備份了數據庫的系統表,包括sysusers。當在不同的服務器上執行備份和恢復操作時,備份數據庫中所包含的用戶可能會和新的服務器上master數據庫中sysxlogins表中包含的用戶不同。這樣的話,就無法登錄到恢復后的數據庫,知道更正并統一master數據庫中sysxlogins表和恢復數據庫中sysusers表的登錄映射。要使上述兩個表同步,需要運行"sp_change_users_login"存儲過程。
(2)實現步驟
* 備份SDE數據庫到備份文件:既可以使用T-SQL中的BACKUP語句,也可以使用企業管理器中的備份工具向導來完成SDE和其他空間數據庫的備份。
* 將備份文件復制到目標服務器
* 將備份文件恢復到目標服務器:可以使用企業管理器中的恢復還原工具向導來完成SDE和其他空間數據庫的恢復。
* 統一SDE用戶登錄映射
A. 兩個服務器上都有SDE用戶,但是兩者的SDE用戶具有不同的標識
當恢復SDE數據庫至新的服務器后,sde數據庫中的sde用戶的SID與master數據庫中dbo.sysxlogins表中的sde登錄名的SID不同,比如:
Use sde
go
Select SID from sysusers where name = 'sde'
Use master
go
select SID from sysxlogins where name = 'sde'
SID
-----------------------------------------------------------
0x76695419BFAED41184FD00C04F8D0451
(1 row(s) affected)
SID
-----------------------------------------------------------
0xEDDFCA8E56B0D411850000C04F8D0451
(1 row(s) affected)
此時必須統一兩個表中sde用戶的SID標識,運行"sp_change_users_login" 存儲過程,示例如下:
Use sde
go
sp_change_users_login 'update_one','sde','sde'
運行上述的SID查詢來驗證修改結果:
0xEDDFCA8E56B0D411850000C04F8D0451
0xEDDFCA8E56B0D411850000C04F8D0451
可以看出修改后兩個表中sde用戶的SID標識完全一致,此時就可以啟動ArcSDE for SQLServer的服務來使用了。
B. 目標服務器上還沒有SDE用戶
這種情形是指目標服務器上還沒有sde登錄用戶,此時執行上述的SID查詢,結果如下:
Use sde
go
Select SID from sysusers where name = 'sde'
Use master
go
select SID from sysxlogins where name = 'sde'
SID
-----------------------------------------------------------
0x76695419BFAED41184FD00C04F8D0451
(1 row(s) affected)
SID
-----------------------------------------------------------
(0 row(s) affected)
要矯正這種情況,需要首先到目標服務器中添加sde登錄用戶,但是不要將sde數據庫的權限授予sde用戶。添加登錄用戶,使用"sp_addlogin"存儲過程和在企業管理器中使用登錄管理工具。比如:
sp_addlogin 'sde','go','sde'
然后需要運行 "sp_change_users_login" 存儲過程來統一master內dbo.sysxlogins表和恢復后用戶數據庫內sysusers表中的sde用戶SID標識。
use sde
go
sp_change_users_login 'update_one','sde','sde'
最后,可以執行SID查詢來驗證SID的一致性:
Use sde
Go
Select SID from sysusers where name = 'sde'
Use master
Go
select SID from sysxlogins where name = 'sde'
SID
-----------------------------------------------------------
0xF6DFCA8E56B0D411850000C04F8D0451
(1 row(s) affected)
SID
-----------------------------------------------------------
0xF6DFCA8E56B0D411850000C04F8D0451
(1 row(s) affected)
經過SDE用戶的SID的統一之后,就可以啟動ArcSDE服務或者使用直接連接(direct connection)方式使用恢復后的空間數據了。