缩短Oracle数据库迁移过程中的停机时间
欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 你可以组合上述方法来迁移模式对象,比如对小表和模式使用导出/导入方法,而对大表使用在数据库连接上使用"并行直接载入插入法". 3.创建索引并激活约束限制(需要系统停机) * 第一种方法:使用前面
欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入
你可以组合上述方法来迁移模式对象,比如对小表和模式使用导出/导入方法,而对大表使用在数据库连接上使用"并行直接载入插入法".
3.创建索引并激活约束限制(需要系统停机)
* 第一种方法:使用前面所述的导出结构文件来顺序创建索引和约束限制
命令如下:
imp sys/password file=structure.dmp constraints=y indexes=y full=y ignore=y
这种方法有问题-使用导入方式,我们实际上不能指定并发的自定义级别来创建索引,也不能指定NOLOGGING属性。即使我们使用不在正式文件中记 录的特殊参数来关闭对磁盘的重做写操作,NOLOGGING属性仍然能提高性能,通过设置更少的检测点和使用更少的CPU.幸运地,存在一个可以绕过这个 问题的导入特性,它运行我们从导出文件中析取出索引创建脚本。
* 第二种方法:使用导入操作的indexfile选项单独创建索引,然后按照通常方式使用导入创建约束限制。
很长的索引创建时间可以被极大地缩短,当使用并行执行方式和属性nologging时。由于导入的语法本身不允许我们指定创建索引的方式,我们不得不先得到索引创建脚本,然后根据我们的实际需要修改它们。导入的indexfile选项使用起来非常便利,如下所示:
命令如下:
imp sys/password file=structure.dmp constraints=y indexes=y full=y ignore=y \
show=y indexfile=indexes.sql
上面的例子对单独的和约束索引创建都产生了SQL 数据定义语言(DDL)命令(对于关键约束限制和唯一约束限制,一些索引也暗含被创建)。请注意参数show=y,它指定了不能对数据库做改变,导出文件 仅仅是从头至尾扫描一遍,其间发生的任何索引创建都被存储到使用indexfile选项指定的indexes.sql脚本中。
接下来,我们可以使用一个文本编辑器打开这个SQL脚本,然后用NOLOGGING代替LOGGING并对每个大索引创建命令添加PARALLEL 子句。我们也可以在脚本开始处使用更改会话命令来修改某些参数,比如sort_area_size 和 db_file_multiblock_read_count,这两个参数能极大地增加创建索引的速度(更多信息请参见数据库性能调优部分)。修改好以 后,使用sqlplus来运行该脚本。
命令如下:
sqlplus sys/password @indexes.sql
索引文件(indexfile)包含独立索引和外键约束或唯一性约束所需的索引,但是不包含约束限制定义本身。为了创建并激活这些约束限制,我们必须再次对structure.dmp运行导入过程,命令如下:
命令如下:
imp sys/password file=structure.dmp constraints=y indexes=n full=y ignore=y
在上面的命令中我们设置了indexes=n,因为它们在前面的步骤中已经被创建了。同时,因为所有所需的索引都已经存在,创建索引约束应该完成的非常快,由于无需对唯一键/主键创建索引
4.验证自从数据库结构导出后源数据库中没有对象定义被改变(于步骤2或步骤3同时进行)
* 查询上面所述的dba_segments并将任何新对象迁移到新数据库中去,如果合适的话(例如使用企业管理器或者Toad来析取单个对象的"数据定义语 言")。不应该有很多新对象或者根本就不应该有新对象,因为数据库结构导出后由于程序服务器的配置就应该被冻结而不能改变。这个任务通常可以和数据迁移或 索引创建同时进行。
注意:假如你使用"直接载入"并且在相关联表上关闭所有索引的话,不应该产生任何巨大的回滚和重做。这也是为什么在数据载入过程中应关闭主键/惟一键约束限制的原因之一,因为它们都需要索引支持。
[1] [2]