<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>TTA -- when you believe</title>
	<atom:link href="http://www.easyora.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.easyora.net</link>
	<description>想到达明天现在就要启程...</description>
	<pubDate>Wed, 07 Jan 2009 09:06:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>解析INDEX_DESC</title>
		<link>http://www.easyora.net/blog/about_index_desc.html</link>
		<comments>http://www.easyora.net/blog/about_index_desc.html#comments</comments>
		<pubDate>Wed, 07 Jan 2009 08:30:06 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[hints]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=177</guid>
		<description><![CDATA[   oracle执行计划中有类INDEX_DESC提示，我们知道，一般的索引是根据索引列的字段值升序排列，扫描会根据where条件的值判断entry，然后对索引树进行leaf的扫描，在读取leaf的顺序上，INDEX_DESC是个反向的过程，它从树的最后一个leaf往前读取，对于要求从大批量数据中返回少量top large value这类SQL需求来讲，无疑是比较高效的方式
   来看一下/*+ index */和 /*+ index_desc */在读取上的不同。

SQL>create table test tablespace test as select * from dba_objects where object_id is not null order by dbms_random.value;
Table created
SQL> create index idx_test_1 on test(object_id) tablespace test;
Index created
SQL> exec dbms_stats.gather_table_stats(ownname => user,tabname => &#8216;test&#8217;,estimate_percent => 100,cascade => true);
PL/SQL procedure successfully completed
SQL> select /*+ [...]]]></description>
			<content:encoded><![CDATA[<p>   oracle执行计划中有类INDEX_DESC提示，我们知道，一般的索引是根据索引列的字段值升序排列，扫描会根据where条件的值判断entry，然后对索引树进行leaf的扫描，在读取leaf的顺序上，INDEX_DESC是个反向的过程，它从树的最后一个leaf往前读取，对于要求从大批量数据中返回少量top large value这类SQL需求来讲，无疑是比较高效的方式<br />
   来看一下/*+ index */和 /*+ index_desc */在读取上的不同。<br />
<span id="more-177"></span></p>
<blockquote><p>SQL>create table test tablespace test as select * from dba_objects where object_id is not null order by dbms_random.value;<br />
Table created<br />
SQL> create index idx_test_1 on test(object_id) tablespace test;<br />
Index created<br />
SQL> exec dbms_stats.gather_table_stats(ownname => user,tabname => &#8216;test&#8217;,estimate_percent => 100,cascade => true);<br />
PL/SQL procedure successfully completed<br />
SQL> select /*+ index_desc(test,idx_test_1) */ OBJECT_NAME,OBJECT_ID,dbms_rowid.rowid_relative_fno(rowid) FILE_ID,dbms_rowid.rowid_block_number(rowid) BLOCK_ID from test where object_id>0 and rownum<5;<br />
OBJECT_NAME                  OBJECT_ID                         FILE_ID           BLOCK_ID<br />
----------------------------- ---------- ---------------------------------------<br />
TEST                               3030                           8                            121<br />
TEST_CD                            13028                              8                             65<br />
WRH$_SERVICE_WAIT_CLASS_PK         13027                 8                            149<br />
WRH$_SERVICE_WAIT_CLASS_PK         13026                  8                            51</p>
<p>SQL> select /*+ index(test,idx_test_1) */ OBJECT_NAME,OBJECT_ID,dbms_rowid.rowid_relative_fno(rowid) FILE_ID,dbms_rowid.rowid_block_number(rowid) BLOCK_ID from test where object_id>0 and rownum<5;<br />
OBJECT_NAME                 OBJECT_ID                  FILE_ID                       BLOCK_ID<br />
--------------------------- ---------- ------------------------------ ----------------------<br />
C_OBJ#                               2                              8                            112<br />
I_OBJ#                               3                              8                             49<br />
TAB$                                 4                              8                             31<br />
CLU$                                 5                              8                            147</p></blockquote>
<p>可以看到2者获取的row是不同的.<br />
对先前使用index_desc的语句进行10046跟踪，跟踪之前需要flash buffer_cache.这样可以避免干扰的从trace文件看到从磁盘读取到的block。</p>
<blockquote><p>&#8212;<br />
PARSING IN CURSOR #1 len=178 dep=0 uid=28 oct=3 lid=28 tim=1202439326146305 hv=4287804886 ad=&#8217;297b5944&#8242;<br />
select /*+ index_desc(test,idx_test_1) */ OBJECT_NAME,OBJECT_ID,dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from test where object_id>0 and rownum<5<br />
END OF STMT<br />
PARSE #1:c=14998,e=14540,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1202439326146297<br />
EXEC #1:c=0,e=207,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1202439326146604<br />
WAIT #1: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=6314 tim=1202439326146617<br />
WAIT #1: nam='db file sequential read' ela= 26 <span style="color: #ff0000;">file#=8 block#=3610 blocks=1 obj#=13032 tim=1202439326146842</span><br />
WAIT #1: nam=&#8217;db file sequential read&#8217; ela= 117 <span style="color: #ff0000;">file#=8 block#=3633 blocks=1 obj#=13032 tim=1202439326147139</span><br />
WAIT #1: nam=&#8217;db file sequential read&#8217; ela= 12 <span style="color: #ff0000;">file#=8 block#=121 blocks=1 obj#=13030 tim=1202439326147269</span><br />
FETCH #1:c=2000,e=1110,p=3,cr=3,cu=0,mis=0,r=1,dep=0,og=1,tim=1202439326147729<br />
WAIT #1: nam=&#8217;SQL*Net message from client&#8217; ela= 208 driver id=1650815232 #bytes=1 p3=0 obj#=13030 tim=1202439326147991<br />
WAIT #1: nam=&#8217;db file sequential read&#8217; ela= 13 <span style="color: #ff0000;">file#=8 block#=65 blocks=1 obj#=13030 tim=1202439326148117</span><br />
WAIT #1: nam=&#8217;SQL*Net message to client&#8217; ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=13030 tim=1202439326148171<br />
WAIT #1: nam=&#8217;db file sequential read&#8217; ela= 21 <span style="color: #ff0000;">file#=8 block#=149 blocks=1 obj#=13030 tim=1202439326148263</span><br />
WAIT #1: nam=&#8217;db file sequential read&#8217; ela= 16 <span style="color: #ff0000;">file#=8 block#=51 blocks=1 obj#=13030 tim=1202439326148353</span><br />
FETCH #1:c=0,e=369,p=3,cr=4,cu=0,mis=0,r=3,dep=0,og=1,tim=1202439326148400<br />
*** 2009-01-07 11:11:26.616<br />
WAIT #1: nam=&#8217;SQL*Net message from client&#8217; ela= 16250106 driver id=1650815232 #bytes=1 p3=0 obj#=13030 tim=1202439342398571<br />
STAT #1 id=1 cnt=4 pid=0 pos=1 obj=0 op=&#8217;COUNT STOPKEY (cr=7 pr=6 pw=0 time=751 us)&#8217;<br />
STAT #1 id=2 cnt=4 pid=1 pos=1 obj=13030 op=&#8217;TABLE ACCESS BY INDEX ROWID TEST (cr=7 pr=6 pw=0 time=727 us)&#8217;<br />
STAT #1 id=3 cnt=4 pid=2 pos=1 obj=13032 op=&#8217;INDEX RANGE SCAN DESCENDING IDX_TEST_1 (cr=3 pr=2 pw=0 time=583 us)&#8217;<br />
=====================<br />
PARSING IN CURSOR #2 len=55 dep=0 uid=28 oct=42 lid=28 tim=1202439342398576 hv=2217940283 ad=&#8217;0&#8242;<br />
alter session set events &#8216;10046 trace name context off&#8217;<br />
END OF STMT<br />
PARSE #2:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1202439342398576<br />
EXEC #2:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1202439342398576<br />
&#8212;-</p></blockquote>
<p>  读取顺序为<strong>file#=8 block#=3610&#8211;file#=8 block#=3633&#8211;file#=8 block#=121&#8211;file#=8 block#=65&#8211;file#=8 block#=149</strong><br />
比较明显可以看出121-65-149 跟我们先前查询出来的结果顺序是一致的。为了更加清楚的显示读取过程，我们对idx_test_1进行treedump</p>
<blockquote><p>SQL> select object_id from dba_objects where object_name=&#8217;IDX_TEST_1&#8242;;<br />
OBJECT_ID<br />
&#8212;&#8212;&#8212;-<br />
     13032<br />
SQL> ALTER SESSION SET EVENTS &#8216;immediate trace name TREEDUMP level 13032&#8242;;<br />
Session altered.</p></blockquote>
<blockquote><p>&#8212;&#8211; begin tree dump<br />
<span style="color: #ff0000;">branch: 0&#215;2000e1a  33558042 (0: nrow: 23, level: 1)</span><br />
   leaf: 0&#215;2000e1b 33558043 (-1: nrow: 485 rrow: 485)<br />
   leaf: 0&#215;2000e1c 33558044 (0: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e1d 33558045 (1: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e1e 33558046 (2: nrow: 478 rrow: 478)<br />
   leaf: 0&#215;2000e1f 33558047 (3: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e20 33558048 (4: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e21 33558049 (5: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e22 33558050 (6: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e23 33558051 (7: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e24 33558052 (8: nrow: 478 rrow: 478)<br />
   leaf: 0&#215;2000e25 33558053 (9: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e26 33558054 (10: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e27 33558055 (11: nrow: 478 rrow: 478)<br />
   leaf: 0&#215;2000e28 33558056 (12: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e29 33558057 (13: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e2a 33558058 (14: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e2b 33558059 (15: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e2c 33558060 (16: nrow: 478 rrow: 478)<br />
   leaf: 0&#215;2000e2d 33558061 (17: nrow: 479 rrow: 479)<br />
   leaf: 0&#215;2000e2e 33558062 (18: nrow: 460 rrow: 460)<br />
   leaf: 0&#215;2000e2f 33558063 (19: nrow: 448 rrow: 448)<br />
   leaf: 0&#215;2000e30 33558064 (20: nrow: 449 rrow: 449)<br />
<span style="color: #ff0000;">leaf: 0&#215;2000e31 33558065 (21: nrow: 6 rrow: 6)</span><br />
&#8212;-</p></blockquote>
<p>第1次io file#=8 block#=3610 读取的block为索引的root节点所在的block &#8212; 对应treedump里面 branch: 0&#215;2000e1a  33558042 (0: nrow: 23, level: 1)<br />
第2次io file#=8 block#=3633 读取的block为索引树的最后一个leaf &#8212; 对应treedump里面      leaf: 0&#215;2000e31 33558065 (21: nrow: 6 rrow: 6)<br />
以下io便是对leaf: 0&#215;2000e31 33558065所存的条目进行回表访问。<br />
DUMP leaf: 0&#215;2000e31 33558065,也就是file#=8 block#=3633。<br />
转换关系如下：</p>
<blockquote><p>
SQL> select  dbms_utility.data_block_address_file(33558065) file_id#,dbms_utility.data_block_address_block(33558065) block_id# from dual;</p>
<p>  FILE_ID#  BLOCK_ID#<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
         8       3633<br />
SQL> alter system dump datafile 8 block 3633;
</p></blockquote>
<blockquote><p>
Leaf block dump<br />
===============<br />
header address 216754268=0xceb685c<br />
kdxcolev 0<br />
KDXCOLEV Flags = - - -<br />
kdxcolok 0<br />
kdxcoopc 0&#215;80: opcode=0: iot flags=&#8212; is converted=Y<br />
kdxconco 2<br />
kdxcosdc 0<br />
kdxconro 6<br />
kdxcofbo 48=0&#215;30<br />
kdxcofeo 7948=0&#215;1f0c<br />
kdxcoavs 7900<br />
kdxlespl 0<br />
kdxlende 0<br />
kdxlenxt 0=0&#215;0<br />
kdxleprv 33558064=0&#215;2000e30<br />
kdxledsz 0<br />
kdxlebksz 8032<br />
row#0[8018] flag: &#8212;&#8212;, lock: 0, len=14<br />
col 0; len 4; (4):  c3 02 1f 18<br />
col 1; len 6; (6):  <span style="color: #ff0000;">02 00 01 09 00 01  &#8212;-对应datafile 8，block 265</span><br />
row#1[8004] flag: &#8212;&#8212;, lock: 0, len=14<br />
col 0; len 4; (4):  c3 02 1f 1a<br />
col 1; len 6; (6):  <span style="color: #ff0000;">02 00 00 59 00 41  &#8212;-对应datafile 8，block 89</span><br />
row#2[7990] flag: &#8212;&#8212;, lock: 0, len=14<br />
col 0; len 4; (4):  c3 02 1f 1b<br />
col 1; len 6; (6):  <span style="color: #ff0000;">02 00 00 33 00 4d  &#8212;-对应datafile 8，block 51</span><br />
row#3[7976] flag: &#8212;&#8212;, lock: 0, len=14<br />
col 0; len 4; (4):  c3 02 1f 1c<br />
col 1; len 6; (6):  <span style="color: #ff0000;">02 00 00 95 00 46  &#8212;-对应datafile 8，block 149</span><br />
row#4[7962] flag: &#8212;&#8212;, lock: 0, len=14<br />
col 0; len 4; (4):  c3 02 1f 1d<br />
col 1; len 6; (6):  <span style="color: #ff0000;">02 00 00 41 00 23  &#8212;-对应datafile 8，block 65</span><br />
row#5[7948] flag: &#8212;&#8212;, lock: 0, len=14<br />
col 0; len 4; (4):  c3 02 1f 1f<br />
col 1; len 6; (6):  <span style="color: #ff0000;">02 00 00 79 00 04  &#8211;对应datafile 8，block 121 </span><br />
&#8212;&#8211; end of leaf block dump &#8212;&#8211;
</p></blockquote>
<p>转换关系&#8211;<br />
col 1; len 6; (6)转换成64位，<br />
前10位=>file  id<br />
中22位=>block id<br />
后16位=>row   id</p>
<p>看一下执行计划成本情况</p>
<blockquote><p>[oracle@test1 getsql]$ ./get_sql.sh 2 2570394218</p>
<p>SQL_TEXT<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
select * from (select /*+ index(test,idx_test_1) */ * from test<br />
where object_id>0 order by object_id desc) where rownum<10</p>
<p> ID P_ID execution_plan                                         COST CARDINALITY    BYTES<br />
--- ---- -------------------------------------------------- -------- ----------- --------<br />
  0      SELECT STATEMENT                                      10606<br />
  1    0     COUNT STOPKEY<br />
  2    1         VIEW                                          10606       10466  1852482<br />
  3    2             SORT ORDER BY STOPKEY                     10606       10466   889610<br />
  4    3                 TABLE ACCESS BY INDEX ROWID TEST      10396       10466   889610<br />
  5    4                     INDEX RANGE SCAN IDX_TEST_1          24       10466</p>
<p>[oracle@test1 getsql]$ ./get_sql.sh 2 3221081669</p>
<p>SQL_TEXT<br />
--------------------------------------------------------------------------------<br />
select * from (select /*+ index_desc(test,idx_test_1) */ * from<br />
test where object_id>0 order by object_id desc) where rownum<10</p>
<p>ID P_ID execution_plan                                         COST CARDINALITY    BYTES<br />
--- ---- -------------------------------------------------- -------- ----------- --------<br />
  0      SELECT STATEMENT                                         11<br />
  1    0     COUNT STOPKEY<br />
  2    1         VIEW                                             11           9     1593<br />
  3    2             TABLE ACCESS BY INDEX ROWID TEST             11           9      765<br />
  4    3                 INDEX RANGE SCAN DESCENDING IDX_TEST_1    2       10466    </p></blockquote>
<p>    在10gR2版本下，oracle会根据成本计算自动选择index_desc方式来作为最优的执行计划，9i下未做测试验证。
<ul class="related_post">
<li><a href="http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html" title="9i RAC静默升级至10g RAC">9i RAC静默升级至10g RAC</a></li>
<li><a href="http://www.easyora.net/blog/heartbeat_oracle_ha.html" title="[HA]利于heartbeat构建Oracle高可用">[HA]利于heartbeat构建Oracle高可用</a></li>
<li><a href="http://www.easyora.net/blog/scn_block_scn.html" title="SCN之 Block scn/commit scn/delayed block cleanout">SCN之 Block scn/commit scn/delayed block cleanout</a></li>
<li><a href="http://www.easyora.net/blog/troubleshooting_assemble.html" title="[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.">[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.</a></li>
<li><a href="http://www.easyora.net/blog/about_dbms_scheduler.html" title="小议Oracle 调度程序作业( dbms_scheduler )">小议Oracle 调度程序作业( dbms_scheduler )</a></li>
<li><a href="http://www.easyora.net/blog/prebuild_mv_trans_db.html" title="利用prebuild MV快速迁移跨平台数据库实施及其总结">利用prebuild MV快速迁移跨平台数据库实施及其总结</a></li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/about_index_desc.html&title=%E8%A7%A3%E6%9E%90INDEX_DESC&tags=hints, oracle, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/about_index_desc.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>9i RAC静默升级至10g RAC</title>
		<link>http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html</link>
		<comments>http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html#comments</comments>
		<pubDate>Sun, 21 Dec 2008 10:06:02 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[oracle]]></category>

		<category><![CDATA[rac静默升级]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=165</guid>
		<description><![CDATA[   周末帮朋友升级了一个9i rac的数据库，版本是9.2.0.4/操作系统 redflag，需要升级到10g rac (10.2.0.4),由于数据量不算小而且属于同机升级，决定不采用逻辑导入导出的方式，安装好10.2.0.4的版本的crs和db后，直接升级数据字典.]]></description>
			<content:encoded><![CDATA[<p>   周末帮朋友升级了一个9i rac的数据库，版本是9.2.0.4/操作系统 redflag，数据文件采用裸设备,需要升级到10g rac (10.2.0.4),由于数据量不算小而且属于同机升级，决定不采用逻辑导入导出的方式，安装好10.2.0.4的版本的crs和db后，直接升级数据字典.<br />
<span id="more-165"></span><br />
   由于当时环境限制比较多，不能采用图形化界面操作，于是整个过程在静默模式下完成，中间碰到了一点点问题，算是顺利完成。<br />
   以下是升级过程。<br />
  <strong> <一> 安装前准备工作</strong><br />
   <strong>1.备份9i rac数据库软件以及数据库文件</strong><br />
   <strong>2.10g rac环境准备 </strong><br />
   (1).创建用于10gR2 CRS 所需的OCR和vote disk(采用裸设备)</p>
<blockquote><p>[root@node1 install]#lvcreate -L200M -nocr vgdata<br />
[root@node1 install]#lvcreate -L200M -nvotingdisk vgdata</p></blockquote>
<p>在两节点对新加入lv激活并做裸设备绑定/授权<br />
   (2).创建相应目录,配置环境(编辑/etc/hosts,profile,创建ssh互信节点等&#8230;)<br />
<strong>   <二>静默安装10.2.0.1版本软件并打10.2.0.4patch</strong><br />
<strong>   1.静默安装crs</strong>先安装10.2.0.1</p>
<blockquote><p>[oracle@node1 install]$./runInstaller  -silent  -force -ignoreSysprereqs -responseFile  /home/oracle/crs.rsp</p></blockquote>
<p>  安装过程会出错，需要手工在两节点执行/opt/oracle/product/10.2.0/crs_1/root.sh.在第二节点执行root.sh的会抛出异常，</p>
<blockquote><p>Running vipca(silent) for configuring nodeapps<br />
The given interface(s), &#8220;eth0&#8243; is not public. Public interfaces should be used to configure virtual IPs. </p></blockquote>
<p>这是10.2.0.1下面的一个bug，必须用root用户以<strong>OUI</strong>方式来执行vipca，由于没有图形界面环境，所以这个错误暂时不理，关闭每个节点上的crs服务，直接打10.2.0.4补丁，打完补丁后，再静默调用vipca.</p>
<blockquote><p>[root@node1 install]#/opt/oracle/product/10.2.0.4/crs_1/vipca  -silent -nodelist node1 -nodevips node1/node1-vip/255.255.255.0/eth1<br />
[root@node1 install]#/opt/oracle/product/10.2.0.4/crs_1/vipca  -silent -nodelist node2 -nodevips node2/node2-vip/255.255.255.0/eth1</p></blockquote>
<p>执行成功后，查看：</p>
<blockquote><p>[oracle@node1 ~]$ crs_stat -t<br />
Name           Type           Target    State     Host<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
ora.node1.gsd  application    ONLINE    ONLINE    node1<br />
ora.node1.ons  application    ONLINE    ONLINE    node1<br />
ora.node1.vip  application    ONLINE    ONLINE    node1<br />
ora.node2.gsd  application    ONLINE    ONLINE    node2<br />
ora.node2.ons  application    ONLINE    ONLINE    node2<br />
ora.node2.vip  application    ONLINE    ONLINE    node2</p></blockquote>
<p>  接下来执行</p>
<blockquote><p>[oracle@node1 ~]$/opt/oracle/product/10.2.0/crs_1/cfgtoollogs/configToolFailedCommands</p></blockquote>
<p>用以配置ons和oifcfg<br />
<strong>  2.静默安装datbase software</strong><br />
  同样，先安装10.2.0.1，然后patch到10.2.0.4</p>
<blockquote><p>[oracle@node1 install]$./runInstaller –silent –force -ignoreSysprereqs –responseFile /home/oracle/db_software.rsp</p></blockquote>
<p><strong><三>升级数据库</strong></p>
<p><strong>1.准备10g database启动环境</strong></p>
<p>copy 9i目录下dbs文件目录到10g对应目录下，编辑参数文件，配置shared_pool java_pool的大小，修改cluster_database=false,并去掉相关废弃参数.</p>
<p><strong>2.启动数据库并升级数据字典</strong></p>
<p>(1)创建sysaux表空间</p>
<blockquote><p>SQL>startup upgrade pfile=&#8217;/home/oracle/pfiletmp.ora&#8217;;<br />
SQL>CREATE TABLESPACE sysaux DATAFILE &#8216;/oradata/test/sysaux01.dbf&#8217; SIZE 500M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO</p></blockquote>
<p>(2) 升级数据字典</p>
<blockquote><p>SQL>@?/rdbms/admin/catupgrd<br />
&#8211;show upgrade result<br />
SQL>@?/rdbms/admin/utlu102s.sql</p></blockquote>
<p>升级完毕后，关闭数据库，修改参数文件并创建成spfile，正常启动后，编译失效的对象</p>
<blockquote><p>SQL>@?/rdbms/admin/utlrp</p></blockquote>
<p><strong><四>注册资源</strong></p>
<p><strong>1.注册监听</strong><br />
采用crs_register的方式注册编写的ora.node1.LISTENER_NODE1.lsnr.cap文件</p>
<blockquote><p>[oracle@node1 admin]$ crs_register ora.node1.LISTENER_NODE1.lsnr -dir /home/oracle</p></blockquote>
<blockquote><p>[oracle@node1 admin]$ crs_register ora.node2.LISTENER_NODE2.lsnr -dir /home/oracle</p></blockquote>
<p><strong>2.注册database和instance</strong></p>
<blockquote><p>[oracle@node1 admin]$ srvctl add database -d gzfk<br />
[oracle@node1 admin]$ srvctl add instance -d gzfk -i test1 -n  node1<br />
[oracle@node1 admin]$ srvctl add instance -d gzfk -i test2 -n  node2<br />
[oracle@node1 admin]$ crs_stat -t<br />
Name           Type           Target    State     Host<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
ora&#8230;.E1.lsnr application    ONLINE    ONLINE    node1<br />
ora&#8230;.E2.lsnr application    ONLINE    ONLINE    node2<br />
ora.node1.gsd  application    ONLINE    ONLINE    node1<br />
ora.node1.ons  application    ONLINE    ONLINE    node1<br />
ora.node1.vip  application    ONLINE    ONLINE    node1<br />
ora.node2.gsd  application    ONLINE    ONLINE    node2<br />
ora.node2.ons  application    ONLINE    ONLINE    node2<br />
ora.node2.vip  application    ONLINE    ONLINE    node2<br />
ora.fzfk.db    application    ONLINE    ONLINE    node1<br />
ora&#8230;.k1.inst application    ONLINE   ONLINE     node1<br />
ora&#8230;.k2.inst application    ONLINE    ONLINE    node2   </p></blockquote>
<p>接下来做一系列收尾和配置工作.</p>
<ul class="related_post">
<li><a href="http://www.easyora.net/blog/about_index_desc.html" title="解析INDEX_DESC">解析INDEX_DESC</a></li>
<li><a href="http://www.easyora.net/blog/heartbeat_oracle_ha.html" title="[HA]利于heartbeat构建Oracle高可用">[HA]利于heartbeat构建Oracle高可用</a></li>
<li><a href="http://www.easyora.net/blog/scn_block_scn.html" title="SCN之 Block scn/commit scn/delayed block cleanout">SCN之 Block scn/commit scn/delayed block cleanout</a></li>
<li><a href="http://www.easyora.net/blog/troubleshooting_assemble.html" title="[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.">[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.</a></li>
<li><a href="http://www.easyora.net/blog/about_dbms_scheduler.html" title="小议Oracle 调度程序作业( dbms_scheduler )">小议Oracle 调度程序作业( dbms_scheduler )</a></li>
<li><a href="http://www.easyora.net/blog/prebuild_mv_trans_db.html" title="利用prebuild MV快速迁移跨平台数据库实施及其总结">利用prebuild MV快速迁移跨平台数据库实施及其总结</a></li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html&title=9i+RAC%E9%9D%99%E9%BB%98%E5%8D%87%E7%BA%A7%E8%87%B310g+RAC&tags=oracle, rac静默升级, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>下午部署DG，顺手写的几个dg维护脚本/</title>
		<link>http://www.easyora.net/blog/scripts_list.html</link>
		<comments>http://www.easyora.net/blog/scripts_list.html#comments</comments>
		<pubDate>Thu, 11 Dec 2008 11:43:36 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=152</guid>
		<description><![CDATA[   下午给项目搭建了套DG，没啥好说的，顺手写了几个脚本，后面还需完善完善.
1.主备库开机自动启动(自动判断库运行模式，如果为Primary ，则启动到open状态，如果为Standby，则启动到recover managed standby database状态）

#!/bin/sh
#Author:Kevin.yuan
#Create_Time:2008-12-11
#Description:
   #1.The script just put /etc/init.d/rc.local ==> su - oracle -c &#8220;/home/oracle/dbstart.sh
   #2.The script is used to startup the datbase automatically when the OS is up.If the database is primary role,then &#8220;alter database open&#8221;, if the role is standby,then &#8220;recover managed standby database&#8230;&#8221;
#This function [...]]]></description>
			<content:encoded><![CDATA[<p>   下午给项目搭建了套DG，没啥好说的，顺手写了几个脚本，后面还需完善完善.<br />
1.主备库开机自动启动(自动判断库运行模式，如果为Primary ，则启动到open状态，如果为Standby，则启动到recover managed standby database状态）<br />
<span id="more-152"></span></p>
<blockquote><p>#!/bin/sh<br />
#Author:Kevin.yuan<br />
#Create_Time:2008-12-11<br />
#Description:<br />
   #1.The script just put /etc/init.d/rc.local ==> su - oracle -c &#8220;/home/oracle/dbstart.sh<br />
   #2.The script is used to startup the datbase automatically when the OS is up.If the database is primary role,then &#8220;alter database open&#8221;, if the role is standby,then &#8220;recover managed standby database&#8230;&#8221;</p>
<p>#This function is used to get the database&#8217;s current role (Primary: 1 /Standby 2 Other(error) 3)<br />
get_role()<br />
{<br />
sqlplus -s &#8220;/as sysdba&#8221; << !<br />
startup mount;<br />
spool /home/oracle/jurge_role.log<br />
set head off<br />
set feedback off<br />
select database_role from v\$database;<br />
spool off<br />
exit;<br />
!<br />
role=`cat /home/oracle/jurge_role.log|tail -1`<br />
if [ $role = "PRIMARY" ]<br />
then<br />
return 1<br />
elif [ $role = "STANDBY" ]<br />
then<br />
return 2<br />
else<br />
return 3<br />
fi<br />
}<br />
#-----main begin------<br />
source /home/oracle/.bash_profile<br />
lsnrctl start<br />
get_role<br />
role_stat=$?<br />
if [ $role_stat -eq 1 ]<br />
then<br />
sqlplus -s "/as sysdba"<< !<br />
alter database open;<br />
exit<br />
!<br />
elif [ $role_stat -eq 2 ]<br />
then<br />
sqlplus -s "/as sysdba"<< !<br />
alter database recover managed standby database disconnect from session;<br />
exit<br />
!<br />
fi</p></blockquote>
<p>2.定期自动删除主库/备库端已经在备库上apply过的归档日志，我不太喜欢用OS命令下的rm删除归档，容易出毛病，而且不灵便，还是喜欢调用Rman的delete archivelog命令.</p>
<blockquote><p>#!/bin/sh<br />
#Create_time:2008.12.11<br />
#Author:Kevin.yuan<br />
#Description:Delete the archived logs which had applied on Standby database using Rman.<br />
source /home/oracle/.bash_profile<br />
Dir=/opt/oracle/script/standby<br />
cd $Dir<br />
echo &#8220;rman target / log rman_delete_arch.log  append << !">rman_delete_arch.sh<br />
echo &#8220;crosscheck archivelog all;&#8221;>>rman_delete_arch.sh<br />
sqlplus -s &#8220;sys/sys@paybilldg as sysdba&#8221;>>rman_delete_arch.sh << !<br />
set head off<br />
set feedback off<br />
select 'delete noprompt archivelog until logseq '||max(sequence#)||';' from v\$log_history;<br />
exit<br />
!<br />
echo "exit;">>rman_delete_arch.sh<br />
echo &#8220;!&#8221;>>rman_delete_arch.sh<br />
sed -i &#8216;/^$/d&#8217; rman_delete_arch.sh<br />
##delete the archived logs<br />
sh rman_delete_arch.sh</p></blockquote>
<p>不过还是写了一个利用os的rm命令来删除的脚本.</p>
<blockquote><p>#!/bin/sh<br />
#Create_time:2008.12.11<br />
#Author:Kevin.yuan<br />
#Description:Delete the archived logs which had applied on Standby database Using os command.<br />
source /home/oracle/.bash_profile<br />
##Here is the primay/standby archive dest<br />
Arch_dest=/archive/test<br />
Sc_dir=/opt/oracle/script/standby<br />
cd $Sc_dir<br />
sqlplus -s &#8220;sys/sys@paybilldg as sysdba&#8221;>standby.log << !<br />
set head off<br />
set feedback off<br />
select '1_'||a.SEQUENCE#||'_'||a.RESETLOGS_ID||'.dbf' from v$archived_log a where a.APPLIED='YES' and  first_time>sysdate-8;<br />
exit<br />
!<br />
##<br />
cat /dev/null>rm_arch.sh<br />
for i in `ls -l $Arch_dest|grep &#8216;1_&#8217;|awk &#8216;{print $NF}&#8217;` ; do<br />
for j in `cat standby.log` ; do<br />
if [ $i = $j ]<br />
then<br />
if [ `grep $i rm_arch.sh|wc -l` -eq 0 ]<br />
then<br />
echo &#8220;rm -f $Arch_dest/&#8221;$i>>rm_arch.sh<br />
fi<br />
fi<br />
done<br />
done<br />
sh rm_arch.sh</p></blockquote>
<ul class="related_post">
<li>No Related Post</li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/scripts_list.html&title=%E4%B8%8B%E5%8D%88%E9%83%A8%E7%BD%B2DG%EF%BC%8C%E9%A1%BA%E6%89%8B%E5%86%99%E7%9A%84%E5%87%A0%E4%B8%AAdg%E7%BB%B4%E6%8A%A4%E8%84%9A%E6%9C%AC%2F&tags="><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/scripts_list.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[HA]利于heartbeat构建Oracle高可用</title>
		<link>http://www.easyora.net/blog/heartbeat_oracle_ha.html</link>
		<comments>http://www.easyora.net/blog/heartbeat_oracle_ha.html#comments</comments>
		<pubDate>Fri, 24 Oct 2008 04:05:35 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[ha]]></category>

		<category><![CDATA[oracle]]></category>

		<category><![CDATA[双机热备]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=116</guid>
		<description><![CDATA[利于heartbeat构建Oracle双机热备体系]]></description>
			<content:encoded><![CDATA[<p>    Linux下有很多集群软件,不同程度的在企业的高可用和负载均衡环境中发挥着作用. Heartbeat作为Linux-HA项目组开发出来的一套开源软件,也可以为应用/系统提供高可用服务.官方网站这样描述它:<br />
<span id="more-116"></span></p>
<blockquote><p>Heartbeat currently supports a very sophisticated dependency model for n-node clusters. It is both extremely useful and quite stable at this point in time. The following types of applications are typical:<br />
•	Database servers<br />
•	ERP applications<br />
•	Web servers<br />
•	LVS director (load balancer) servers<br />
•	Mail servers<br />
•	Firewalls<br />
•	File servers<br />
•	DNS servers<br />
•	DHCP servers<br />
•	Proxy Caching servers<br />
•	Custom applications<br />
•	etc. </p></blockquote>
<p>相应版本可以从<a href="http://www.linux-ha.org/">http://www.linux-ha.org/</a>下载.<br />
下面就让我们来搭建一套基于heartbeat的oracle双机热备体系.</p>
<blockquote><p>物理需求:</p></blockquote>
<p>两台主机(双网卡或者使用心跳线连接2-node),共享磁盘.</p>
<blockquote><p>环境描述:</p></blockquote>
<p>  本次搭建在CentOS 4.4下,使用网卡eth1作为node互联. heartbeat.版本为2.1.4. 数据库版本为10.2.0.1,数据库文件创建在/oradata上,各nodeIP分配如下:</p>
<blockquote><p>HA1&#8211; eth0:192.168.18.201 eth1:10.10.10.201<br />
HA2&#8211;eth0:192.168.18.202 eth1:10.10.10.202<br />
Active IP: 192.168.18.200 </p></blockquote>
<p>1.	分别在2节点安装heartbeat软件,我下载的是rpm包并打齐必要的依赖包.</p>
<blockquote><p>heartbeat-2.1.4-2.1.i386.rpm<br />
heartbeat-devel-2.1.4-2.1.i386.rpm<br />
heartbeat-ldirectord-2.1.4-2.1.i386.rpm<br />
heartbeat-pils-2.1.4-2.1.i386.rpm<br />
heartbeat-stonith-2.1.4-2.1.i386.rpm<br />
ipvsadm-1.24-6.i386.rpm<br />
libnet-1.1.2.1-2.1.i386.rpm<br />
…….>></p></blockquote>
<p>2.在2节点本地安装database softwore,并在一个节点上创建配置database.数据库文件需要创建到共享磁盘上.<br />
3.在2节点上配置heartbeat.(需要用到的主要有3个配置文件. ha.cf/ authkeys/ haresources,分别在/etc/ha.d/路径下)<br />
(1) ha.cf. HA服务配置文件</p>
<blockquote><p>logfile /var/log/ha-log   # Log file address<br />
keepalive 2    # Heartbeat interval<br />
deadtime 20   # dead time<br />
warntime 10   # warning time<br />
udpport 694   # Heartbeat port<br />
bcast eth1     # Linux Heartbeat interface<br />
auto_failback off # the failure node automatic comes back automaticly<br />
node ha1     # list node<br />
node ha2     # list node<br />
ping 192.168.18.1  #check the node health status;<br />
respawn hacluster /usr/lib/heartbeat/ipfail </p></blockquote>
<p>(2) authkeys. 双机互联验证文件,本次搭建采用的是crc模式.</p>
<blockquote><p>auth 1<br />
1 crc</p></blockquote>
<p>注意权限:chmod 600 authkeys<br />
(3) haresources. 配置资源文件,这个是heartbeat提供服务的关键.</p>
<blockquote><p>ha1 192.168.18.200 oradb</p></blockquote>
<p>ha1:主节点名称<br />
192.168.18.200: 提供的active ip<br />
oradb:高可用服务,在本次搭建中,需要用oradb来实现节点切换后的database启动/停止.<br />
Heartbeat将从/etc/init.d 或者/etc/ha.d/resource.d 来搜索这个脚本.<br />
我将它放到/etc/ha.d/resource.d下,以下是个简化功能的script:</p>
<blockquote><p>#!/bin/sh<br />
# kevinyuan 2008/10/24<br />
#It’s used to startup/shutdown oracle database<br />
export ORACLE_BASE=/opt/oracle<br />
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1<br />
export ORACLE_SID=ha<br />
export PATH=/home/oracle/bin:$ORACLE_HOME/bin:$PATH<br />
MOUNTDEV=/dev/sdb1<br />
MOUNTPOINT=/oradata<br />
case $1 in<br />
    start)<br />
    mount $MOUNTDEV $MOUNTPOINT<br />
su – oracle –c “dbstart”<br />
 ;;<br />
    stop)<br />
su – oracle –c “dbshut”<br />
fuser -k  -m -v $MOUNTPOINT<br />
umount $MOUNTPOINT<br />
    ;;<br />
    *)<br />
    echo &#8220;Usage: $0 {start|stop}&#8221;<br />
    ;;<br />
esac</p></blockquote>
<p>其中dbstart 和dbshut是调用了$ORACLE_HOME/bin下面的dbstart 和dbshut,作用是启动/停止数据库和监听.</p>
<p>3.数据库监听和tnsnames.ora配置<br />
两节点上的Listener.ora 中IP可以配置成Active ip,这样在各个tnsnames.ora里面就需要使用这个Active ip,在本例为192.168.18.200.<br />
也可以两节点上Listener.ora 中IP仍然使用各自真实IP,这样tnsnames.ora需要配置connect-time failover策略,如下:</p>
<blockquote><p>HA =<br />
  (DESCRIPTION =<br />
    (ADDRESS_LIST =<br />
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.201)(PORT = 1521))<br />
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.18.202)(PORT = 1521))<br />
    )<br />
    (CONNECT_DATA =<br />
      (SERVICE_NAME = ha)<br />
    )<br />
  )</p></blockquote>
<p>4.	简单测试 </p>
<blockquote><p>SQL> conn sys/mecoyoo@ha<br />
Connected.<br />
SQL> !hostname<br />
Ha1</p></blockquote>
<p>  在ha1上,停掉网卡,然后重新连接sqlplus,查询</p>
<blockquote><p>SQL> conn sys/mecoyoo@ha<br />
Connected.<br />
SQL> !hostname<br />
Ha2</p></blockquote>
<p>此时连接已经从ha1转移到ha2上.<br />
Ha2:</p>
<blockquote><p>ha2-> ps -ef|grep ora_|wc -l<br />
17</p></blockquote>
<p> Ha1:</p>
<blockquote><p>ha1-> ps -ef|grep ora_|wc –l<br />
1</p></blockquote>
<p>  基本功能得以实现,后续将进一步测试,看是否满足要求.</p>
<ul class="related_post">
<li><a href="http://www.easyora.net/blog/about_index_desc.html" title="解析INDEX_DESC">解析INDEX_DESC</a></li>
<li><a href="http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html" title="9i RAC静默升级至10g RAC">9i RAC静默升级至10g RAC</a></li>
<li><a href="http://www.easyora.net/blog/scn_block_scn.html" title="SCN之 Block scn/commit scn/delayed block cleanout">SCN之 Block scn/commit scn/delayed block cleanout</a></li>
<li><a href="http://www.easyora.net/blog/troubleshooting_assemble.html" title="[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.">[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.</a></li>
<li><a href="http://www.easyora.net/blog/about_dbms_scheduler.html" title="小议Oracle 调度程序作业( dbms_scheduler )">小议Oracle 调度程序作业( dbms_scheduler )</a></li>
<li><a href="http://www.easyora.net/blog/prebuild_mv_trans_db.html" title="利用prebuild MV快速迁移跨平台数据库实施及其总结">利用prebuild MV快速迁移跨平台数据库实施及其总结</a></li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/heartbeat_oracle_ha.html&title=%5BHA%5D%E5%88%A9%E4%BA%8Eheartbeat%E6%9E%84%E5%BB%BAOracle%E9%AB%98%E5%8F%AF%E7%94%A8&tags=ha, oracle, 双机热备, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/heartbeat_oracle_ha.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>SCN之 Block scn/commit scn/delayed block cleanout</title>
		<link>http://www.easyora.net/blog/scn_block_scn.html</link>
		<comments>http://www.easyora.net/blog/scn_block_scn.html#comments</comments>
		<pubDate>Thu, 23 Oct 2008 06:24:19 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[block scn]]></category>

		<category><![CDATA[delayed block cleanout]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=5</guid>
		<description><![CDATA[Block的cache header部分，记录着一个block scn,它是当前块最后一次变更的时间戳（确切说，这个更新并不是指itl上的scn的最新更新，在接下来delayed block cleanout下的slot重用情况下，可以看到block scn并不等于itl上的最后一次更新的scn）。可以通过dump获得block scn/last itl scn 和发布ora_rowscn语句获得last itl scn。
1. SQL&#62; select distinct ora_rowscn,dbms_rowid.rowid_block_number(rowid) from test_ind where dbms_rowid.rowid_block_number(rowid)=31501;
ORA_ROWSCN DBMS_ROWID.ROWID_BLOCK_NUMBER(
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
617405 31501
2. SQL&#62; alter system dump datafile 4 block 31501;
Start dump data blocks tsn: 4 file#: 4 minblk 31501 maxblk 31501
buffer tsn: 4 rdba: 0&#215;01007b0d (4/31501)
scn: 0&#215;0000.00096bbd seq: 0&#215;01 flg: 0&#215;02 tail: 0&#215;6bbd0601
frmt: 0&#215;02 [...]]]></description>
			<content:encoded><![CDATA[<p>Block的cache header部分，记录着一个block scn,它是当前块最后一次变更的时间戳（确切说，这个更新并不是指itl上的scn的最新更新，在接下来delayed block cleanout下的slot重用情况下，可以看到block scn并不等于itl上的最后一次更新的scn）。可以通过dump获得block scn/last itl scn 和发布ora_rowscn语句获得last itl scn。</p>
<blockquote><p>1. SQL&gt; select distinct ora_rowscn,dbms_rowid.rowid_block_number(rowid) from test_ind where dbms_rowid.rowid_block_number(rowid)=31501;<br />
ORA_ROWSCN DBMS_ROWID.ROWID_BLOCK_NUMBER(<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
617405 31501</p></blockquote>
<blockquote><p>2. SQL&gt; alter system dump datafile 4 block 31501;<br />
Start dump data blocks tsn: 4 file#: 4 minblk 31501 maxblk 31501<br />
buffer tsn: 4 rdba: 0&#215;01007b0d (4/31501)<br />
<span style="color: #ff0000;">scn: 0&#215;0000.00096bbd</span> seq: 0&#215;01 flg: 0&#215;02 tail: 0&#215;6bbd0601<br />
frmt: 0&#215;02 chkval: 0&#215;0000 type: 0&#215;06=trans data<br />
――――――――――――――――――――――――――――――――――――――<br />
Itl Xid Uba Flag Lck Scn/Fsc<br />
0&#215;01 0&#215;000a.001.00000089 0&#215;008033be.0046.14 C&#8212; 0 scn 0&#215;0000.00065b9e<br />
<span style="color: #ff0000;">0&#215;02 0&#215;0008.02b.000000ac 0&#215;00802fea.004a.28 &#8211;U- 1 fsc 0&#215;0000.00096bbd</span></p></blockquote>
<p><span id="more-5"></span> 发布transaction后，未提交之前，block scn是不会改变的，对应的itl中也并不做scn记录。Block scn的改变，确切的说不是在发布commit之时（因为有delayed block cleanout的情况存在），而是在transaction对应的itl获得commit scn之时。<br />
当发生fast commit cleanout，系统将transaction提交时刻的scn作为commit scn，更新block上 itl和undo segment header的Transaction table的slot上的 scn，并修改block scn，三者是一致的。发生delayed block cleanout的时候，之前的transaction commit更新的只是Transaction table，而并未做block上的处理，等待下次使用此blobk的时候，更新block scn和itl状态。block scn和itl的更新又分2种情况：<br />
（1）当不产生slot重用的时候， delayed block cleanout时，根据Transaction table里面的信息，更新block scn和itl上的Scn/Fsc为transaction曾经提交时候的scn。<br />
（2） 当产生slot重用的时候，更新对应itl上scn为control scn，而block scn 为delayed block cleanout发生时刻的scn。</p>
<p>简单看一下这个测试过程。<br />
（一）fast commit cleanout<br />
1.建表/插入数据</p>
<blockquote><p>SQL&gt; create table test_scn(see char(500)) pctfree 90 tablespace test_a ;<br />
Table created<br />
SQL&gt; insert into test_scn values(&#8217;see1&#8242;);<br />
1 row inserted<br />
SQL&gt; insert into test_scn values(&#8217;see2&#8242;);<br />
1 row inserted<br />
SQL&gt; commit;<br />
Commit complete<br />
SQL&gt; select dbms_rowid.rowid_block_number(rowid),ora_rowscn from test_scn;<br />
DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;-<br />
25617 622604<br />
25618 622604</p></blockquote>
<p>2.发布事务更新</p>
<blockquote><p>SQL&gt; update test_scn set see=&#8217;kao&#8217; where see=&#8217;see1&#8242;;<br />
SQL&gt; select dbms_rowid.rowid_block_number(rowid),ora_rowscn from test_scn;</p>
<p>DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;-<br />
25617 622604<br />
25618 622604 ――发现block scn并未改变<br />
SQL&gt;commit;</p>
<p>SQL&gt; select dbms_rowid.rowid_block_number(rowid),ora_rowscn from test_scn;</p>
<p>DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;-<br />
25617 622604<br />
25618 622683 ――已经更新</p></blockquote>
<p>（二） delayed block cleanout：</p>
<p>1.创建一个小undo表空间.</p>
<blockquote><p>SQL&gt; create undo tablespace undo datafile &#8216;E:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\undo.dbf&#8217; size 2M;<br />
Tablespace created<br />
SQL&gt; alter system set undo_tablespace=&#8217;undo&#8217;;<br />
System altered</p></blockquote>
<p>2 .发布更新后，清空buffer_cache，创造延时块清除条件，然后提交</p>
<blockquote><p>SQL&gt; select dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_relative_fno(rowid), ora_rowscn,t.* from test_scn t;<br />
DBMS_ROWID.ROWID_BLOCK_NUMBER( DBMS_ROWID.ROWID_RELATIVE_FNO( ORA_ROWSCN SEE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
25617 6 625000 kao1<br />
25618 6 693298 see2<br />
SQL&gt; update test_scn set see=&#8217;kao2&#8242; where see=&#8217;see2&#8242;;<br />
1 row updated<br />
SQL&gt; select XIDUSN，XIDSLOT，XIDSQN from v$transaction;<br />
XIDUSN XIDSLOT XIDSQN<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;-<br />
20 33 21 ――得到XIDUSN，XIDSLOT的使用情况，后续发布重用脚本<br />
SQL&gt; alter system flush buffer_cache;<br />
System altered<br />
SQL&gt; commit;<br />
Commit complete<br />
SQL&gt; select timestamp_to_scn(systimestamp) from dual;<br />
TIMESTAMP_TO_SCN(SYSTIMESTAMP)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
693323 &#8212;&#8211;大概的commit scn</p></blockquote>
<p>3．发布脚本，使XIDUSN 20 XIDLOT 33 重用。</p>
<blockquote><p>SQL&gt;exec proc_go_break_reuse(20，33，21);</p></blockquote>
<p>代码如下：</p>
<blockquote><p>create or replace procedure proc_go_break_reuse<br />
(v_XIDUSN number,<br />
v_XIDSLOT number,<br />
v_XIDSQN number)<br />
/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Create_user :Mecoyoo<br />
Time:2008-5-08<br />
Description:It&#8217;s used to make transaction slot reused<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*/<br />
AS<br />
nsid number;<br />
type transaction_record_type is record(<br />
XIDUSN number,<br />
XIDSLOT number,<br />
XIDSQN number);<br />
transaction_record transaction_record_type;<br />
begin<br />
select sys_context(&#8217;userenv&#8217;, &#8217;sid&#8217;) into nsid from dual;<br />
loop<br />
insert into goon<br />
select * from dba_objects where rownum&lt;100;<br />
select XIDUSN, XIDSLOT, XIDSQN<br />
into transaction_record<br />
from v$transaction a, v$session b<br />
where a.ADDR = b.TADDR<br />
and b.SID = nsid;<br />
if (transaction_record.XIDUSN = v_XIDUSN and<br />
transaction_record.XIDSLOT = v_XIDSLOT and<br />
transaction_record.XIDSQN &gt; v_XIDSQN) then<br />
goto resue_end;<br />
end if;<br />
commit;<br />
delete from goon;<br />
select XIDUSN, XIDSLOT, XIDSQN<br />
into transaction_record<br />
from v$transaction a, v$session b<br />
where a.ADDR = b.TADDR<br />
and b.SID = nsid;<br />
if (transaction_record.XIDUSN = v_XIDUSN and<br />
transaction_record.XIDSLOT = v_XIDSLOT and<br />
transaction_record.XIDSQN &gt; v_XIDSQN) then<br />
goto resue_end;<br />
end if;<br />
commit;<br />
end loop;<br />
&lt;&lt; resue_end &gt;&gt;<br />
commit;<br />
end;</p></blockquote>
<p>4.产生延时块清除，记录相应scn号</p>
<blockquote><p>SQL&gt; select * from test_scn;<br />
SEE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
kao1<br />
kao2<br />
SQL&gt; select timestamp_to_scn(systimestamp) from dual;</p>
<p>TIMESTAMP_TO_SCN(SYSTIMESTAMP)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<span style="color: #ff0000;">703860 ―――发生延时块清除时候的大概scn</span></p>
<p>SQL&gt; select dbms_rowid.rowid_block_number(rowid), ora_rowscn from test_scn t where see=&#8217;kao2&#8242;;</p>
<p>DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;-<br />
<span style="color: #ff0000;">25618 701061 &#8212;最后一次itl 上的 commit scn</span></p></blockquote>
<p>5.dump undo header和block 25618</p>
<blockquote><p>SQL&gt; alter system dump undo header &#8216;_SYSSMU15$&#8217;;</p>
<p>System altered<br />
TRN CTL:: seq: 0&#215;0340 chd: 0&#215;002b ctl: 0&#215;0021 inc: 0&#215;00000000 nfb: 0&#215;0001<br />
mgc: 0&#215;8201 xts: 0&#215;0068 flg: 0&#215;0001 opt: 2147483646 (0&#215;7ffffffe)<br />
uba: 0&#215;0200009b.0336.0a <span style="color: #ff0000;">scn: 0&#215;0000.000ab285 －这是control scn<br />
</span>―――――――――――――――――――――――――――――――――――――<br />
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
0&#215;00 9 0&#215;00 0&#215;0018 0&#215;0001 0&#215;0000.000ab2f0 0&#215;0200009b 0&#215;0000.000.00000000 0&#215;00000001 0&#215;00000000 1210262128<br />
―――――――――――――――――――――――――――――――――――――――――――――<br />
0&#215;21 9 0&#215;00 0&#215;0018 0xffff 0&#215;0000.000abd20 0&#215;02000084 0&#215;0000.000.00000000 0&#215;00000052 0&#215;00000000 1210262179 <span style="color: #ff0000;">－－该slot已经被重用，重用的提交scn为000abd20<br />
</span>―――――――――――――――――――――――――――――――――――――――――――――<br />
0&#215;2f 9 0&#215;00 0&#215;0017 0&#215;002e 0&#215;0000.000ab387 0&#215;0200009b 0&#215;0000.000.00000000<br />
0&#215;000000</p>
<p>SQL&gt; alter system dump datafile 6 block 25618;</p>
<p>Start dump data blocks tsn: 6 file#: 6 minblk 25618 maxblk 25618<br />
buffer tsn: 6 rdba: 0&#215;01806412 (6/25618)<br />
<span style="color: #ff0000;">scn: 0&#215;0000.000abd72</span> seq: 0&#215;01 flg: 0&#215;00 tail: 0xbd720601 <span style="color: #ff0000;">―――这个scn 就是block scn，scn号为703858，可见应该是延时块清除的时候的scn<br />
</span>frmt: 0&#215;02 chkval: 0&#215;0000 type: 0&#215;06=trans data</p>
<p>Hex dump of block: st=0, typ_found=1<br />
Dump of memory from 0&#215;074C8400 to 0&#215;074CA400<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br />
Block header dump: 0&#215;01806412<br />
Object id on Block? Y<br />
seg/obj: 0&#215;2966 csc: 0&#215;00.abd72 itc: 2 flg: E typ: 1 - DATA<br />
brn: 0 bdba: 0&#215;180640e ver: 0&#215;01 opc: 0<br />
inc: 0 exflg: 0</p>
<p>Itl Xid Uba Flag Lck Scn/Fsc<br />
<span style="color: #ff0000;">0&#215;01 0&#215;0014.021.00000015 0&#215;0200009f.02c5.0e C-U- 0 scn 0&#215;0000.000ab285 －－这个scn就是control scn，在TRN CTL有记录，对应为701061 </span><br />
0&#215;02 0&#215;0010.016.00000014 0&#215;02000074.0294.0d C&#8212; 0 scn 0&#215;0000.000a9432</p></blockquote>
<ul class="related_post">
<li><a href="http://www.easyora.net/blog/about_index_desc.html" title="解析INDEX_DESC">解析INDEX_DESC</a></li>
<li><a href="http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html" title="9i RAC静默升级至10g RAC">9i RAC静默升级至10g RAC</a></li>
<li><a href="http://www.easyora.net/blog/heartbeat_oracle_ha.html" title="[HA]利于heartbeat构建Oracle高可用">[HA]利于heartbeat构建Oracle高可用</a></li>
<li><a href="http://www.easyora.net/blog/troubleshooting_assemble.html" title="[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.">[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.</a></li>
<li><a href="http://www.easyora.net/blog/about_dbms_scheduler.html" title="小议Oracle 调度程序作业( dbms_scheduler )">小议Oracle 调度程序作业( dbms_scheduler )</a></li>
<li><a href="http://www.easyora.net/blog/prebuild_mv_trans_db.html" title="利用prebuild MV快速迁移跨平台数据库实施及其总结">利用prebuild MV快速迁移跨平台数据库实施及其总结</a></li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/scn_block_scn.html&title=SCN%E4%B9%8B+Block+scn%2Fcommit+scn%2Fdelayed+block+cleanout&tags=block scn, delayed block cleanout, oracle, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/scn_block_scn.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.</title>
		<link>http://www.easyora.net/blog/troubleshooting_assemble.html</link>
		<comments>http://www.easyora.net/blog/troubleshooting_assemble.html#comments</comments>
		<pubDate>Wed, 22 Oct 2008 10:27:16 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[oracle]]></category>

		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=89</guid>
		<description><![CDATA[[Troubleshooting Assemble]本帖集合case处理,不再另行开帖.]]></description>
			<content:encoded><![CDATA[<p>把以后碰到的问题处理,都汇集到这个帖子里面吧,也不另行开帖了.想写的时候就写点,方便以后查阅.</p>
<blockquote><p><strong><em>Problem Time : 2008-10-22<br />
Problem summary: 主库重建控制文件引起备库日志缺失以及后续备库应用归档日志过程中出现SMON: Parallel transaction recovery tried</em></strong></p></blockquote>
<p>问题的起源为一个物理primary/standby环境.由于备库前期进行硬件升级,停机了有段时间,恢复使用后,顺便观察了一下日志的receive和apply情况.<br />
发现接收的日志文件从sequence 179到 sequence 315缺失.alert.log中出现这么可疑的一段:</p>
<blockquote><p>Wed Oct 22 9:18:27 2008<br />
FAL[client]: Failed to request gap sequence<br />
GAP - thread 1 sequence 179-315<br />
DBID 3397069132 branch 663290110<br />
FAL[client]: All defined FAL servers have been attempted.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Check that the CONTROL_FILE_RECORD_KEEP_TIME initialization<br />
parameter is defined to a value that is sufficiently large<br />
enough to maintain adequate log switch information to resolve<br />
archivelog gaps.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p></blockquote>
<p><span id="more-89"></span><br />
由于控制文件并非放在裸设备上,没有空间扩展限制,所以感觉问题的根源并非CONTROL_FILE_RECORD_KEEP_TIME的设置上,察看归档目录,发现的确存在sequence 179-315 对应的日志文件,查v$archived_log发现</p>
<blockquote><p>SQL&gt; select NAME,SEQUENCE# from v$archived_log where DEST_ID=1;<br />
NAME SEQUENCE#<br />
E:\ORACLE\ARCHIVE\demo\ARC00316_0663290110.001 316<br />
E:\ORACLE\ARCHIVE\demo\ARC00317_0663290110.001 317<br />
E:\ORACLE\ARCHIVE\demo\ARC00318_0663290110.001 318<br />
E:\ORACLE\ARCHIVE\demo\ARC00319_0663290110.001 319<br />
.<br />
.<br />
E:\ORACLE\ARCHIVE\demo\ARC00420_0663290110.001 420</p></blockquote>
<p>归档记录竟然从logseq 316开始,应该是最近重建了控制文件,造成日志记录的丢失,而恰好这些归档因为备库当时未能工作而未及时传输到备库.继续在alert.log往上看,发现前几天的确重建过控制文件,而且数据库没有被resetlogs过.</p>
<p>问题原因至此找到.</p>
<p>对于应用丢失的这部分archivelog,解决办法也比较多.可以在备库端重新手动注册,也可以拷贝归档到备库的归档目录下,执行恢复操作.简单期间,我采用了主库端重新注册archivelog的方式,然后通过RFS进程传输到备库应用.</p>
<blockquote><p>C:\rman target sys/password@demo<br />
恢复管理器: Release 10.2.0.3.0 - Production on 星期三 10月 22 9:45:28 2008<br />
Copyright (c) 1982, 2005, Oracle. All rights reserved.<br />
连接到目标数据库: DEMO (DBID=3397069132)<br />
<strong>RMAN&gt; catalog start with &#8216;E:\Oracle\archive\demo&#8217; noprompt;</strong><br />
使用目标数据库控制文件替代恢复目录<br />
搜索与样式 E:\Oracle\archive\demo 匹配的所有文件</p>
<p>数据库未知文件的列表<br />
=====================================<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00130_0663290110.001<br />
.<br />
.<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00179_0663290110.001<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00180_0663290110.001<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00181_0663290110.001<br />
.<br />
.<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00315_0663290110.001<br />
.<br />
.<br />
正在编制文件目录&#8230;<br />
目录编制完毕<br />
已列入目录的文件的列表<br />
=======================<br />
=====================================<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00130_0663290110.001<br />
.<br />
.<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00179_0663290110.001<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00180_0663290110.001<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00181_0663290110.001<br />
.<br />
.<br />
文件名: E:\ORACLE\ARCHIVE\demo\ARC00315_0663290110.001<br />
.<br />
.<br />
RMAN&gt;</p></blockquote>
<blockquote><p>SQL&gt; select count(*) from v$archived_log where SEQUENCE# between 179 and 315 and DEST_ID=1;<br />
COUNT(*)<br />
&#8212;&#8212;&#8212;-<br />
137</p></blockquote>
<p>备库端:<br />
发现这部分gap日志已经传送并开始恢复.<br />
一段时间后,查看日志应用进度,进度比较慢,alert.log中又报出SMON: Parallel transaction recovery tried 错误,字面上看是并行恢复的时候出了问题,<br />
于是将参数fast_start_parallel_rollback改为false,</p>
<blockquote><p>SQL>alter system set fast_start_parallel_rollback=false;</p></blockquote>
<p>重新执行日志应用.再无问题出现.</p>
<blockquote><p>SQL&gt; select max(SEQUENCE#) from v$archived_log where applied=&#8217;YES&#8217;;<br />
MAX(SEQUENCE#)<br />
&#8212;&#8212;&#8212;&#8212;&#8211;<br />
423</p></blockquote>
<p>THE END.
<ul class="related_post">
<li><a href="http://www.easyora.net/blog/about_index_desc.html" title="解析INDEX_DESC">解析INDEX_DESC</a></li>
<li><a href="http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html" title="9i RAC静默升级至10g RAC">9i RAC静默升级至10g RAC</a></li>
<li><a href="http://www.easyora.net/blog/heartbeat_oracle_ha.html" title="[HA]利于heartbeat构建Oracle高可用">[HA]利于heartbeat构建Oracle高可用</a></li>
<li><a href="http://www.easyora.net/blog/scn_block_scn.html" title="SCN之 Block scn/commit scn/delayed block cleanout">SCN之 Block scn/commit scn/delayed block cleanout</a></li>
<li><a href="http://www.easyora.net/blog/about_dbms_scheduler.html" title="小议Oracle 调度程序作业( dbms_scheduler )">小议Oracle 调度程序作业( dbms_scheduler )</a></li>
<li><a href="http://www.easyora.net/blog/prebuild_mv_trans_db.html" title="利用prebuild MV快速迁移跨平台数据库实施及其总结">利用prebuild MV快速迁移跨平台数据库实施及其总结</a></li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/troubleshooting_assemble.html&title=%5BTroubleshooting+Assemble%5D%E6%9C%AC%E5%B8%96%E9%9B%86%E5%90%88%E6%95%85%E9%9A%9C%E5%A4%84%E7%90%86%2C%E4%B8%8D%E5%86%8D%E5%8F%A6%E8%A1%8C%E5%BC%80%E5%B8%96.&tags=oracle, troubleshooting, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/troubleshooting_assemble.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>天下没有免费的午餐&#8230;</title>
		<link>http://www.easyora.net/blog/2008_tko_1.html</link>
		<comments>http://www.easyora.net/blog/2008_tko_1.html#comments</comments>
		<pubDate>Fri, 12 Sep 2008 13:55:31 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Other]]></category>

		<category><![CDATA[wordpress，免费空间]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=33</guid>
		<description><![CDATA[   近期着实运气背了点，让我不得不重新审视自己的生活态度，也渐渐印证了自己的一贯信奉：运气是种因果。
   有点唐突的离职，陡然发现路途并不平坦。舍弃与收获并非彰显分明，生活需要在拿捏之中历练。从现实意义上来讲，需要不断提醒自己，路要往前看。
    早上一觉醒来，发觉blog失效，登陆主机后台管理，方知出了大问题，自己的管理帐号被删掉了。索性发邮件给主机商，石沉大海。这个号称推出免费网站服务的站点竟然改头换面，搞起了免费硬盘服务，真好笑。比这糟的是，没太在意这段时间blog使用的数据库自动备份出了问题，只能找到7月29号的一次备份。还好自己的blog更新频率比较慢，丢失不算太多。在对比考察了N多免费虚拟主机之后，决定还是让blog走付费路线（一个顶级域名+一个php/mysql虚拟主机，全年188元，这个价格让我怦然心动）。
至此，本站域名，从www.easyora.cn 更新为 www.easyora.net.
    也许天下真的没有免费的午餐。建站初，出于稳定考虑，决定青睐于国外的主机运营商，实际发现，外国和尚也是和尚。也许，免费总是一个美好的幌子，之所以免费，使因为选择收费的模式代价太高。

No Related Post

 ]]></description>
			<content:encoded><![CDATA[<p>   近期着实运气背了点，让我不得不重新审视自己的生活态度，也渐渐印证了自己的一贯信奉：运气是种因果。</p>
<p>   有点唐突的离职，陡然发现路途并不平坦。舍弃与收获并非彰显分明，生活需要在拿捏之中历练。从现实意义上来讲，需要不断提醒自己，路要往前看。</p>
<p>    早上一觉醒来，发觉blog失效，登陆主机后台管理，方知出了大问题，自己的管理帐号被删掉了。索性发邮件给主机商，石沉大海。这个号称推出免费网站服务的站点竟然改头换面，搞起了免费硬盘服务，真好笑。比这糟的是，没太在意这段时间blog使用的数据库自动备份出了问题，只能找到7月29号的一次备份。还好自己的blog更新频率比较慢，丢失不算太多。在对比考察了N多免费虚拟主机之后，决定还是让blog走付费路线（一个顶级域名+一个php/mysql虚拟主机，全年188元，这个价格让我怦然心动）。</p>
<blockquote><p>至此，本站域名，从<a href="http://www.easyora.cn">www.easyora.cn </a>更新为 <a href="http://www.easyora.net">www.easyora.net</a>.</p></blockquote>
<p>    也许天下真的没有免费的午餐。建站初，出于稳定考虑，决定青睐于国外的主机运营商，实际发现，外国和尚也是和尚。也许，免费总是一个美好的幌子，之所以免费，使因为选择收费的模式代价太高。
<ul class="related_post">
<li>No Related Post</li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/2008_tko_1.html&title=%E5%A4%A9%E4%B8%8B%E6%B2%A1%E6%9C%89%E5%85%8D%E8%B4%B9%E7%9A%84%E5%8D%88%E9%A4%90%26%238230%3B&tags=wordpress，免费空间, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/2008_tko_1.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>小议Oracle 调度程序作业( dbms_scheduler )</title>
		<link>http://www.easyora.net/blog/about_dbms_scheduler.html</link>
		<comments>http://www.easyora.net/blog/about_dbms_scheduler.html#comments</comments>
		<pubDate>Mon, 01 Sep 2008 18:22:16 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[dbms_scheduler]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=32</guid>
		<description><![CDATA[    整理scheduler 这一部分,源于最近发现系统上自动采集统计信息的执行时间有些异常,执行时间被定义到了上午 (这并不是一个很合理可靠的时间 ).在重新修改配置的同时,也顺便整理了这一块内容.
    首先简单讲一下oracle 10g scheduler,10g引入dbms_scheduler来替代先前的dbms_job,在功能方面,它比dbms_job提供了更强大的功能和更灵活的机制/管理.它主要由以下几大块构成:

1.作业(job) :
      一个调度程序作业的实体.可以由dbms_scheduler.create_job创建生成.它可以自行指定作业属性,也可以调用我们预先创建的一系列scheduler/ program/ chain/ job_class/ window/ window_group来匹配其作业属性.
2.调度(scheduler) :
      一个任务计划执行的时间策略.比如我们想要创建一个晚上3点执行的任务计划,就可以创建一个调度,凡是符合这个调度要求的,都可以调用这个我们预先创建好的调度.可以用dbms_scheduler.create_schedule来创建一个调度.
比如我创建一个名字叫MYTEST_SCHEDULE的调度,每天4:00执行.

Begin
dbms_scheduler.create_schedule(
repeat_interval =&#62; &#8216;FREQ=DAILY;BYHOUR=4;BYMINUTE=0;BYSECOND=0&#8242;,
start_date =&#62; systimestamp at time zone &#8216;PRC&#8217;,
comments =&#62; &#8216;&#8212;this is my test schedule&#8212;&#8217;,
schedule_name =&#62; &#8216;MYTEST_SCHEDULE&#8217;);
end;

3.程序(program):
   10g下的program支持分为3种形式,PL/SQL BLOCK/STORED PROCEDURE/EXECUTABLE.可以使用DBMS_SCHEDULER.CREATE_PROGRAM来创建一个program.

BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=&#62;&#8217;mytest_program_1&#8242;,
program_action=&#62;&#8217;update mytest [...]]]></description>
			<content:encoded><![CDATA[<p>    整理scheduler 这一部分,源于最近发现系统上自动采集统计信息的执行时间有些异常,执行时间被定义到了上午 (这并不是一个很合理可靠的时间 ).在重新修改配置的同时,也顺便整理了这一块内容.</p>
<p>    首先简单讲一下oracle 10g scheduler,10g引入dbms_scheduler来替代先前的dbms_job,在功能方面,它比dbms_job提供了更强大的功能和更灵活的机制/管理.它主要由以下几大块构成:<br />
<span id="more-32"></span><br />
1.作业(job) :</p>
<p>      一个调度程序作业的实体.可以由dbms_scheduler.create_job创建生成.它可以自行指定作业属性,也可以调用我们预先创建的一系列scheduler/ program/ chain/ job_class/ window/ window_group来匹配其作业属性.</p>
<p>2.调度(scheduler) :<br />
      一个任务计划执行的时间策略.比如我们想要创建一个晚上3点执行的任务计划,就可以创建一个调度,凡是符合这个调度要求的,都可以调用这个我们预先创建好的调度.可以用dbms_scheduler.create_schedule来创建一个调度.</p>
<p>比如我创建一个名字叫MYTEST_SCHEDULE的调度,每天4:00执行.</p>
<blockquote><p>
Begin<br />
dbms_scheduler.create_schedule(<br />
repeat_interval =&gt; &#8216;FREQ=DAILY;BYHOUR=4;BYMINUTE=0;BYSECOND=0&#8242;,<br />
start_date =&gt; systimestamp at time zone &#8216;PRC&#8217;,<br />
comments =&gt; &#8216;&#8212;this is my test schedule&#8212;&#8217;,<br />
schedule_name =&gt; &#8216;MYTEST_SCHEDULE&#8217;);<br />
end;
</p></blockquote>
<p>3.程序(program):</p>
<p>   10g下的program支持分为3种形式,PL/SQL BLOCK/STORED PROCEDURE/EXECUTABLE.可以使用DBMS_SCHEDULER.CREATE_PROGRAM来创建一个program.</p>
<blockquote><p>
BEGIN<br />
DBMS_SCHEDULER.CREATE_PROGRAM(<br />
program_name=&gt;&#8217;mytest_program_1&#8242;,<br />
program_action=&gt;&#8217;update mytest set id=id+1;&#8217;,<br />
program_type=&gt;&#8217;PLSQL_BLOCK&#8217;,<br />
number_of_arguments=&gt;0,<br />
comments=&gt;&#8221;,<br />
enabled=&gt;TRUE);<br />
END;
</p></blockquote>
<p>4.链(chain):<br />
     链可以看作是一个/几个program/event scheduler的集合,为了维护需要,我们可能需要将很多不同的program放到一起依次执行,按照以前的模式,要么将这几个program能整合成一个大的整体,要么分开几个job来单独执行,这无疑加重了维护负担,而chain的出现,可以优化这个问题,我们将实现定义好的program集合到一起,然后统一制定一个job来执行,可以使用dbms_scheduler.create_chain来创建一个chain.</p>
<p>   比如,在我的系统中,我分别创建了一个EXECUTABLE类型的和一个STORED PROCEDURE类型的program,我需要他们顺次执行,于是我可以这么做:</p>
<blockquote><p>
BEGIN<br />
dbms_scheduler.create_chain(<br />
chain_name =&gt; &#8216;MYTEST_CHAIN&#8217;);<br />
dbms_scheduler.define_chain_step(<br />
chain_name =&gt; &#8216;MYTEST_CHAIN&#8217;,<br />
step_name =&gt; &#8216;mytest_chain_1&#8242;,<br />
program_name =&gt; &#8216;P_1&#8242;);<br />
dbms_scheduler.alter_chain(<br />
chain_name =&gt; &#8216;MYTEST_CHAIN&#8217;,<br />
step_name =&gt; &#8216;mytest_chain_1&#8242;,<br />
attribute =&gt; &#8217;skip&#8217;,<br />
value =&gt; FALSE);<br />
dbms_scheduler.define_chain_step(<br />
chain_name =&gt; &#8216;MYTEST_CHAIN&#8217;,<br />
step_name =&gt; &#8216;mytest_chain_2&#8242;,<br />
program_name =&gt; &#8216;P_2&#8242;);<br />
dbms_scheduler.alter_chain(<br />
chain_name =&gt; &#8216;MYTEST_CHAIN&#8217;,<br />
step_name =&gt; &#8216;mytest_chain_2&#8242;,<br />
attribute =&gt; &#8217;skip&#8217;,<br />
value =&gt; FALSE);<br />
dbms_scheduler.enable(&#8217;MYTEST_CHAIN&#8217;);<br />
END;
</p></blockquote>
<p> 4.作业类(job_class):</p>
<p>    定义了运行作业的资源使用者组.通过使用窗口中的资源计划, 我们可以在不同资源组和不同作业类之间分配资源.可以使用dbms_scheduler.create_job_class创建一个作业类.</p>
<blockquote><p>
BEGIN<br />
dbms_scheduler.create_job_class(<br />
logging_level =&gt; DBMS_SCHEDULER.LOGGING_RUNS,<br />
log_history =&gt; 100,<br />
resource_consumer_group =&gt; &#8216;AUTO_TASK_CONSUMER_GROUP&#8217;,<br />
job_class_name =&gt; &#8216;MYTEST_JOB_CLASS&#8217;);<br />
END;
</p></blockquote>
<p> 5.窗口(window):</p>
<p>   可以看成是一个更高功能的调度,窗口可以调用系统中存在的调度(也可以自行定义执行时间),而且,具有资源计划限制功能,窗口可以归属于某个窗口组.</p>
<p>   可以使用DBMS_SCHEDULER.CREATE_WINDOW来创建一个窗口.</p>
<p>   例如我创建了一个名为mytest_windows_1的窗口,采用DAILY_PURGE_SCHEDULE的调度方式,资源计划限制方案为SYSTEM_PLAN,持续时间为4小时.</p>
<blockquote><p>
  BEGIN<br />
DBMS_SCHEDULER.CREATE_WINDOW(<br />
window_name=&gt;&#8217;mytest_windows_1&#8242;,<br />
resource_plan=&gt;&#8217;SYSTEM_PLAN&#8217;,<br />
schedule_name=&gt;&#8217;SYS.DAILY_PURGE_SCHEDULE&#8217;,<br />
duration=&gt;numtodsinterval(240, &#8216;minute&#8217;),<br />
window_priority=&gt;&#8217;LOW&#8217;,<br />
comments=&gt;&#8221;);<br />
END;
</p></blockquote>
<p> 6.窗口组(window_group):</p>
<p>        一个/几个窗口的集合.10g默认的自动采集统计信息的调度就是一个窗口组的形式,譬如,设置两个窗口,窗口一指定任务周日&#8212;&#8211;周五,晚上12点执行,而窗口二设定周六凌晨3点执行,这两个窗口组成了一个窗口组,形成了这个job的执行调度策略.</p>
<p>    可以使用DBMS_SCHEDULER.CREATE_WINDOW_GROUP来创建一个窗口组.</p>
<blockquote><p>
BEGIN<br />
DBMS_SCHEDULER.CREATE_WINDOW_GROUP(<br />
group_name=&gt;&#8217;mytest_window_group&#8217;,<br />
window_list=&gt;&#8217;MYTEST_WINDOWS_1,WEEKEND_WINDOW&#8217;);<br />
END;
</p></blockquote>
<p>   于是,使用dbms_scheduler创建一个job,我们可以调用各种预先定义的复杂属性,也可以简单的手动约定各个需要的属性.</p>
<p>  简单的,如</p>
<blockquote><p>
BEGIN<br />
dbms_scheduler.create_job(<br />
job_name =&gt; &#8216; MYTEST_JOB_1&#8242;,<br />
job_type =&gt; &#8216;PLSQL_BLOCK&#8217;,<br />
job_action =&gt; &#8216;update mytest set id=id+1;&#8217;,<br />
repeat_interval =&gt; &#8216;FREQ=MINUTELY;INTERVAL=10&#8242;,<br />
start_date =&gt; sysdate,<br />
auto_drop =&gt; FALSE,<br />
enabled =&gt; TRUE);<br />
END; </p></blockquote>
<p> 跟采用dbms_job并不太大区别,只是repeat_interval等语法上有差别.</p>
<p>复杂点的,如:</p>
<blockquote><p>
BEGIN<br />
dbms_scheduler.create_job(<br />
job_name =&gt; &#8216;MYTEST_JOB_2&#8242;,<br />
job_type =&gt; &#8216;CHAIN&#8217;,<br />
job_action =&gt; &#8216;MYTEST_CHAIN&#8217;,<br />
schedule_name =&gt; &#8216;SYS.MYTEST_WINDOW_GROUP&#8217;,<br />
job_class =&gt; &#8216;DEFAULT_JOB_CLASS&#8217;,<br />
auto_drop =&gt; FALSE,<br />
enabled =&gt; FALSE);<br />
dbms_scheduler.set_attribute( name =&gt; &#8216;MYTEST_JOB_2&#8242;, attribute =&gt; &#8217;stop_on_window_close&#8217;, value =&gt; FALSE);<br />
END;
</p></blockquote>
<p>调度程序作业属性的修改:</p>
<p>    大部分的调度作业属性的修改,都可以通过dbms_scheduler.SET_ATTRIBUTE和dbms_scheduler.SET_ATTRIBUT_NULL来完成.在此仅几个举例来说明,更多使用方法雷同.</p>
<p> ^比如,重新定义scheduler属性:</p>
<blockquote><p>
BEGIN<br />
dbms_scheduler.set_attribute( name =&gt; &#8216;DAILY_PURGE_SCHEDULE&#8217;, attribute =&gt; &#8216;repeat_interval&#8217;, value =&gt; &#8216;FREQ=DAILY;BYHOUR=1;BYMINUTE=0;BYSECOND=0&#8242;);<br />
END;
</p></blockquote>
<p>^比如重新修改program;</p>
<blockquote><p>
BEGIN<br />
DBMS_SCHEDULER.SET_ATTRIBUTE(<br />
name=&gt;&#8217;P_1&#8242;,<br />
attribute=&gt;&#8217;PROGRAM_ACTION&#8217;,<br />
value=&gt;&#8217;/backup/2.sh&#8217;);<br />
END;
</p></blockquote>
<p> ^比如重新定义一个job属性</p>
<blockquote><p>
BEGIN<br />
dbms_scheduler.set_attribute_null( name =&gt; &#8216;GATHER_STATS_JOB&#8217;, attribute =&gt; &#8217;schedule_name&#8217;);<br />
 dbms_scheduler.set_attribute( name =&gt; &#8216;GATHER_STATS_JOB&#8217;, attribute =&gt; &#8216;repeat_interval&#8217;, value =&gt; &#8216;FREQ=DAILY;BYHOUR=2;BYSECOND=0&#8242;);<br />
END;
</p></blockquote>
<p> 等等…&#8230;.</p>
<p>相关的表/视图:</p>
<blockquote><p>
 SQL&gt; select VIEW_NAME from dba_views a where a.view_name like &#8216;DBA_SCHEDULER%&#8217;;<br />
VIEW_NAME<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
DBA_SCHEDULER_PROGRAMS<br />
DBA_SCHEDULER_JOBS<br />
DBA_SCHEDULER_JOB_CLASSES<br />
 DBA_SCHEDULER_WINDOWS<br />
 DBA_SCHEDULER_PROGRAM_ARGS<br />
 DBA_SCHEDULER_JOB_ARGS<br />
 DBA_SCHEDULER_JOB_LOG<br />
 DBA_SCHEDULER_JOB_RUN_DETAILS<br />
 DBA_SCHEDULER_WINDOW_LOG<br />
 DBA_SCHEDULER_WINDOW_DETAILS<br />
 DBA_SCHEDULER_WINDOW_GROUPS<br />
 DBA_SCHEDULER_WINGROUP_MEMBERS<br />
 DBA_SCHEDULER_SCHEDULES<br />
 DBA_SCHEDULER_RUNNING_JOBS<br />
 DBA_SCHEDULER_GLOBAL_ATTRIBUTE<br />
 DBA_SCHEDULER_CHAINS<br />
 DBA_SCHEDULER_CHAIN_RULES<br />
 DBA_SCHEDULER_CHAIN_STEPS<br />
 DBA_SCHEDULER_RUNNING_CHAINS
</p></blockquote>
<p> 根据字面意思不难理解.
<ul class="related_post">
<li><a href="http://www.easyora.net/blog/about_index_desc.html" title="解析INDEX_DESC">解析INDEX_DESC</a></li>
<li><a href="http://www.easyora.net/blog/9i_rac_upgrade_10g_rac.html" title="9i RAC静默升级至10g RAC">9i RAC静默升级至10g RAC</a></li>
<li><a href="http://www.easyora.net/blog/heartbeat_oracle_ha.html" title="[HA]利于heartbeat构建Oracle高可用">[HA]利于heartbeat构建Oracle高可用</a></li>
<li><a href="http://www.easyora.net/blog/scn_block_scn.html" title="SCN之 Block scn/commit scn/delayed block cleanout">SCN之 Block scn/commit scn/delayed block cleanout</a></li>
<li><a href="http://www.easyora.net/blog/troubleshooting_assemble.html" title="[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.">[Troubleshooting Assemble]本帖集合故障处理,不再另行开帖.</a></li>
<li><a href="http://www.easyora.net/blog/prebuild_mv_trans_db.html" title="利用prebuild MV快速迁移跨平台数据库实施及其总结">利用prebuild MV快速迁移跨平台数据库实施及其总结</a></li>
</ul>
 <p><a href="http://fairyfish.net/bookmark/?url=http://www.easyora.net/blog/about_dbms_scheduler.html&title=%E5%B0%8F%E8%AE%AEOracle+%E8%B0%83%E5%BA%A6%E7%A8%8B%E5%BA%8F%E4%BD%9C%E4%B8%9A%28+dbms_scheduler+%29&tags=dbms_scheduler, oracle, "><img src="/bookmark.gif" alt="bookmark" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.easyora.net/blog/about_dbms_scheduler.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>利用prebuild MV快速迁移跨平台数据库实施及其总结</title>
		<link>http://www.easyora.net/blog/prebuild_mv_trans_db.html</link>
		<comments>http://www.easyora.net/blog/prebuild_mv_trans_db.html#comments</comments>
		<pubDate>Sun, 17 Aug 2008 18:02:16 +0000</pubDate>
		<dc:creator>Kevin.yuan</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[oracle]]></category>

		<category><![CDATA[prebuild mv]]></category>

		<category><![CDATA[异构迁移]]></category>

		<guid isPermaLink="false">http://www.easyora.net/?p=30</guid>
		<description><![CDATA[   做数据库管理维护过程中，难免会碰到一些数据库的迁移需求，不同的环境也需要根据实际情况采取不同的手段，比如对一个有宕机时间要求的数据库来说，采用逻辑导入导出的方式显而易见并不合适。而对于一个跨平台的迁移系统来说，DG也失去了用武之地。对一个跨平台的数据库系统，采用stream，高级复制都可以在相对较短时间完成迁移需求，尽可能减少停机时间。
  本文利于prebuild mv的方式来完成跨平台迁移，在实施过程中，如何尽量减少停机时间，以及如何保证数据的物理逻辑，都是我们需要审慎的方面。

迁移之前，有几点问题大家不妨一起考虑：
1.	由于prebuild mv并非采取的schema模式，如果系统表上有大量的约束（譬如外键），所以刷新过程中，由于刷新object的次序问题，很容易导致一些约束冲突。因此，适当的时候建立/启用约束，如何在时间与确保成功上权衡，是我们应该考虑的问题。（当然，根据表之间的逻辑关系，手动制定table的刷新顺序可行，但是工作量无疑太大，而且需要很熟悉的业务逻辑，对大多数迁移来说，并不太适合）
2.	如果库中存在基于该表的物化视图，将不能在其上面创建prebuild table，否则会抛出ORA-32334异常。对于这部分物化视图，需要另行单独处理,如何快速在目标机迁移建立？希望有经验的朋友指点。
3.	index 的建立时机，这是个需要权衡的时间与成本问题。
3. 其它job.view,,procedure,package function,trigger, sequenceq等迁移，尤其需要考虑trigger.sequence等过早迁移对系统逻辑数据的影响。
 下面来看一下这次的迁移过程。
环境说明：
  源  机/库：Window XP SP2 /Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
  目标机/库：Solaris 10/Oracle Database 10g Enterprise Edition Release 10.2.0.2.0
迁移步骤：
1. 目标数据库环境的创建，包括db link的建立，用户的权限等等..
2. 迁移源数据库表结构（空结构）并获得创建索引脚本,由于本次采用exp/imp的方式，所以一起将view,procedure,package,function,trigger, sequence等等迁移过去。在目标机，考虑到刷新速度，咱不建立生成index。考虑到数据的逻辑性，禁用外键约束，禁用触发器和删除sequence，删除物化视图。
3. 建立源数据库待刷新表的日志，建立目标数据库的prebuild mv。这部分统一由脚本生成并执行。
4.  complete方式刷新object，然后生成index。
5．源库停止业务，采用增量方式刷新object完毕。
6．获得此时主库sequence创建脚本，部署到目标机器，在目标机启用trigger和外键约束。
7.部署job等等其他.
详细实施过程
1. 目标数据库环境的创建，包括db link的建立，用户的权限等等..
SQL&#62; create user fsk identified by fsk123;User createdSQL&#62; create tablespace [...]]]></description>
			<content:encoded><![CDATA[<p>   做数据库管理维护过程中，难免会碰到一些数据库的迁移需求，不同的环境也需要根据实际情况采取不同的手段，比如对一个有宕机时间要求的数据库来说，采用逻辑导入导出的方式显而易见并不合适。而对于一个跨平台的迁移系统来说，DG也失去了用武之地。对一个跨平台的数据库系统，采用stream，高级复制都可以在相对较短时间完成迁移需求，尽可能减少停机时间。<br />
  本文利于prebuild mv的方式来完成跨平台迁移，在实施过程中，如何尽量减少停机时间，以及如何保证数据的物理逻辑，都是我们需要审慎的方面。<br />
<span id="more-30"></span><br />
迁移之前，有几点问题大家不妨一起考虑：<br />
1.	由于prebuild mv并非采取的schema模式，如果系统表上有大量的约束（譬如外键），所以刷新过程中，由于刷新object的次序问题，很容易导致一些约束冲突。因此，适当的时候建立/启用约束，如何在时间与确保成功上权衡，是我们应该考虑的问题。（当然，根据表之间的逻辑关系，手动制定table的刷新顺序可行，但是工作量无疑太大，而且需要很熟悉的业务逻辑，对大多数迁移来说，并不太适合）<br />
2.	如果库中存在基于该表的物化视图，将不能在其上面创建prebuild table，否则会抛出ORA-32334异常。对于这部分物化视图，需要另行单独处理,如何快速在目标机迁移建立？希望有经验的朋友指点。<br />
3.	index 的建立时机，这是个需要权衡的时间与成本问题。<br />
3. 其它job.view,,procedure,package function,trigger, sequenceq等迁移，尤其需要考虑trigger.sequence等过早迁移对系统逻辑数据的影响。</p>
<p> 下面来看一下这次的迁移过程。<br />
环境说明：<br />
  源  机/库：Window XP SP2 /Oracle Database 10g Enterprise Edition Release 10.2.0.3.0<br />
  目标机/库：Solaris 10/Oracle Database 10g Enterprise Edition Release 10.2.0.2.0</p>
<p>迁移步骤：<br />
1. 目标数据库环境的创建，包括db link的建立，用户的权限等等..<br />
2. 迁移源数据库表结构（空结构）并获得创建索引脚本,由于本次采用exp/imp的方式，所以一起将view,procedure,package,function,trigger, sequence等等迁移过去。在目标机，考虑到刷新速度，咱不建立生成index。考虑到数据的逻辑性，禁用外键约束，禁用触发器和删除sequence，删除物化视图。<br />
3. 建立源数据库待刷新表的日志，建立目标数据库的prebuild mv。这部分统一由脚本生成并执行。<br />
4.  complete方式刷新object，然后生成index。<br />
5．源库停止业务，采用增量方式刷新object完毕。<br />
6．获得此时主库sequence创建脚本，部署到目标机器，在目标机启用trigger和外键约束。<br />
7.部署job等等其他.</p>
<p>详细实施过程<br />
1. 目标数据库环境的创建，包括db link的建立，用户的权限等等..</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">create</span><span style="color: Gray;"> </span><span style="color: Green;">user</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk</span><span style="color: Gray;"> </span><span style="color: Blue;">identified</span><span style="color: Gray;"> </span><span style="color: Green;">by</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk123</span><span style="color: Gray;">;<br /></span><span style="color: Green;">User</span><span style="color: Gray;"> </span><span style="color: Blue;">created</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">create</span><span style="color: Gray;"> </span><span style="color: Blue;">tablespace</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk_index</span><span style="color: Gray;"> </span><span style="color: Blue;">datafile</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">/opt/oracle/product/10g/oradata/my/fsk_index_01.dbf</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">size</span><span style="color: Gray;"> </span><span style="color: Maroon;">2</span><span style="color: #00008b;">G</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">/opt/oracle/product/10g/oradata/my/fsk_index_02.dbf</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">size</span><span style="color: Gray;"> </span><span style="color: Maroon;">2</span><span style="color: #00008b;">G</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">Tablespace</span><span style="color: Gray;"> </span><span style="color: Blue;">created</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">create</span><span style="color: Gray;"> </span><span style="color: Blue;">tablespace</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk_data</span><span style="color: Gray;"> </span><span style="color: Blue;">datafile</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">/opt/oracle/product/10g/oradata/my/fsk_data_01.dbf</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">size</span><span style="color: Gray;"> </span><span style="color: Maroon;">2</span><span style="color: #00008b;">G</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">/opt/oracle/product/10g/oradata/my/fsk_data_02.dbf</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">size</span><span style="color: Gray;"> </span><span style="color: Maroon;">2</span><span style="color: #00008b;">G</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">Tablespace</span><span style="color: Gray;"> </span><span style="color: Blue;">created</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">alter</span><span style="color: Gray;"> </span><span style="color: Green;">user</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Blue;">tablespace</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk_data</span><span style="color: Gray;">;<br /></span><span style="color: Green;">User</span><span style="color: Gray;"> </span><span style="color: Blue;">altered</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; @</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">grant_role</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;">;<br /></span><span style="color: Green;">Grant</span><span style="color: Gray;"> </span><span style="color: Blue;">succeeded</span><span style="color: Gray;">.<br /></span><span style="color: Green;">Grant</span><span style="color: Gray;"> </span><span style="color: Blue;">succeeded</span><span style="color: Gray;">.<br />………………….<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">create</span><span style="color: Gray;"> </span><span style="color: Blue;">database</span><span style="color: Gray;"> </span><span style="color: Blue;">link</span><span style="color: Gray;"> </span><span style="color: Blue;">demo</span><span style="color: Gray;"> </span><span style="color: Green;">connect</span><span style="color: Gray;"> </span><span style="color: Green;">to</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk</span><span style="color: Gray;"> </span><span style="color: Blue;">identified</span><span style="color: Gray;"> </span><span style="color: Green;">by</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk123</span><span style="color: Gray;">&nbsp; </span><span style="color: Green;">using</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">demo</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">Database</span><span style="color: Gray;"> </span><span style="color: Blue;">link</span><span style="color: Gray;"> </span><span style="color: Blue;">created</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">select</span><span style="color: Gray;"> * </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">global_name</span><span style="color: Gray;">@</span><span style="color: Blue;">demo</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">GLOBAL_NAME</span><span style="color: Gray;"><br />------------------------------------------------------------------------------</span><span style="color: #ffa500;">--<br />DEMO.COM</span></div></div>
<p>2. 迁移源数据库表结构（空结构）,由于本次采用exp/imp的方式，所以一起将view,procedure,package,function,trigger, sequence等等迁移过去。在目标机，考虑到刷新速度，暂时不建立生成index。考虑到数据的逻辑性，禁用外键约束，禁用触发器和删除sequence。<br />
(1) exp导出schema</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #00008b;">C</span><span style="color: Gray;">:\&gt;</span><span style="color: Blue;">EXP</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk</span><span style="color: Gray;">/</span><span style="color: Blue;">fsk123</span><span style="color: Gray;">@</span><span style="color: Blue;">demo</span><span style="color: Gray;"> </span><span style="color: Blue;">file</span><span style="color: Gray;">=</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">trans</span><span style="color: Gray;">.</span><span style="color: Blue;">dmp</span><span style="color: Gray;"> </span><span style="color: Blue;">log</span><span style="color: Gray;">=</span><span style="color: Blue;">trans</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Gray;"><br /></span><span style="color: Blue;">Export</span><span style="color: Gray;">: </span><span style="color: Blue;">Release</span><span style="color: Gray;"> </span><span style="color: Maroon;">10.2.0.3.0</span><span style="color: Gray;"> - </span><span style="color: Blue;">Production</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"> 星期四 </span><span style="color: Maroon;">8</span><span style="color: Gray;">月 </span><span style="color: Maroon;">28</span><span style="color: Gray;"> </span><span style="color: Maroon;">12</span><span style="color: Gray;">:</span><span style="color: Maroon;">00</span><span style="color: Gray;">:</span><span style="color: Maroon;">29</span><span style="color: Gray;"> </span><span style="color: Maroon;">2008</span><span style="color: Gray;"><br /></span><span style="color: Blue;">Copyright</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">c</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Maroon;">1982</span><span style="color: Gray;">, </span><span style="color: Maroon;">2005</span><span style="color: Gray;">, </span><span style="color: Blue;">Oracle</span><span style="color: Gray;">.&nbsp; </span><span style="color: Green;">All</span><span style="color: Gray;"> </span><span style="color: Blue;">rights</span><span style="color: Gray;"> </span><span style="color: Blue;">reserved</span><span style="color: Gray;">.<br />连接到: </span><span style="color: Blue;">Oracle</span><span style="color: Gray;"> </span><span style="color: Blue;">Database</span><span style="color: Gray;"> </span><span style="color: Maroon;">10</span><span style="color: #00008b;">g</span><span style="color: Gray;"> </span><span style="color: Blue;">Enterprise</span><span style="color: Gray;"> </span><span style="color: Blue;">Edition</span><span style="color: Gray;"> </span><span style="color: Blue;">Release</span><span style="color: Gray;"> </span><span style="color: Maroon;">10.2.0.3.0</span><span style="color: Gray;"> - </span><span style="color: Blue;">Production</span><span style="color: Gray;"><br /></span><span style="color: Green;">With</span><span style="color: Gray;"> </span><span style="color: Blue;">the</span><span style="color: Gray;"> </span><span style="color: Blue;">Partitioning</span><span style="color: Gray;">, </span><span style="color: Blue;">OLAP</span><span style="color: Gray;"> </span><span style="color: Green;">and</span><span style="color: Gray;"> </span><span style="color: Green;">Data</span><span style="color: Gray;"> </span><span style="color: Blue;">Mining</span><span style="color: Gray;"> </span><span style="color: #00008b;">options</span><span style="color: Gray;"><br />已导出 </span><span style="color: Blue;">ZHS16GBK</span><span style="color: Gray;"> 字符集和 </span><span style="color: Blue;">AL16UTF16</span><span style="color: Gray;"> </span><span style="color: Green;">NCHAR</span><span style="color: Gray;"> 字符集<br />. 正在导出 </span><span style="color: Blue;">pre</span><span style="color: Gray;">-</span><span style="color: Green;">schema</span><span style="color: Gray;"> 过程对象和操作<br />. 正在导出用户 </span><span style="color: Blue;">FSK</span><span style="color: Gray;"> 的外部函数库名<br />. 导出 </span><span style="color: Green;">PUBLIC</span><span style="color: Gray;"> 类型同义词<br />. 正在导出专用类型同义词<br />. 正在导出用户 </span><span style="color: Blue;">FSK</span><span style="color: Gray;"> 的对象类型定义<br />即将导出 </span><span style="color: Blue;">FSK</span><span style="color: Gray;"> 的对象...<br />. 正在导出数据库链接<br />. 正在导出序号<br />. 正在导出簇定义<br />. 即将导出 </span><span style="color: Blue;">FSK</span><span style="color: Gray;"> 的表通过常规路径...<br />. . 正在导出表&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">COMPANY</span><span style="color: Gray;">导出了&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">4176650</span><span style="color: Gray;">行<br />. . 正在导出表&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">DEPT</span><span style="color: Gray;">导出了&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">6900</span><span style="color: Gray;"> 行<br />. . 正在导出表&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">DEPT_MV</span><span style="color: Gray;">导出了&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">12000</span><span style="color: Gray;"> 行<br />. . 正在导出表&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">EMP</span><span style="color: Gray;">导出了&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">120021</span><span style="color: Gray;"> 行<br />. . 正在导出表&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">JOB_SUB</span><span style="color: Gray;">导出了&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">95840</span><span style="color: Gray;"> 行<br />………………………………………………………………………………………<br />.<br />. 正在导出 </span><span style="color: Blue;">post</span><span style="color: Gray;">-</span><span style="color: Green;">schema</span><span style="color: Gray;"> 过程对象和操作<br />. 正在导出统计信息<br />成功终止导出, 没有出现警告。</span></div></div>
<p>(2)导入到目标机（索引不导入）</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #00008b;">C</span><span style="color: Gray;">:\&gt;</span><span style="color: Blue;">imp</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk</span><span style="color: Gray;">/</span><span style="color: Blue;">fsk123</span><span style="color: Gray;">@</span><span style="color: Blue;">my</span><span style="color: Gray;"> </span><span style="color: Blue;">file</span><span style="color: Gray;">=</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">trans</span><span style="color: Gray;">.</span><span style="color: Blue;">dmp</span><span style="color: Gray;"> </span><span style="color: Green;">constraints</span><span style="color: Gray;">=</span><span style="color: Blue;">y</span><span style="color: Gray;"> </span><span style="color: Green;">rows</span><span style="color: Gray;">=</span><span style="color: Blue;">n</span><span style="color: Gray;"> </span><span style="color: Blue;">indexes</span><span style="color: Gray;">=</span><span style="color: Blue;">n</span><span style="color: Gray;"> </span><span style="color: Blue;">log</span><span style="color: Gray;">=</span><span style="color: Blue;">trans</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Gray;"> <br /></span><span style="color: Blue;">Import</span><span style="color: Gray;">: </span><span style="color: Blue;">Release</span><span style="color: Gray;"> </span><span style="color: Maroon;">10.2.0.3.0</span><span style="color: Gray;"> - </span><span style="color: Blue;">Production</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"> 星期四 </span><span style="color: Maroon;">8</span><span style="color: Gray;">月 </span><span style="color: Maroon;">28</span><span style="color: Gray;"> </span><span style="color: Maroon;">13</span><span style="color: Gray;">:</span><span style="color: Maroon;">11</span><span style="color: Gray;">:</span><span style="color: Maroon;">13</span><span style="color: Gray;"> </span><span style="color: Maroon;">2008</span><span style="color: Gray;"><br /></span><span style="color: Blue;">Copyright</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">c</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Maroon;">1982</span><span style="color: Gray;">, </span><span style="color: Maroon;">2005</span><span style="color: Gray;">, </span><span style="color: Blue;">Oracle</span><span style="color: Gray;">.&nbsp; </span><span style="color: Green;">All</span><span style="color: Gray;"> </span><span style="color: Blue;">rights</span><span style="color: Gray;"> </span><span style="color: Blue;">reserved</span><span style="color: Gray;">.<br />连接到: </span><span style="color: Blue;">Oracle</span><span style="color: Gray;"> </span><span style="color: Blue;">Database</span><span style="color: Gray;"> </span><span style="color: Maroon;">10</span><span style="color: #00008b;">g</span><span style="color: Gray;"> </span><span style="color: Blue;">Enterprise</span><span style="color: Gray;"> </span><span style="color: Blue;">Edition</span><span style="color: Gray;"> </span><span style="color: Blue;">Release</span><span style="color: Gray;"> </span><span style="color: Maroon;">10.2.0.2.0</span><span style="color: Gray;"> - </span><span style="color: Blue;">Production</span><span style="color: Gray;"><br /></span><span style="color: Green;">With</span><span style="color: Gray;"> </span><span style="color: Blue;">the</span><span style="color: Gray;"> </span><span style="color: Blue;">Partitioning</span><span style="color: Gray;">, </span><span style="color: Blue;">OLAP</span><span style="color: Gray;"> </span><span style="color: Green;">and</span><span style="color: Gray;"> </span><span style="color: Green;">Data</span><span style="color: Gray;"> </span><span style="color: Blue;">Mining</span><span style="color: Gray;"> </span><span style="color: #00008b;">options</span><span style="color: Gray;"><br />&nbsp;<br />经由常规路径由 </span><span style="color: Blue;">EXPORT</span><span style="color: Gray;">:</span><span style="color: Blue;">V10</span><span style="color: Maroon;">.02.01</span><span style="color: Gray;"> 创建的导出文件<br />已经完成 </span><span style="color: Blue;">ZHS16GBK</span><span style="color: Gray;"> 字符集和 </span><span style="color: Blue;">AL16UTF16</span><span style="color: Gray;"> </span><span style="color: Green;">NCHAR</span><span style="color: Gray;"> 字符集中的导入<br />. 正在将 </span><span style="color: Blue;">FSK</span><span style="color: Gray;"> 的对象导入到 </span><span style="color: Blue;">FSK</span><span style="color: Gray;"><br /></span><span style="color: Blue;">IMP</span><span style="color: Gray;">-</span><span style="color: Maroon;">00017</span><span style="color: Gray;">: 由于 </span><span style="color: Blue;">ORACLE</span><span style="color: Gray;"> 错误 </span><span style="color: Maroon;">2082</span><span style="color: Gray;">, 以下语句失败:<br />&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">CREATE DATABASE LINK </span><span style="color: #8b0000;">&quot;</span><span style="color: Blue;">MY</span><span style="color: Gray;">.</span><span style="color: Blue;">COM</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> CONNECT TO </span><span style="color: #8b0000;">&quot;</span><span style="color: Blue;">FSK</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> IDENTIFIED BY VALUES '053685</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">B4A81E8DFF4EBF5EE4431648D15B' USING 'my'</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br /></span><span style="color: Blue;">IMP</span><span style="color: Gray;">-</span><span style="color: Maroon;">00003</span><span style="color: Gray;">: 遇到 </span><span style="color: Blue;">ORACLE</span><span style="color: Gray;"> 错误 </span><span style="color: Maroon;">2082</span><span style="color: Gray;"><br /></span><span style="color: Blue;">ORA</span><span style="color: Gray;">-</span><span style="color: Maroon;">02082</span><span style="color: Gray;">: 回送数据库链接必须具有连接限定词<br />即将启用约束条件...<br />成功终止导入, 但出现警告。</span></div></div>
<p>(3)登录目标机，禁用外键约束和trigger，删除序列，物化视图以及日志。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; @</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">deal_with_trigger_fk_seq</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br />脚本如下：<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">deal_with_trigger_fk_seq_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">alter trigger </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: #00008b;">TRIGGER_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;"> disable;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_triggers</span><span style="color: Gray;">;<br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">drop sequence </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: Blue;">sequence_name</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;">;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_sequences</span><span style="color: Gray;">;<br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">alter table </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: #00008b;">TABLE_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;"> disable constraints </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: #00008b;">CONSTRAINT_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;">;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_constraints</span><span style="color: Gray;"> </span><span style="color: Green;">where</span><span style="color: Gray;"> </span><span style="color: Blue;">CONSTRAINT_TYPE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">R</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">drop MATERIALIZED VIEW </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: Blue;">MVIEW_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;">;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mviews</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">deal_with_trigger_fk_seq_log</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br />@</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">deal_with_trigger_fk_seq_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span></div></div>
<p>4.	建立源数据库待刷新表的物化视图日志，建立目标数据库的prebuild mv。这部分由脚本统一生成并执行。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">.在源数据库建立</span><span style="color: Blue;">materialized</span><span style="color: Gray;"> </span><span style="color: Green;">view</span><span style="color: Gray;"> </span><span style="color: Blue;">log</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; @</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_log</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br />脚本如下：<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_log_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">create materialized view log on </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: #00008b;">table_name</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;"> with primary key;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"><br /></span><span style="color: Olive;">(</span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #00008b;">table_name</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_tables</span><span style="color: Gray;"> </span><span style="color: Green;">where</span><span style="color: Gray;"> </span><span style="color: Blue;">TABLESPACE_NAME</span><span style="color: Gray;"> </span><span style="color: Green;">is</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;"> </span><span style="color: Blue;">minus</span><span style="color: Gray;"> </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">log_table</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mview_logs</span><span style="color: Gray;"> </span><span style="color: Blue;">minus</span><span style="color: Gray;"> </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">mview_name</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mviews</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_log_log</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br />@</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_log_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span></div></div>
<p>(2).在目标数据库建立materialized view</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">CREATE MATERIALIZED VIEW </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: #00008b;">table_name</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;"> on prebuilt table REFRESH FAST WITH PRIMARY KEY AS SELECT * FROM </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: #00008b;">table_name</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;">@demo;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> <br /></span><span style="color: Olive;">(</span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #00008b;">table_name</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_tables</span><span style="color: Gray;"> </span><span style="color: Green;">where</span><span style="color: Gray;"> </span><span style="color: Blue;">TABLESPACE_NAME</span><span style="color: Gray;"> </span><span style="color: Green;">is</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;"> </span><span style="color: Blue;">minus</span><span style="color: Gray;"> </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">log_table</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mview_logs</span><span style="color: Gray;"> </span><span style="color: Blue;">minus</span><span style="color: Gray;"> </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">mview_name</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mviews</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_log2</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br />@</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span></div></div>
<p>5.	complete方式刷新object，然后生成index。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">@</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">create_mv_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; 脚本如下：<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">refresh_c_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">exec dbms_mview.refresh(</span><span style="color: #8b0000;">'''</span><span style="color: Gray;">||</span><span style="color: Blue;">MVIEW_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'''</span><span style="color: Red;">,</span><span style="color: #8b0000;">''</span><span style="color: Red;">C</span><span style="color: #8b0000;">''</span><span style="color: Red;">);</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mviews</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">refresh_c_log</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br />@</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">refresh_c_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span></div></div>
<p>  生成index</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #00008b;">C</span><span style="color: Gray;">:\&gt;</span><span style="color: Blue;">imp</span><span style="color: Gray;"> </span><span style="color: Blue;">fsk</span><span style="color: Gray;">/</span><span style="color: Blue;">fsk123</span><span style="color: Gray;">@</span><span style="color: Blue;">my</span><span style="color: Gray;"> </span><span style="color: Blue;">file</span><span style="color: Gray;">=</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">trans</span><span style="color: Gray;">.</span><span style="color: Blue;">dmp</span><span style="color: Gray;"> </span><span style="color: Blue;">indexfile</span><span style="color: Gray;">=</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">index</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Blue;">SQLPLUS</span><span style="color: Gray;">&gt;@ </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">index</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span></div></div>
<p>  5．源库停止业务，采用增量方式刷新object完毕，删除prebuild mv，由脚本统一执行。――&#8211;停机过程发生在这步操作。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">refresh_f_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">exec dbms_mview.refresh(</span><span style="color: #8b0000;">'''</span><span style="color: Gray;">||</span><span style="color: Blue;">MVIEW_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'''</span><span style="color: Red;">,</span><span style="color: #8b0000;">''</span><span style="color: Red;">F</span><span style="color: #8b0000;">''</span><span style="color: Red;">);</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mviews</span><span style="color: Gray;">;<br /></span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">drop MATERIALIZED VIEW </span><span style="color: #8b0000;">'</span><span style="color: Gray;">||</span><span style="color: Blue;">MVIEW_NAME</span><span style="color: Gray;">||</span><span style="color: #8b0000;">'</span><span style="color: Red;">;</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">user_mviews</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">refresh_f_log</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">head</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br /></span><span style="color: Green;">set</span><span style="color: Gray;"> </span><span style="color: Blue;">feedback</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"><br />@</span><span style="color: #00008b;">c</span><span style="color: Gray;">:\</span><span style="color: Blue;">refresh_f_command</span><span style="color: Gray;">.</span><span style="color: Green;">sql</span><span style="color: Gray;"><br /></span><span style="color: Blue;">spool</span><span style="color: Gray;"> </span><span style="color: Green;">off</span></div></div>
<p>6．获得此时源数据库sequence创建脚本，部署到目标库，在目标库启用trigger和外键约束,并在目标数据库创建源数据库遗留的物化视图。<br />
   部署序列</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">CREATE SEQUENCE </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> || </span><span style="color: Blue;">SEQUENCE_NAME</span><span style="color: Gray;"> || </span><span style="color: #8b0000;">'</span><span style="color: Red;"> MINVALUE </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> || </span><span style="color: Blue;">MIN_VALUE</span><span style="color: Gray;"> || </span><span style="color: Green;">case</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">when</span><span style="color: Gray;"> </span><span style="color: Blue;">Max_VALUE</span><span style="color: Gray;"> </span><span style="color: Green;">is</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;"> </span><span style="color: Green;">then</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;"> MAXVALUE </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> || </span><span style="color: Blue;">MAX_VALUE</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;"> </span><span style="color: #8b0000;">'</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="color: Green;">end</span><span style="color: Gray;"> || </span><span style="color: #8b0000;">'</span><span style="color: Red;"> INCREMENT BY </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> || </span><span style="color: Blue;">INCREMENT_BY</span><span style="color: Gray;"> ||<br />&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">decode</span><span style="color: Olive;">(</span