大型GIS系统,存储、管理海量(TB级)空间数据时,数据库备份变的尤其重要。这里随笔说说冷备份的一种方法。

基于ArcSDE、Oracle空间库的冷备份:

(1) 在数据入库工作后或者更新变动较大时,全库备份方式比较合适,以应付各种意外情况导致数据库崩溃。

(2) 数据库整库(业务数据和空间数据)需要迁移至其他机器。

 

一、冷备份与恢复

1.1 冷备份的操作流程

这种冷备份的方式的具体流程如下,在cmd中进行:

备注,测试是在Oracle11gR2下进行的。

1.1.1 以sysdba的方式连接Oracle

  输入:

  1>C:\Documents and Settings\Administrator>sqlplus    -回车

  2>请输入用户名:sys  as dba                    -回车

  3>输入口令: *****  输入完回车

 

  此外,2,3>两步也可以按照如下方式进行:

  2>请输入用户名:sys                        -回车

  3>输入口令: ***** as sysdba                 -密码输入过程中看不到字母,输入完回车

 

1.1.2 shutdown数据库

  SQL>shutdown immediate

Oracle空间数据库的备份与恢复_元表

1.1.3 开始拷贝备份数据库

  注意拷贝的文件:

  实例文件:我的存储在安装路径:E:\Files\Oracle\oradata下的orclweng文件夹下,orclweng同时为我的数据库名

Oracle空间数据库的备份与恢复_oracle_02

   确保直接拷贝​​Oracle​​目录下的admin、oradata(datafile, controlfile,redo)、flash_recovery_area三个文件夹,product\11.2.0\dbhome_1\database 目录下database(PWDfile、pfile)、dbs(spfile)、NETWORK/ADMIN(listener.ora、tnsnames.ora),到其他存储实现备份。

 

1.1.4 完成备份

  完成后,startup数据库即可进行下面工作。

Oracle空间数据库的备份与恢复_元表_03

  上述1.3所拷贝备份的数据,即可对数据库进行还原,也可在其他机器上对其他数据库进行恢复,完成数据库的迁移工作,而不必用Catalog去从A库导入B库的方式迁移,适合整库数据迁移

注:

1)移至其他机器的时需要注意,另一台机器需要预先在相同路径下安装好同版本Oracle和ArcSDE

2)首先目标机器的相应数据库需要shutdown后,将备份文件拷贝至其相应路径下,再startup启动数据库即可恢复。

3)保证各个文件是同一时态的文件,shutdown后必须一次性拷贝,不可拷贝部分,启动使用后又拷贝其他部分。

1.2 冷备份的恢复

总体来说包括以下几个方面:

(1).连接数据库  参考上述

(2).shutdown  数据库

(3).拷贝文件

(4).satartup数据库

 

方法一:最简单的方法(需建库)

1.创建一个和原来一样的​​数据库​​。(安装路径和数据库名必须和原来一致)

2.停止数据库 shutdown immediate;

3. 复制安装目录下的admin、oradata、flash_recovery_area覆盖,复制database(PWDfile、pfile) 覆盖

4. 启动数据库 startup;

方法二:(不需建库,稍麻烦点)

(1):​​操作系统​​重装,如果做冷备恢复,要保证相同操作系统,相同的数据库版本。

(2):正常安装oracle软件,只需要安装软件,不用建实例。

(3):数据覆盖,包括数据文件、参数文件、控制文件、日志文件、pwd文件,放在与原系统相同的目录。如果目录有所改变,则需要另外建立控制文件,修改pfile。

(4):建立服务:使用oradim 命令 cmd下 oradim -new -sid gbicc ,表示建立一个服务,sid为gbicc。如果是在​​Linux​​下,不需要此步。

(5):建立监听: net configuration assintant 来建立(建议将源系统的network下的文件拷过来,根据实际情况修改)。

(6):打开数据库: cmd

set oracle_sid=gbicc;

sqlplus /nolog;

Conn / as sysdba;

startup;

至此,冷备份恢复成功。

 

二、imp和exp命令对Oracle9i+SDE空间数据库的整体备份、恢复或迁移

假设:现在需要把OriSDE服务器上的空间数据库迁移到DesSDE服务器上,在创建SDE时二个服务器上的默认用户都是SDE,密码是SDE。OriSDE服务器上还有另外一个SDE数据用户RasterData,密码是RasterData。

1, 备份SDE用户(创建SDE时默认创建的用户)下的所有数据:例如

exp sde/sde@ OriSDE file=c:/sde.dmp

2, 备份其它操作SDE数据的用户,方法同上。例如:

ExpRasterData/RasterData@ OriSDE file=c: RasterData.dmp

3, 停止DesSDE服务器上的服务:

a) 方法1:打开cmd,输入以下语名:sdemon –o shutdown –s DesSDE(服务名) –p SDE(SDE用户的密码),如下图:

注:出现上图中的第二行语句才说明SDE服务已经被成功停止了。

b) 方法2:在控制面板中打到ArcSDE服务后停止它。

注意:一定要确保DesSDE已经被关闭了!才能进行以下的操作!

4, 打开DesSDE上的​​Oracle​​控制台,并以DBA的身份登录DesSDE,然后删除方案SDE下面的所有对象,包括:表、索引、视图、同义词、序列、簇、源类型、用户类型。如下图所示:

一般情况下,删除表、索引,视图后,以下五项已经没有内容了。但是要确定删除了这八项下面的所有内容。

 

5, 在DesSDE Oraccle服务器上建立 RasterData用户,并使其具有的在OriSDE 服务器上相同的表空间、角色和系统权限。

 

6, 导入SDE.dmp到OriSDE数据库中,例如:

Imp sde/sde fromuser=sde file=c:/sde.dmp touser=sde

 

7, 导入数据用户RasterData的数据备份RasterData.dmp

Imp RasterData/RasterData fromuser=RasterData file=c:/RasterData.dmp touser=RasterData

 

8, 重新启动DesSDE服务器上的SDE服务。

a) 方法1,运行CMD,输入以下语名:sdemon –o start –s DesSDE –p SDE

注:出现上图中的第二句话说明启动成功!

b) 方法2,从控制面板/服务里找到ArcSDE服务,启动该服务。

 

9, 打开ArcCatalog,建立与DesSDE的连接,并察看是否能浏览数据,如果可以的话,就说明SDE数据库已经迁移成功了。

  这里主要是SDE用户及其数据的恢复(3、4、5这三个步骤)。因为SDE用户下面保存了所有SDE数据用户的所有表的对应关系,所以这一项的恢复是否成功关系到SDE数据库的迁移是否成功。其它的备份和恢复操作都可以参照oracle 备份和恢复操作进行。

  新服务器上的SDE用户和表空间不要删除。因为在创建SDE服务时,会有一个wise_err.log文件让用户查看创建的结果,从上面我们可以看到有30多个表被创建,还创建了GeoDatabase日志(Creating GeoDatabase Schema),如果没有恢复这些表及日志的把握,最好别删除SDE用户和表空间,否则SDE用户下的数据恢复就很难成功(这可能是因为表没有创建完整的问题),即使成功了,SDE服务也很难启动起来(这可能是因为日志文件的问题)。实践出真知,如果不信,可以试试 (失败了没有关系,可以重新安装SDE的)!

  当然,这只能用于同一版本的SDE之间数据库的恢复或迁移(9.0和9.1视为同版本),在不同版本的SDE空间数据库之间迁移数据库会作另外的论述。

下面是dreambird网友提供的在oracle中批量删除某个用户下面的所有对象的方法:

  其实,我不是什么oracle高手,皮毛而已,否则那些高手会气死的。哈哈,我的qq125861109,欢迎交流。另外,上面的代码我又做了优化,因为某些表有主外键关系时是不允许删除的。我​​测试​​过了,绝对可用。可以在oracle的plsql developer 下运行。



DECLARE
TYPE name_list IS TABLE OF VARCHAR2(40);
TYPE type_list IS TABLE OF VARCHAR2(20);

Tab_name name_list:=name_list();
Tab_type type_list:=type_list();

sql_str VARCHAR2(500);
BEGIN
sql_str := ’select uo.object_name,uo.object_type from user_objects uo where uo.object_type not in('’INDEX'’,'’LOB'’) order by uo.object_type desc’;
EXECUTE IMMEDIATE sql_str BULK COLLECT INTO tab_name,tab_type;

FOR i IN Tab_name.FIRST.. Tab_name.LAST LOOP
if tab_type(i)=’TABLE’ then
sql_str := ‘DROP ‘ || Tab_type(i) || ‘ ‘ || Tab_name(i) || ‘ CASCADE CONSTRAINTS’;
else
sql_str := ‘DROP ‘ || Tab_type(i) || ‘ ‘ || Tab_name(i) ;
end if;
EXECUTE IMMEDIATE sql_str;
END LOOP;
END;


以后考虑做成批处理,这样就方便解决了sde的备份问题。

 

三、使用sdeexport和sdeimport命令对SDE数据库的备份、迁移或恢复





本方法分四个步骤,备份元表,备份数据表,还原元表,还原数据表。

做SDE库的迁移或恢复之前,首先要了解SDE做为空间数据库引擎,它是怎么组织空间数据的,即要知道元表存放的内容和数据表存放的内容。SDE用户是SDE数据库边默认的一个用户,所有的元表存放在该用户下面,元表的作用就是存放数据表之间的关系,约7张数据表才能组成一个要素类,它们之间的关系要靠SDE的元表来维护。因此SDE库的备份就分二个步骤,备份元表,备份数据表。

此方法讲的是采用SDE自带的命令sdeimport和sdeexport备份和导入数据表,即方法的优点是可以在不同的数据库之间进行库的迁移或用于某个要素类恢复(sdeimport和sdeexport命令详见SDE自带的帮助文档)。

首先,备份元表

可以采用sdeexmport命令来备份元表,但本方法采用使用ArcCatalog自带的export工具来备份元表。连接需要备份的SDE库,在需要备份的特征数据集或某个连接上点击右键,再点击export/xml workspace Document 如下图所示:

 

说明:在SDE数据库连接(上图中sdeto sy)上点击右键和在特征数据集(如上图中的upmis.规划历史库)上点击右键备份的元表是不一样的。在数据库连接上点击右键(当然此时连接数据库的用户需要具有操作所有数据的权限,比如SDE用户),备份的是所有的元表信息,而在特征数据集上点击右键,备份的是该特征数据集对应的元表。

选择只备份元表(schema only),选择备份元数据(SDE中的数据的来源等信息)的话会把元数据的也备份。如下图所示:

 

其次,备份数据表

备份数据表采用的命令是sdeexport。在cmd里边执行该命令即可。假如现在我要备份的是upmissde用户下面的jmd要素类,命令如下:

sdeexport -t jmd -f d:/jmd -u upmissde –p pwd -V sde.default

-t:表名(要素类名),-f(存储路径),-u(用户名),-p(密码) ,-V(版本名称)。

当然,如果不是在SDE主机上备份还需要加上-i (端口) ,-s(主机名)这二个参数。

把所有需要备份的要素类都进行备份。

再次,在目标数据库上还原元表

也可以采用sdeimport命令来完成,本方法中同样采用ArcCatalog的import工具来还原元表。

以某个用户名(比如说sde)建立SDE数据库的连接,双击连接后在数据库连接上点击右击,选择import/ xml workspace Document。

需要注意的是,以什么用户登陆,还原的元表记录的就是哪个用户的数据表关系。比如,备份时我是使用upmissde备份的dlg特征数据集,还原元表时我是以sde用户登录的,那么,还原后会在sde用户下面出现一个sde.dlg(本来是upmissde.dlg),这就是此方法的特异之处,可以在不同的用户和不用的SDE版本及不同的数据库(Oracle ,SqlServer)之间进行数据迁移。

最后,还原数据表

同样采用的是使用sdeimport命令进行还原,假如现在我要还原刚才备份出来的jmd到sde用户下面,命令如下:

sdeimport -o append –t jmd -f d:/jmd -u upmissde –pwd –V sde.default

当然,如果不是在SDE主机上备份还需要加上-i (端口) ,-s(主机名)这二个参数。把所有需要备份的要素类都进行备份。

-o的参数选用append的原因是:用ArcCatalog恢复元表的时候,同时会把元表中相关的数据表也创立了,所以-o后面的参数不能再选create了。

如果要素类多备份和恢复麻烦的话,可以写一个批处理程序,哈哈。

本方法的缺点是不能处理多版本的数据,试验如下:

C:/>sdeexport -t pl -f d:/nsyncbin/pl -u vertest -p vertest -V version

ArcSDE 9.1 Oracle9i Build 1269 Thu Mar 3 18:54:58 PST 2005

SDEX File Export Administration Utility

—————————————————–

Exporting ArcSDE object to “d:/nsyncbin/pl” in SDEX 9.0 export format …

Exporting table “pl”.

Spatial column “SHAPE”

2 features converted.

2 features exported.

C:/>sdeimport -o append -t pl -V SDE.DEFAULT -f D:/nsyncbin/pl -u vertest -p ver

test

ArcSDE 9.1 Oracle9i Build 1269 Thu Mar 3 18:54:58 PST 2005

SDEX File Import Administration Utility

—————————————————–

Importing SDEX from D:/nsyncbin/pl …

Importing spatial column “SHAPE”

ROWID colume “OBJECTID” exists in export file’s attribute. Drop

2 records read.

2 records stored.

C:/>sdeimport -o append -t pl -V version -f D:/nsyncbin/pl -u vertest -p vertest

ArcSDE 9.1 Oracle9i Build 1269 Thu Mar 3 18:54:58 PST 2005

SDEX File Import Administration Utility

—————————————————–

Importing SDEX from D:/nsyncbin/pl …

Importing spatial column “SHAPE”

ROWID colume “OBJECTID” exists in export file’s attribute. Drop

2 records read.

2 records stored.

C:/>

在导入之前,VERTEST用户下面,SDE.DEFAULT版本里,PL图层中有一个要素,OID为1,以VERTEST的身份,新建一个版本 version,并在version版本中新建一个要素,OID为2。此时Default版本中只有一个OID=1的要素,而在version版本中有 OID=1,2二个要素。

然后使用sdeexport命令导出(如上所示)

接着,使用sdeimport把数据导入到VERTEST用户的default版本中,此时查看default版本中的数据时,有OID=1,3,4三个要素。

接着,再把数据导入到VERTEST用户的version版本中,此时version版本中的具有OID=1,2,5,6四个要素。

把version版本里边的数据提交到default版本后,default具有OID=1,2,3,4,5,6六个要素,并且在做冲突检查的过程中不会报有冲突。这就是说明在使用该命令备份和恢复多版本的SDE数据库时,也存在局限性。

 

第四种备份的方法(同版本的SDE库的恢复)原作者如今也未兑现承诺,尚未推出,待本人或许有空去解决吧。


 

 

 


你们的评论、反馈,及对你们有所用,是我整理材料和博文写作的最大的鼓励和唯一动力。欢迎讨论和关注!

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。