<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AnySQL.net &#187; MVIEW</title>
	<atom:link href="http://www.anysql.net/tag/mview/feed" rel="self" type="application/rss+xml" />
	<link>http://www.anysql.net</link>
	<description>SQLULDR2, DataCopy, DataSync, WebChart, OraMon, AUL/MyDUL, 性能优化及容量分析</description>
	<lastBuildDate>Wed, 14 Jul 2010 09:27:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>不能删除物化视图?</title>
		<link>http://www.anysql.net/oracle/drop_busy_materialized_view.html</link>
		<comments>http://www.anysql.net/oracle/drop_busy_materialized_view.html#comments</comments>
		<pubDate>Thu, 17 Jan 2008 19:44:52 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Busy]]></category>
		<category><![CDATA[Drop]]></category>
		<category><![CDATA[MVIEW]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e4%b8%8d%e8%83%bd%e5%88%a0%e9%99%a4%e7%89%a9%e5%8c%96%e8%a7%86%e5%9b%be.html</guid>
		<description><![CDATA[&#160; &#160; 几分钟前一网友问我如何删除一个实体化视图, 当然不是什么语法不会的问题了, 是发了Drop命令后一直挂着, 几个小时都没有结束, 你可以想想为什么? 先看一下创建的语法. create materialized view&#160;&#160;user_order_mavi &#160;&#160;&#160;&#160; build immediate&#160;&#160; &#160;&#160;&#160;&#160; refresh&#160;&#160; on commit&#160;&#160; &#160;&#160;&#160;&#160; enable query rewrite as select&#160;&#160;service_id,substr(user_isdn,1,7), &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bill_type,follow_action,count(user_isdn)&#160;&#160; from user_order group by service_id,substr(user_isdn,1,7), &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;bill_type,follow_action &#160; &#160; 看到这个语句, 应当是刷新的类型那儿有问题, 在ON COMMIT刷新模式下, 如果基表的DML很频繁, 会造成刷新很频繁, 这可能是DROP语句一直挂起的原因. 建议先运行以下命令: ALTER MATERIALIZED VIEW user_order_mavi &#160;&#160; DISABLE QUERY REWRITE &#160;&#160; REFRESH ON DEMAND; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 几分钟前一网友问我如何删除一个实体化视图, 当然不是什么语法不会的问题了, 是发了Drop命令后一直挂着, 几个小时都没有结束, 你可以想想为什么? 先看一下创建的语法. </p>
<blockquote class="prefont"><p>
create materialized view&nbsp;&nbsp;user_order_mavi <br />
&nbsp;&nbsp;&nbsp;&nbsp; build immediate&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; refresh&nbsp;&nbsp; on commit&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; enable query rewrite <br />
as <br />
select&nbsp;&nbsp;service_id,substr(user_isdn,1,7),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill_type,follow_action,count(user_isdn)&nbsp;&nbsp;<br />
from user_order <br />
group by service_id,substr(user_isdn,1,7),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bill_type,follow_action
</p></blockquote>
<p>&nbsp; &nbsp; 看到这个语句, 应当是刷新的类型那儿有问题, 在ON COMMIT刷新模式下, 如果基表的DML很频繁, 会造成刷新很频繁, 这可能是DROP语句一直挂起的原因. 建议先运行以下命令: </p>
<blockquote class="prefont"><p>
ALTER MATERIALIZED VIEW user_order_mavi<br />
&nbsp;&nbsp; DISABLE QUERY REWRITE <br />
&nbsp;&nbsp; REFRESH ON DEMAND;
</p></blockquote>
<p>&nbsp; &nbsp; 由于新很频繁, 上面的ALTER语句也等了有半分多钟, 但最后成功执行了. 接下来再进行删除就没有任何问题了, 也很快! </p>
<p>&nbsp; &nbsp; 如何用好物化视图, 也是一门不小的学问! </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2009/02/06 -- <a href="http://www.anysql.net/dba/keep_enough_archive_log.html" title="归档日志管理不容易">归档日志管理不容易</a> (1)</li><li>2008/07/06 -- <a href="http://www.anysql.net/aulmydul/tuning_update_sql_01.html" title="连错库误删100多张表">连错库误删100多张表</a> (9)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/12/12 -- <a href="http://www.anysql.net/dba/sql_dba_oracle_db.html" title="SQL DBA兼管Oracle库">SQL DBA兼管Oracle库</a> (4)</li><li>2007/12/11 -- <a href="http://www.anysql.net/dba/drop_4tb_table.html" title="删除4TB的表">删除4TB的表</a> (5)</li><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/06/02 -- <a href="http://www.anysql.net/research/use_mylog_for_recovery.html" title="MyLOG程序对于Drop类误操作恢复的作用">MyLOG程序对于Drop类误操作恢复的作用</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/drop_busy_materialized_view.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MVIEW引起ORA-04031</title>
		<link>http://www.anysql.net/oracle/mview_ora_04031.html</link>
		<comments>http://www.anysql.net/oracle/mview_ora_04031.html#comments</comments>
		<pubDate>Tue, 18 Dec 2007 16:50:40 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[Refresh]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/mview%e5%bc%95%e8%b5%b7ora-04031.html</guid>
		<description><![CDATA[&#160; &#160; 有一个数据库报了ORA-04031错误, 等我们上去看时, 却是好的, 通过查询Statspack有关视图, 发现Shared Pool Free Memory在这之前是逐渐减少的, sql area部分占得很大. 可能的原因是, 当Oracle遇到这个错误后, 自动做了一次Flush Pool操作. 于是写了一段程序去跟踪SQL占用的内存, 发现有两个SQL语句很不正常, 版本数很多, 占用的内存也很大, 差不多占了一半的sql area. ASQL&#62; ora share ADDRESS&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CHILDS&#160;&#160;&#160;&#160; BYTES &#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212; &#8212;&#8212;&#8212; 0000040000A328F8&#160;&#160; 1026 215577124 000004000F7AB058&#160;&#160; 1026 215503530 &#160; &#160; 来看一下这两个SQL语句是什么? ASQL&#62; ora sql 0000040000A328F8 update sys.sumpartlog$ s set s.timestamp = :1, s.scn = :2 &#160;&#160;where&#160;&#160;rowid in&#160;&#160;(select [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 有一个数据库报了ORA-04031错误, 等我们上去看时, 却是好的, 通过查询Statspack有关视图, 发现Shared Pool Free Memory在这之前是逐渐减少的, sql area部分占得很大. 可能的原因是, 当Oracle遇到这个错误后, 自动做了一次Flush Pool操作. 于是写了一段程序去跟踪SQL占用的内存, 发现有两个SQL语句很不正常, 版本数很多, 占用的内存也很大, 差不多占了一半的sql area.</p>
<blockquote class="prefont"><p>
ASQL&gt; ora share</p>
<p>ADDRESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHILDS&nbsp;&nbsp;&nbsp;&nbsp; BYTES<br />
&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212; &#8212;&#8212;&#8212;<br />
0000040000A328F8&nbsp;&nbsp; 1026 215577124<br />
000004000F7AB058&nbsp;&nbsp; 1026 215503530
</p></blockquote>
<p>&nbsp; &nbsp; 来看一下这两个SQL语句是什么? </p>
<blockquote class="prefont"><p>
ASQL&gt; ora sql 0000040000A328F8</p>
<p>update sys.sumpartlog$ s set s.timestamp = :1, s.scn = :2 <br />
&nbsp;&nbsp;where&nbsp;&nbsp;rowid in&nbsp;&nbsp;(select rowid from sumpartlog$ AS OF SNAPSHOT(:3) s1 <br />
&nbsp;&nbsp;&nbsp;&nbsp; where s1.bo# = :4&nbsp;&nbsp; and s1.timestamp &gt;= <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_date(&#8217;4000-01-01:00:00:00&#8242;,&#8217;YYYY-MM-DD:HH24:MI:SS&#8217;))</p>
<p>ASQL&gt; ora sql 000004000F7AB058</p>
<p>update sys.sumdelta$ s set s.timestamp = :1, s.scn = :2&nbsp;&nbsp;<br />
&nbsp;&nbsp; where&nbsp;&nbsp;rowid in&nbsp;&nbsp;(select rowid from sys.sumdelta$ AS OF SNAPSHOT (:3) s1&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where s1.tableobj# = :4&nbsp;&nbsp; and s1.timestamp &gt;= <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(&#8217;4000-01-01:00:00:00&#8242;,&#8217;YYYY-MM-DD:HH24:MI:SS&#8217;))
</p></blockquote>
<p>&nbsp; &nbsp; 很明显这不是我们系统中的SQL语句, 因具只好搜索Metalink了, 找到这两个表和实体化视图的On Commit刷新有关. 进一步查这些SQL语句不能共享的原因, 发现都是FLASHBACK CURSOR这一列为Y. 进一步搜索Metalink, 终于找到原因了, 是Bug 6010070. 现在还没有办法解决, Oracle明确没有说哪个版本已解决. 只要不用On Commit刷新就行了. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/improve_mv_refresh.html" title="Oracle的实体化视图(MVIEW)的深入研究之一">Oracle的实体化视图(MVIEW)的深入研究之一</a> (0)</li><li>2008/08/04 -- <a href="http://www.anysql.net/oracle/high_phyread_assm_dml.html" title="ASSM下DML的物理读高">ASSM下DML的物理读高</a> (5)</li><li>2008/07/28 -- <a href="http://www.anysql.net/oracle/get_the_credit_card.html" title="不可逆的日期转换">不可逆的日期转换</a> (4)</li><li>2008/06/23 -- <a href="http://www.anysql.net/dba/apache_tomcat.html" title="根据表名搜索SQL语句">根据表名搜索SQL语句</a> (0)</li><li>2008/03/15 -- <a href="http://www.anysql.net/dba/hash_join_or_condition.html" title="OR引起的Join性能问题">OR引起的Join性能问题</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/mview_ora_04031.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>问题解答 &#8212; 如何得知一张表的纪录有变化?</title>
		<link>http://www.anysql.net/dba/capture_table_row_change.html</link>
		<comments>http://www.anysql.net/dba/capture_table_row_change.html#comments</comments>
		<pubDate>Wed, 18 Jul 2007 06:22:26 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[DBA]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Table]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94-%e5%a6%82%e4%bd%95%e5%be%97%e7%9f%a5%e4%b8%80%e5%bc%a0%e8%a1%a8%e7%9a%84%e7%ba%aa%e5%bd%95%e6%9c%89%e5%8f%98%e5%8c%96.html</guid>
		<description><![CDATA[&#160; &#160; 网上有一个问题, 要想知道那些表记录发生了变化? 对于一些更新不是很多(一秒种有几百条上下的)的表, 我会建议用实体化视图日志(Materialize View Log/Snapshot Log)去实现. 其基本原理是能过一个内部(Internal)的内核(Kernal)一级的行级触发器(Row Level Trigger), 将变化过的记录的ROWID或主键值保存到另一个表中去. 实体化视图的增量刷新(Fast Refresh)正是基于这个技术. &#160; &#160; 假设我们需要监控的表名为T_OBJECTS, 主键为OBJECT_ID, 如果没有主键则用ROWID, 则可以用如下语句来创建实体化视图日志. &#8211; Using Primary Key CREATE MATERIALIZED VIEW LOG ON T_OBJECTS &#160;&#160;TABLESPACE users WITH PRIMARY KEY, SEQUENCE; &#8211; Using ROWID CREATE MATERIALIZED VIEW LOG ON T_OBJECTS &#160;&#160;TABLESPACE users WITH ROWID, SEQUENCE; &#160; &#160; 这时会在Oracle中生成一个MLOG$_T_OBJECTS的表, 包含如下有用字段: [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 网上有一个问题, 要想知道那些表记录发生了变化? 对于一些更新不是很多(一秒种有几百条上下的)的表, 我会建议用实体化视图日志(Materialize View Log/Snapshot Log)去实现. 其基本原理是能过一个内部(Internal)的内核(Kernal)一级的行级触发器(Row Level Trigger), 将变化过的记录的ROWID或主键值保存到另一个表中去. 实体化视图的增量刷新(Fast Refresh)正是基于这个技术. </p>
<p>&nbsp; &nbsp; 假设我们需要监控的表名为T_OBJECTS, 主键为OBJECT_ID, 如果没有主键则用ROWID, 则可以用如下语句来创建实体化视图日志. </p>
<blockquote class="prefont"><p>
&#8211; Using Primary Key<br />
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS <br />
&nbsp;&nbsp;TABLESPACE users WITH PRIMARY KEY, SEQUENCE;</p>
<p>&#8211; Using ROWID<br />
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS <br />
&nbsp;&nbsp;TABLESPACE users WITH ROWID, SEQUENCE;
</p></blockquote>
<p>&nbsp; &nbsp; 这时会在Oracle中生成一个MLOG$_T_OBJECTS的表, 包含如下有用字段: </p>
<blockquote class="prefont"><p>
SEQUENCE$$ &#8212; Operation Order<br />
DMLTYPE$$&nbsp;&nbsp;&#8211; Operation Type, U=Update/I=Insert/D=Delete<br />
M_ROW$$&nbsp;&nbsp;&nbsp;&nbsp;&#8211; ROWID of affected row, <br />
OBJECT_ID&nbsp;&nbsp;&#8211; The primary key values in this case
</p></blockquote>
<p>&nbsp; &nbsp; 我用ROWID类型的做了实验, 先做了一条Insert, 再做了一条Delete, 然后查询日志表记录: </p>
<blockquote class="prefont"><p>
SQL&gt; SELECT SEQUENCE$$, M_ROW$$, DMLTYPE$$ FROM MLOG$_T_OBJECTS;</p>
<p>SEQUENCE$$ M_ROW$$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; -<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 AAACYhAAEAAAEFvAAA&nbsp;&nbsp; I<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 AAACYhAAEAAACOMAAA&nbsp;&nbsp; D
</p></blockquote>
<p>&nbsp; &nbsp; 更复杂的例子就自已去设计了. 如果搞懂了这些, 还可以自已写角本从Oracle向其他的数据库进行<a href="http://www.anysql.net/tools/perl_refresh_mysql.html">数据复制</a>呢. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/reorg_master_table.html" title="Oracle的实体化视图(MVIEW)的深入研究之二">Oracle的实体化视图(MVIEW)的深入研究之二</a> (0)</li><li>2009/02/05 -- <a href="http://www.anysql.net/dba/change_export_tablespace.html" title="导出时如何统一表空间?">导出时如何统一表空间?</a> (2)</li><li>2008/07/24 -- <a href="http://www.anysql.net/oracle/linux_move_files.html" title="事务数高了会如何?">事务数高了会如何?</a> (3)</li><li>2008/06/23 -- <a href="http://www.anysql.net/dba/apache_tomcat.html" title="根据表名搜索SQL语句">根据表名搜索SQL语句</a> (0)</li><li>2008/05/26 -- <a href="http://www.anysql.net/oracle/imp_to_another_table.html" title="ASSM表空间真浪费">ASSM表空间真浪费</a> (6)</li><li>2008/05/15 -- <a href="http://www.anysql.net/dba/aul_better_for_nchar.html" title="将dmp数据导入到另一个表">将dmp数据导入到另一个表</a> (3)</li><li>2008/03/13 -- <a href="http://www.anysql.net/dba/deny_table_big_dml.html" title="如何防止大的DML语句?">如何防止大的DML语句?</a> (3)</li><li>2008/03/06 -- <a href="http://www.anysql.net/dba/shareplex_from_europe.html" title="HVR, 欧州的Shareplex?">HVR, 欧州的Shareplex?</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/dba/capture_table_row_change.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使refresh_mysql适用于数据归档的一点改进</title>
		<link>http://www.anysql.net/tools/refresh_mysql_delete_where.html</link>
		<comments>http://www.anysql.net/tools/refresh_mysql_delete_where.html#comments</comments>
		<pubDate>Fri, 30 Mar 2007 05:29:47 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Archive]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Refresh]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e4%bd%bfrefresh_mysql%e9%80%82%e7%94%a8%e4%ba%8e%e6%95%b0%e6%8d%ae%e5%bd%92%e6%a1%a3%e7%9a%84%e4%b8%80%e7%82%b9%e6%94%b9%e8%bf%9b.html</guid>
		<description><![CDATA[&#160; &#160; 受上一篇中案例的启发, 对refresh_mysql角本作了一点点改进, 可以为DELETE目标数据库的SQL加一个WHERE条件, 以防止删除不想删除的数据. 举个简单的例子来说, 有一个产品数据和历史库, 产品库中只有今年的记录, 而历史库中包括所有(当前的和07年以前)的数据, 我们还需要将产品库的修改比较实时地反应到历史库中, 那么我有可能要经常在产品库中删除三个月以前的记录, 为了不让这些删除操作被复制到历史库中, 就可以加一个Where条件了, 如&#8221;CREATE_DATE > SYSDATE &#8211; 30&#8243;, 这样的话, 就只能在历史库中更新最近三个月的记录了: &#160; &#160; 只需要refresh_mysql角本的配置文件后面再加一列, 如下所示: # SOURCE&#160;&#160;# PKEY&#160;&#160;&#160;&#160;&#160;&#160;# MVIEW Log&#160;&#160;&#160;&#160;&#160;&#160; # TARGET T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS # CREATE_DATE &#62; SYSDATE &#8211; 30 &#160; &#160; 这时在构造出来的删除目标表的SQL语句为: DELETE T_OBJECTS WHERE OBJECT_ID = ? AND [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 受<a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html">上一篇</a>中案例的启发, 对refresh_mysql角本作了一点点改进, 可以为DELETE目标数据库的SQL加一个WHERE条件, 以防止删除不想删除的数据. 举个简单的例子来说, 有一个产品数据和历史库, 产品库中只有今年的记录, 而历史库中包括所有(当前的和07年以前)的数据, 我们还需要将产品库的修改比较实时地反应到历史库中, 那么我有可能要经常在产品库中删除三个月以前的记录, 为了不让这些删除操作被复制到历史库中, 就可以加一个Where条件了, 如&#8221;CREATE_DATE > SYSDATE &#8211; 30&#8243;, 这样的话, 就只能在历史库中更新最近三个月的记录了: </p>
<p>&nbsp; &nbsp; 只需要refresh_mysql角本的<a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html">配置文件</a>后面再加一列, 如下所示: </p>
<blockquote class="prefont"><p>
# SOURCE&nbsp;&nbsp;# PKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# MVIEW Log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # TARGET<br />
T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS # CREATE_DATE &gt; SYSDATE &#8211; 30
</p></blockquote>
<p>&nbsp; &nbsp; 这时在构造出来的删除目标表的SQL语句为: </p>
<blockquote class="prefont"><p>
DELETE T_OBJECTS WHERE OBJECT_ID = ? AND CREATE_DATE &gt; SYSDATE &#8211; 30
</p></blockquote>
<p>&nbsp; &nbsp; 其他的改进, 现在已经不是将UPDATE转化为先DELETE后INSERT了, 而是直接UPDATE, 以提高程序的效率, 减轻目标数据库的压力. 本角本可以免费使用, 但不提供免费的支持服务.</p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/09/04 -- <a href="http://www.anysql.net/developer/tuning_with_array_dml.html" title="在Perl中用Array DML来进行性能调优">在Perl中用Array DML来进行性能调优</a> (0)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li><li>2007/03/12 -- <a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html" title="从Oracle向MySQL或其他库的数据复制方法">从Oracle向MySQL或其他库的数据复制方法</a> (7)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/improve_mv_refresh.html" title="Oracle的实体化视图(MVIEW)的深入研究之一">Oracle的实体化视图(MVIEW)的深入研究之一</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/tools/refresh_mysql_delete_where.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>由物化视图Complete刷新引起的数据丢失</title>
		<link>http://www.anysql.net/dba/data_lost_by_mview_refresh.html</link>
		<comments>http://www.anysql.net/dba/data_lost_by_mview_refresh.html#comments</comments>
		<pubDate>Thu, 29 Mar 2007 22:18:32 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[DBA]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Recovery]]></category>
		<category><![CDATA[Refresh]]></category>
		<category><![CDATA[Replication]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e7%94%b1%e7%89%a9%e5%8c%96%e8%a7%86%e5%9b%becomplete%e5%88%b7%e6%96%b0%e5%bc%95%e8%b5%b7%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1.html</guid>
		<description><![CDATA[&#160; &#160; 今日早上, 在网上看到一篇贴子, 问了如下两个问题: 数据仓库中有2007年之前的数据 问题一: 如何保持erp与数据仓库中2007年数据一致而数据仓库中2007年之前数据不变(以前通过dbms_mview.refresh(&#8216;xxx&#8217;,'fast&#8217;))? 问题二: 我对x物化视图做了一个全部刷新,但是x物化视图中的数据全部变成2007年的数据,以前数据丢失?如阿恢复到刷新前的状态 &#160; &#160; 其中第一个问题是个难题, 现在很多公司都在想这样的一个解决方案, 其实就是一个实时复制方案, 从在的角度来说, 这方面可以用的方案有: 1, Quest公司的SharePlex; 2, DSG公司的RealSync(没有一点印象); 3, Oracle公司的Stream. 前两者都是比较贵的解决方案, Oracle的Stream懂的人少, 而且在9i中还不够稳定. 物化视图并不适合用来归档生产库的数据到历史库, 原来就象第二点所说的那样, 如果进行全部刷新, Oracle会先在目标数据库上运行一个DELETE命令来删除所有的数据(你可以SQL_TRACE一把), 估计这位老兄也是查了资料或翻了贴子后, 觉得物化视图可以做到这一点, 所以这样做了一把, 结果就是数据被删除了. &#160; &#160; 最近我也一直在想这样的一个解决的方法, 在物化视图中, 用物化视图日志来捕获对表的变更, 是一个比较好的方法(对于负荷不是很高的数据库), 完全可以利用这一点, 自已编程来实现和物化视图刷新这样的功能, 最近我写的refresh_mysql角本就是用来做这个的. 当然当初考虑的是从Oracle中将数据比较实时地同步到MySQL或其他数据库中, 从角本的名字也可以猜出来. 但后来发现数据源也未必一定要是Oracle了, 其他的库可以用触发器来实现Oracle中的物化视图日志的功能, 目标数据也可以是Oracle. &#160; &#160; 如何高效地维护一个表的逻辑拷贝, 其实是一个比较难的问题, 象SharePlex是Quest公司的最主要的拳头产品. Relative Posts:2007/03/14 [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 今日早上, 在网上看到<a href="http://www.itpub.net/showthread.php?threadid=745897&#038;pagenumber=">一篇贴子</a>, 问了如下两个问题: </p>
<blockquote>
<p>数据仓库中有2007年之前的数据</p>
<p>问题一:<br />
如何保持erp与数据仓库中2007年数据一致而数据仓库中2007年之前数据不变(以前通过dbms_mview.refresh(&#8216;xxx&#8217;,'fast&#8217;))?</p>
<p>问题二:<br />
我对x物化视图做了一个全部刷新,但是x物化视图中的数据全部变成2007年的数据,以前数据丢失?如阿恢复到刷新前的状态</p>
</blockquote>
<p>&nbsp; &nbsp; 其中第一个问题是个难题, 现在很多公司都在想这样的一个解决方案, 其实就是一个实时复制方案, 从在的角度来说, 这方面可以用的方案有: 1, Quest公司的SharePlex; 2, DSG公司的RealSync(没有一点印象); 3, Oracle公司的Stream. 前两者都是比较贵的解决方案, Oracle的Stream懂的人少, 而且在9i中还不够稳定. 物化视图并不适合用来归档生产库的数据到历史库, 原来就象第二点所说的那样, 如果进行全部刷新,  Oracle会先在目标数据库上运行一个DELETE命令来删除所有的数据(你可以SQL_TRACE一把), 估计这位老兄也是<strong>查了资料或翻了贴子</strong>后, 觉得物化视图可以做到这一点, 所以这样做了一把, 结果就是数据被删除了. </p>
<p>&nbsp; &nbsp; 最近我也一直在想这样的一个解决的方法, 在物化视图中, 用物化视图日志来捕获对表的变更, 是一个比较好的方法(对于负荷不是很高的数据库), 完全可以利用这一点, 自已编程来实现和物化视图刷新这样的功能, 最近我写的refresh_mysql角本就是用来做这个的. 当然当初考虑的是从Oracle中将数据比较实时地同步到MySQL或其他数据库中, 从角本的名字也可以猜出来. 但后来发现数据源也未必一定要是Oracle了, 其他的库可以用触发器来实现Oracle中的物化视图日志的功能, 目标数据也可以是Oracle. </p>
<p>&nbsp; &nbsp; 如何高效地维护一个表的逻辑拷贝, 其实是一个比较难的问题, 象SharePlex是Quest公司的最主要的拳头产品. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li><li>2007/03/12 -- <a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html" title="从Oracle向MySQL或其他库的数据复制方法">从Oracle向MySQL或其他库的数据复制方法</a> (7)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/09/04 -- <a href="http://www.anysql.net/developer/tuning_with_array_dml.html" title="在Perl中用Array DML来进行性能调优">在Perl中用Array DML来进行性能调优</a> (0)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/improve_mv_refresh.html" title="Oracle的实体化视图(MVIEW)的深入研究之一">Oracle的实体化视图(MVIEW)的深入研究之一</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/dba/data_lost_by_mview_refresh.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>在MySQL中建立实体化视图日志</title>
		<link>http://www.anysql.net/developer/mysql_mview_log.html</link>
		<comments>http://www.anysql.net/developer/mysql_mview_log.html#comments</comments>
		<pubDate>Sun, 25 Mar 2007 02:57:03 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Developer]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Refresh]]></category>
		<category><![CDATA[Replication]]></category>
		<category><![CDATA[Trigger]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e5%9c%a8mysql%e4%b8%ad%e5%bb%ba%e7%ab%8b%e5%ae%9e%e4%bd%93%e5%8c%96%e8%a7%86%e5%9b%be%e6%97%a5%e5%bf%97.html</guid>
		<description><![CDATA[&#160; &#160; 在MySQL中建立实体化视图日志表, 在这里基表表名是T_MVLOG, 主键字段是COL1. 日志表结构如下: CREATE TABLE MLOG$_T_MVLOG ( &#160;&#160; SEQUENCE$$ BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, &#160;&#160; DMLTYPE$$ CHAR, &#160;&#160; COL1 BIGINT ); &#160; &#160; Oracle中的实体化视图是用触发器来实现的, 不同的是早期版本是用Internal Trigger(但还可以在Trigger$表中查到), 而在8i及以后的版本中, 则变为Kernel Level Trigger(在Trigger$中是找不到了). 我们现在在MySQL中手工建立触发器, 说不定以后MySQL真的也引入实体化视图功能呢? 也在Kernel级别来实现呢? 发现建立触发器的语句好象Oracle的PL/SQL. DELIMITER &#124; CREATE TRIGGER TLOG$_I_T_MVLOG BEFORE INSERT ON T_MVLOG &#160;&#160;FOR EACH ROW BEGIN &#160;&#160;&#160;&#160;INSERT INTO MLOG$_T_MVLOG (DMLTYPE$$,COL1) [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 在MySQL中建立实体化视图日志表, 在这里基表表名是T_MVLOG, 主键字段是COL1. 日志表结构如下: </p>
<blockquote class="prefont"><p>
CREATE TABLE MLOG$_T_MVLOG<br />
(<br />
&nbsp;&nbsp; SEQUENCE$$ BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,<br />
&nbsp;&nbsp; DMLTYPE$$ CHAR, <br />
&nbsp;&nbsp; COL1 BIGINT<br />
);
</p></blockquote>
<p>&nbsp; &nbsp; Oracle中的实体化视图是用触发器来实现的, 不同的是早期版本是用Internal Trigger(但还可以在Trigger$表中查到), 而在8i及以后的版本中, 则变为Kernel Level Trigger(在Trigger$中是找不到了). 我们现在在MySQL中手工建立触发器, 说不定以后MySQL真的也引入实体化视图功能呢? 也在Kernel级别来实现呢? 发现建立触发器的语句好象Oracle的PL/SQL.</p>
<blockquote class="prefont"><p>
DELIMITER |</p>
<p>CREATE TRIGGER TLOG$_I_T_MVLOG BEFORE INSERT ON T_MVLOG<br />
&nbsp;&nbsp;FOR EACH ROW BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO MLOG$_T_MVLOG (DMLTYPE$$,COL1) VALUES (&#8216;I&#8217;,NEW.COL1);<br />
&nbsp;&nbsp;END;<br />
|</p>
<p>CREATE TRIGGER TLOG$_U_T_MVLOG BEFORE UPDATE ON T_MVLOG<br />
&nbsp;&nbsp;FOR EACH ROW BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;IF (NEW.COL1 = OLD.COL1) THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO MLOG$_T_MVLOG (DMLTYPE$$,COL1) VALUES (&#8216;U&#8217;,OLD.COL1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ELSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO MLOG$_T_MVLOG (DMLTYPE$$,COL1) VALUES (&#8216;D&#8217;,OLD.COL1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO MLOG$_T_MVLOG (DMLTYPE$$,COL1) VALUES (&#8216;I&#8217;,NEW.COL1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;END IF;<br />
&nbsp;&nbsp;END;<br />
|</p>
<p>CREATE TRIGGER TLOG$_D_T_MVLOG BEFORE DELETE ON T_MVLOG<br />
&nbsp;&nbsp;FOR EACH ROW BEGIN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INSERT INTO MLOG$_T_MVLOG (DMLTYPE$$,COL1) VALUES (&#8216;D&#8217;,OLD.COL1);<br />
&nbsp;&nbsp;END;<br />
|</p>
<p>DELIMITER ;
</p></blockquote>
<p>&nbsp; &nbsp; 看看触发器是否工作正常吧: </p>
<blockquote class="prefont"><p>
mysql&gt; INSERT INTO T_MVLOG VALUES (1000,&#8217;LOU&#8217;,100.10,&#8217;FANGXIN&#8217;);<br />
Query OK, 1 row affected (0.07 sec)</p>
<p>mysql&gt; COMMIT;<br />
Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; SELECT * FROM MLOG$_T_MVLOG;<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+<br />
| SEQUENCE$$ | DMLTYPE$$ | COL1 |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 | I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1000 |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+<br />
1 row in set (0.00 sec)
</p></blockquote>
<p>&nbsp; &nbsp; 运行refresh_mysql.pl, 将数据从MySQL中复制到Oracle中, 分别在MySQL和Oracle查询日志表和目标表: </p>
<blockquote class="prefont"><p>
mysql&gt; select * from mlog$_t_mvlog;<br />
Empty set (0.00 sec)</p>
<p>SQL&gt; select * from t_mvlog;</p>
<p>COL1 COL2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COL3 COL4<br />
&#8212;- &#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
1000 LOU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100.1 FANGXIN
</p></blockquote>
<p>&nbsp; &nbsp; 继续检查这些触发器, 在Update时能不能正常工作: </p>
<blockquote class="prefont"><p>
mysql&gt; update t_mvlog set col1=&#8217;1001&#8242;;<br />
Query OK, 1 row affected (0.03 sec)<br />
Rows matched: 1&nbsp;&nbsp;Changed: 1&nbsp;&nbsp;Warnings: 0</p>
<p>mysql&gt; select * from mlog$_t_mvlog;<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+<br />
| SEQUENCE$$ | DMLTYPE$$ | COL1 |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 | D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1000 |<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 | I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1001 |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+<br />
2 rows in set (0.00 sec)
</p></blockquote>
<p>&nbsp; &nbsp; DELETE的结果就不写在这儿了, 要不太长了. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li><li>2007/03/12 -- <a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html" title="从Oracle向MySQL或其他库的数据复制方法">从Oracle向MySQL或其他库的数据复制方法</a> (7)</li><li>2009/06/09 -- <a href="http://www.anysql.net/tools/copydata-perl-scripts.html" title="copydata异构数据拷贝">copydata异构数据拷贝</a> (6)</li><li>2009/03/30 -- <a href="http://www.anysql.net/mysql/mysql_multiple_masters.html" title="多Master的MySQL设想">多Master的MySQL设想</a> (3)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/09/04 -- <a href="http://www.anysql.net/developer/tuning_with_array_dml.html" title="在Perl中用Array DML来进行性能调优">在Perl中用Array DML来进行性能调优</a> (0)</li><li>2007/04/11 -- <a href="http://www.anysql.net/mysql/mysql_binlog_miner.html" title="MySQL中的LogMiner工具 &#8212; mysqlbinlog">MySQL中的LogMiner工具 &#8212; mysqlbinlog</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/developer/mysql_mview_log.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>refresh_mysql.pl角本的一个配置例子</title>
		<link>http://www.anysql.net/tools/oracle_mysql_replication_demo.html</link>
		<comments>http://www.anysql.net/tools/oracle_mysql_replication_demo.html#comments</comments>
		<pubDate>Thu, 15 Mar 2007 03:43:21 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Refresh]]></category>
		<category><![CDATA[Replication]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/refresh_mysql-pl%e8%a7%92%e6%9c%ac%e7%9a%84%e4%b8%80%e4%b8%aa%e9%85%8d%e7%bd%ae%e4%be%8b%e5%ad%90.html</guid>
		<description><![CDATA[&#160; &#160; 在Oracle中创建表和实体化视图日志: CREATE TABLE T_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM &#60; 1; ALTER TABLE T_OBJECTS MODIFY OBJECT_ID NOT NULL; ALTER TABLE T_OBJECTS ADD PRIMARY KEY (OBJECT_ID); CREATE MATERIALIZED VIEW LOG ON T_OBJECTS WITH PRIMARY KEY, SEQUENCE; &#160; &#160; 在MySQL中创建测试表: CREATE TABLE t_objects ( &#160;&#160;OBJECT_ID decimal(10,0) NOT NULL,&#160;&#160;OWNER varchar(30) , &#160;&#160;OBJECT_NAME varchar(128) ,&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 在Oracle中创建表和实体化视图日志:</p>
<blockquote class="prefont"><p>
CREATE TABLE T_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM &lt; 1;<br />
ALTER TABLE T_OBJECTS MODIFY OBJECT_ID NOT NULL;<br />
ALTER TABLE T_OBJECTS ADD PRIMARY KEY (OBJECT_ID);<br />
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS WITH PRIMARY KEY, SEQUENCE;
</p></blockquote>
<p>&nbsp; &nbsp; 在MySQL中创建测试表:</p>
<blockquote class="prefont"><p>
CREATE TABLE t_objects (<br />
&nbsp;&nbsp;OBJECT_ID decimal(10,0) NOT NULL,&nbsp;&nbsp;OWNER varchar(30) ,<br />
&nbsp;&nbsp;OBJECT_NAME varchar(128) ,&nbsp;&nbsp; SUBOBJECT_NAME varchar(30) ,<br />
&nbsp;&nbsp;DATA_OBJECT_ID decimal(10,0) ,&nbsp;&nbsp;OBJECT_TYPE varchar(18) ,<br />
&nbsp;&nbsp;CREATED datetime ,&nbsp;&nbsp; LAST_DDL_TIME datetime ,<br />
&nbsp;&nbsp;TIMESTAMP varchar(19) ,&nbsp;&nbsp;STATUS varchar(7) ,<br />
&nbsp;&nbsp;TEMPORARY varchar(1) ,&nbsp;&nbsp;GENERATED varchar(1) ,<br />
&nbsp;&nbsp;SECONDARY varchar(1) ,&nbsp;&nbsp;PRIMARY KEY&nbsp;&nbsp;(OBJECT_ID)<br />
);
</p></blockquote>
<p>&nbsp; &nbsp; 创建一个配置文件(demo.conf):</p>
<blockquote class="prefont"><p>
# SOURCE&nbsp;&nbsp;# PKEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# MVIEW Log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # TARGET<br />
T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS
</p></blockquote>
<p>&nbsp; &nbsp; 运行refresh_mysql.pl角本(我装的是ActivePerl):</p>
<blockquote><p>
perl refresh_mysql.pl -s Oracle用户名#口令#Oracle:连接串 -t MySQL用户名#口令#MySQL:数据库名:主机 -c demo.conf
</p></blockquote>
<p>&nbsp; &nbsp; 然后你在Oracle端进行插入或更新或删除, 看看记录有没有被复制过去.</p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li><li>2007/09/04 -- <a href="http://www.anysql.net/developer/tuning_with_array_dml.html" title="在Perl中用Array DML来进行性能调优">在Perl中用Array DML来进行性能调优</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li><li>2007/03/12 -- <a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html" title="从Oracle向MySQL或其他库的数据复制方法">从Oracle向MySQL或其他库的数据复制方法</a> (7)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/improve_mv_refresh.html" title="Oracle的实体化视图(MVIEW)的深入研究之一">Oracle的实体化视图(MVIEW)的深入研究之一</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/tools/oracle_mysql_replication_demo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>写了一个从Oracle复制到MySQL的Perl角本</title>
		<link>http://www.anysql.net/tools/perl_refresh_mysql.html</link>
		<comments>http://www.anysql.net/tools/perl_refresh_mysql.html#comments</comments>
		<pubDate>Tue, 13 Mar 2007 21:22:37 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Replication]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e5%86%99%e4%ba%86%e4%b8%80%e4%b8%aa%e4%bb%8eoracle%e5%a4%8d%e5%88%b6%e5%88%b0mysql%e7%9a%84perl%e8%a7%92%e6%9c%ac.html</guid>
		<description><![CDATA[&#160; &#160; 根据对实体化视图的研究及昨天的设想, 花了大约一个早上的时间, 写了一个从Oracle复制到MySQL的Perl角本, 早上测试时还是比较有趣的. 在现在的角本中, 源表名和目标表名可以不一样, 但字段名必须一样. &#160; &#160; 做测试时, 先开一个窗口, 运行刷新角本: C:\AnySQL&#62;perl refresh_mysql.pl -s anysql:anysql:test -t mysql:root:mysql:localhost:test -c myrefresh.conf 02/13 12:52:25 &#8211; 1 tables will be processed. 02/13 12:53:06 &#8211; Start replication from T_MVLOG to T_MVLOG with sequence 10196 to 10199 &#8230; 02/13 12:53:07 &#8211; End replication from T_MVLOG to T_MVLOG with [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 根据对实体化视图的研究及<a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html">昨天的设想</a>, 花了大约一个早上的时间, 写了一个从Oracle复制到MySQL的Perl角本, 早上测试时还是比较有趣的. 在现在的角本中, 源表名和目标表名可以不一样, 但字段名必须一样.</p>
<p>&nbsp; &nbsp; 做测试时, 先开一个窗口, 运行刷新角本: </p>
<blockquote class="prefont"><p>
C:\AnySQL&gt;perl <a href="http://www.anysql.net/software/refresh_mysql.zip">refresh_mysql.pl</a> -s anysql:anysql:test -t mysql:root:mysql:localhost:test -c myrefresh.conf<br />
02/13 12:52:25 &#8211; 1 tables will be processed.<br />
02/13 12:53:06 &#8211; Start replication from T_MVLOG to T_MVLOG with sequence 10196 to 10199 &#8230;<br />
02/13 12:53:07 &#8211; End replication from T_MVLOG to T_MVLOG with sequence 10196 to 10199.<br />
02/13 12:53:26 &#8211; Start replication from T_MVLOG to T_MVLOG with sequence 10200 to 10203 &#8230;<br />
02/13 12:53:27 &#8211; End replication from T_MVLOG to T_MVLOG with sequence 10200 to 10203.<br />
02/13 12:54:11 &#8211; Start replication from T_MVLOG to T_MVLOG with sequence 10204 to 10204 &#8230;<br />
02/13 12:54:12 &#8211; End replication from T_MVLOG to T_MVLOG with sequence 10204 to 10204.<br />
02/13 12:56:13 &#8211; Start replication from T_MVLOG to T_MVLOG with sequence 10205 to 10207 &#8230;<br />
02/13 12:56:14 &#8211; End replication from T_MVLOG to T_MVLOG with sequence 10205 to 10207.<br />
02/13 13:11:41 &#8211; Start replication from T_MVLOG to T_MVLOG with sequence 10208 to 10211 &#8230;<br />
02/13 13:11:42 &#8211; End replication from T_MVLOG to T_MVLOG with sequence 10208 to 10211.
</p></blockquote>
<p>&nbsp; &nbsp; 在源端(Oracle)中插入一些记录, 并作查询: </p>
<blockquote class="prefont"><p>
SQL&gt; SELECT * FROM T_MVLOG;</p>
<p>COL1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COL2<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
MLOG$_T_MVLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE<br />
MV_T_MVLOG2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE<br />
RUPD$_T_MVLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE<br />
T_MVLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE
</p></blockquote>
<p>&nbsp; &nbsp; 等了3-5秒钟后, 在目标端(MySQL)中进行查询: </p>
<blockquote class="prefont"><p>
mysql&gt; select * from t_mvlog;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+<br />
| COL1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| COL2&nbsp;&nbsp;|<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+<br />
| MLOG$_T_MVLOG | TABLE |<br />
| MV_T_MVLOG2&nbsp;&nbsp; | TABLE |<br />
| RUPD$_T_MVLOG | TABLE |<br />
| T_MVLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | TABLE |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+<br />
4 rows in set (0.00 sec)
</p></blockquote>
<p>&nbsp; &nbsp; 接下来事是要进行更多的测试, 以及进行压力测试. 就算玩玩的角本, 也有很多需要改进的地方. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/12 -- <a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html" title="从Oracle向MySQL或其他库的数据复制方法">从Oracle向MySQL或其他库的数据复制方法</a> (7)</li><li>2007/09/04 -- <a href="http://www.anysql.net/developer/tuning_with_array_dml.html" title="在Perl中用Array DML来进行性能调优">在Perl中用Array DML来进行性能调优</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li><li>2009/11/07 -- <a href="http://www.anysql.net/tools/sqluldr2-mysql-data-migration-test.html" title="MySQL数据迁移测试">MySQL数据迁移测试</a> (8)</li><li>2009/06/23 -- <a href="http://www.anysql.net/mysql/compile-static-dbd-mysql.html" title="编译x86_64下静态DBD::MySQL模块">编译x86_64下静态DBD::MySQL模块</a> (0)</li><li>2009/06/09 -- <a href="http://www.anysql.net/tools/copydata-perl-scripts.html" title="copydata异构数据拷贝">copydata异构数据拷贝</a> (6)</li><li>2009/05/26 -- <a href="http://www.anysql.net/dba/hard-choose-mysql-or-oracle.html" title="MySQL或Oracle, 是个问题?">MySQL或Oracle, 是个问题?</a> (7)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/tools/perl_refresh_mysql.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>从Oracle向MySQL或其他库的数据复制方法</title>
		<link>http://www.anysql.net/oracle/oracle_mview_to_mysql.html</link>
		<comments>http://www.anysql.net/oracle/oracle_mview_to_mysql.html#comments</comments>
		<pubDate>Tue, 13 Mar 2007 06:39:15 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Replication]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e4%bb%8eoracle%e5%90%91mysql%e6%88%96%e5%85%b6%e4%bb%96%e5%ba%93%e7%9a%84%e6%95%b0%e6%8d%ae%e5%a4%8d%e5%88%b6%e6%96%b9%e6%b3%95.html</guid>
		<description><![CDATA[&#160; &#160; 最近花了几天时间更深入地研究了一上实体化视图(Materialized View), 接下来就要利用研究的所得去练习一下了, 想做什么呢? 利用实体化视图日志(Materialized View Log)来跟踪Oracle数据库中表的变化, 然后写Perl程序去将变化过的数据刷新到MySQL数据库中, 充分防照实体化视图增量刷新(Fast Refresh)的原理, 可以高效地实现这一功能, 足以应对一般的业务需求了. 下面强调最主要的几点: 1, 每一个表必需要有主键. 2, 用With Primary Key, Sequence选项创建实体化视图日志, 以支持增量刷新. 3, 在实化化视图日志上可以建一个CREATE_DATE列, 默认值SYSDATE. 4, 在实化化视图日志上为SEQUENCE$$列创建一个索引. 5, 现在只考虑简单的记录复制. &#160; &#160; Oracle的增量刷新有些小问题, 当实体化视图日志中有很多的记录时, 刷新过程很容易失败, 因此我在这儿对这个过程作些改进, 根据SEQUENCE$$的值来进行刷新, 每次最多刷新1000条记录, 小批量地做, 可以提高刷新频率. &#160; &#160; 程序原型已经出来了, 要保证一次刷新过程的事务一致性, 是个难题, 因为没办法用DB-Link了, 所以正在思考要不要用分布式事务处理的编程. 你有什么建议和想法, 就回复吧! Relative Posts:2007/03/29 -- 由物化视图Complete刷新引起的数据丢失 (11)2007/03/14 -- [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 最近花了几天时间更深入地研究了一上实体化视图(Materialized View), 接下来就要利用研究的所得去练习一下了, 想做什么呢? 利用实体化视图日志(Materialized View Log)来跟踪Oracle数据库中表的变化, 然后写Perl程序去将变化过的数据刷新到MySQL数据库中, 充分防照实体化视图增量刷新(Fast Refresh)的原理, 可以高效地实现这一功能, 足以应对一般的业务需求了. 下面强调最主要的几点: </p>
<blockquote>
<p>
1, 每一个表必需要有主键.<br />
2, 用With Primary Key, Sequence选项创建实体化视图日志, 以支持增量刷新.<br />
3, 在实化化视图日志上可以建一个CREATE_DATE列, 默认值SYSDATE.<br />
4, 在实化化视图日志上为SEQUENCE$$列创建一个索引.<br />
5, 现在只考虑简单的记录复制.
</p>
</blockquote>
<p>&nbsp; &nbsp; Oracle的增量刷新有些小问题, 当实体化视图日志中有很多的记录时, 刷新过程很容易失败, 因此我在这儿对这个过程作些改进, 根据SEQUENCE$$的值来进行刷新, 每次最多刷新1000条记录, 小批量地做, 可以提高刷新频率. </p>
<p>&nbsp; &nbsp; 程序原型已经出来了, 要保证一次刷新过程的事务一致性, 是个难题, 因为没办法用DB-Link了, 所以正在思考要不要用分布式事务处理的编程. 你有什么建议和想法, 就回复吧! </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li><li>2009/11/07 -- <a href="http://www.anysql.net/tools/sqluldr2-mysql-data-migration-test.html" title="MySQL数据迁移测试">MySQL数据迁移测试</a> (8)</li><li>2009/06/09 -- <a href="http://www.anysql.net/tools/copydata-perl-scripts.html" title="copydata异构数据拷贝">copydata异构数据拷贝</a> (6)</li><li>2009/05/26 -- <a href="http://www.anysql.net/dba/hard-choose-mysql-or-oracle.html" title="MySQL或Oracle, 是个问题?">MySQL或Oracle, 是个问题?</a> (7)</li><li>2009/03/30 -- <a href="http://www.anysql.net/mysql/mysql_multiple_masters.html" title="多Master的MySQL设想">多Master的MySQL设想</a> (3)</li><li>2008/03/06 -- <a href="http://www.anysql.net/dba/shareplex_from_europe.html" title="HVR, 欧州的Shareplex?">HVR, 欧州的Shareplex?</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/oracle_mview_to_mysql.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Oracle的实体化视图(MVIEW)的深入研究之四</title>
		<link>http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html</link>
		<comments>http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html#comments</comments>
		<pubDate>Fri, 09 Mar 2007 18:27:58 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Fast]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[Refresh]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/oracle%e7%9a%84%e5%ae%9e%e4%bd%93%e5%8c%96%e8%a7%86%e5%9b%bemview%e7%9a%84%e6%b7%b1%e5%85%a5%e7%a0%94%e7%a9%b6%e4%b9%8b%e5%9b%9b.html</guid>
		<description><![CDATA[&#160; &#160; 现在对第一篇中基表进行移动(Move)操作, 会发现不能进行快速刷新, 必须进行全部(Complete)刷新才行. 如下所示: SQL&#62; ALTER TABLE T_MVLOG MOVE; Table altered. SQL&#62; EXEC DBMS_MVIEW.REFRESH(&#8216;MV_T_MVLOG&#8217;,'FAST&#8217;); BEGIN DBMS_MVIEW.REFRESH(&#8216;MV_T_MVLOG&#8217;,'FAST&#8217;); END; * ERROR at line 1: ORA-12034: materialized view log on &#8220;ANYSQL&#8221;.&#8221;T_MVLOG&#8221; younger than last refresh ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 803 ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 860 ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 841 ORA-06512: at line 1 &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 现在对<a href="http://www.anysql.net/oracle/improve_mv_refresh.html">第一篇</a>中基表进行移动(Move)操作, 会发现不能进行快速刷新, 必须进行全部(Complete)刷新才行. 如下所示: </p>
<blockquote class="prefont"><p>
SQL&gt; ALTER TABLE T_MVLOG MOVE;</p>
<p>Table altered.</p>
<p>SQL&gt; EXEC DBMS_MVIEW.REFRESH(&#8216;MV_T_MVLOG&#8217;,'FAST&#8217;);<br />
BEGIN DBMS_MVIEW.REFRESH(&#8216;MV_T_MVLOG&#8217;,'FAST&#8217;); END;</p>
<p>*<br />
ERROR at line 1:<br />
ORA-12034: materialized view log on &#8220;ANYSQL&#8221;.&#8221;T_MVLOG&#8221; younger than last refresh<br />
ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 803<br />
ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 860<br />
ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 841<br />
ORA-06512: at line 1
</p></blockquote>
<p>&nbsp; &nbsp; 为什么失败, 可以仔细分析一下基于ROWID的MVIEW LOG被刷新的过程, 当基表移动后, ROWID的值变了, 因此不能再继续支持主表的UPDATE/DELETE这样的操作了. 下面将这个实体化视图重新定义成基于主键(Primary Key)的, 首先删除现有的实体化视图及日志, 再为表加一个主键, 重新创建实体化视图 : </p>
<blockquote class="prefont"><p>
SQL&gt;&nbsp;&nbsp;alter table t_mvlog modify col1 not null;</p>
<p>Table altered.</p>
<p>SQL&gt; alter table t_mvlog add primary key (col1);</p>
<p>Table altered.</p>
<p>SQL&gt; create materialized view log on t_mvlog with primary key, sequence;</p>
<p>Materialized view log created.</p>
<p>SQL&gt; CREATE MATERIALIZED VIEW MV_T_MVLOG <br />
&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;REFRESH FAST WITH PRIMARY KEY<br />
&nbsp;&nbsp;3&nbsp;&nbsp;AS SELECT ROWID R_ID, A.* FROM T_MVLOG A; </p>
<p>Materialized view created.
</p></blockquote>
<p>&nbsp; &nbsp; 再对基表作移动(Move)操作后, 就可以进行增量刷新了. </p>
<blockquote class="prefont"><p>
SQL&gt; alter table t_mvlog move;</p>
<p>Table altered.</p>
<p>SQL&gt; exec dbms_mview.refresh(&#8216;MV_T_MVLOG&#8217;,'FAST&#8217;);</p>
<p>PL/SQL procedure successfully completed.
</p></blockquote>
<p>&nbsp; &nbsp; 选择基于ROWID还是基于主键(Primary Key)的实体化视图日志, 还是很重要的. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/improve_mv_refresh.html" title="Oracle的实体化视图(MVIEW)的深入研究之一">Oracle的实体化视图(MVIEW)的深入研究之一</a> (0)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/reorg_master_table.html" title="Oracle的实体化视图(MVIEW)的深入研究之二">Oracle的实体化视图(MVIEW)的深入研究之二</a> (0)</li><li>2008/07/24 -- <a href="http://www.anysql.net/oracle/linux_move_files.html" title="事务数高了会如何?">事务数高了会如何?</a> (3)</li><li>2008/03/06 -- <a href="http://www.anysql.net/dba/shareplex_from_europe.html" title="HVR, 欧州的Shareplex?">HVR, 欧州的Shareplex?</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oracle的实体化视图(MVIEW)的深入研究之三</title>
		<link>http://www.anysql.net/oracle/star_in_mview.html</link>
		<comments>http://www.anysql.net/oracle/star_in_mview.html#comments</comments>
		<pubDate>Fri, 09 Mar 2007 14:56:25 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[Query Rewrite]]></category>
		<category><![CDATA[Refresh]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/oracle%e7%9a%84%e5%ae%9e%e4%bd%93%e5%8c%96%e8%a7%86%e5%9b%bemview%e7%9a%84%e6%b7%b1%e5%85%a5%e7%a0%94%e7%a9%b6%e4%b9%8b%e4%b8%89.html</guid>
		<description><![CDATA[&#160; &#160; 在Oracle中创建视图时, 如果我们用了&#8221;*&#8221;符号, 会被自动地根据当时表的定义扩展成字段列表, 在后面再加列时, 新的列不会自动出现在视图的定义中, 直到你重建视图为止. 那么在MVIEW中呢, 通过一个不经意的操作, 发现一个有趣的问题. 总之, 不要随便地在实体视图的定义中使用&#8221;*&#8221;号. &#160; &#160; 下面我们在一个表上建两个实体化视图, 角本如下: CREATE TABLE T_MVTEST AS SELECT * FROM TAB; CREATE MATERIALIZED VIEW LOG ON T_MVTEST &#160;&#160;&#160;&#160;WITH ROWID,SEQUENCE; CREATE MATERIALIZED VIEW MV_TEST_STAR &#160;&#160;&#160;&#160;REFRESH FAST WITH ROWID AS SELECT ROWID RID, A.* FROM T_MVTEST A; CREATE MATERIALIZED VIEW MV_TEST_NOSTAR &#160;&#160;&#160;&#160;REFRESH FAST [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 在Oracle中创建视图时, 如果我们用了&#8221;*&#8221;符号, 会被自动地根据当时表的定义扩展成字段列表, 在后面再加列时, 新的列不会自动出现在视图的定义中, 直到你重建视图为止. 那么在MVIEW中呢, 通过一个不经意的操作, 发现一个有趣的问题. <strong>总之, 不要随便地在实体视图的定义中使用&#8221;*&#8221;号</strong>.</p>
<p>&nbsp; &nbsp; 下面我们在一个表上建两个实体化视图, 角本如下: </p>
<blockquote class="prefont"><p>
CREATE TABLE T_MVTEST AS SELECT * FROM TAB;<br />
CREATE MATERIALIZED VIEW LOG ON T_MVTEST<br />
&nbsp;&nbsp;&nbsp;&nbsp;WITH ROWID,SEQUENCE;<br />
CREATE MATERIALIZED VIEW MV_TEST_STAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;REFRESH FAST WITH ROWID<br />
AS SELECT ROWID RID, A.* FROM T_MVTEST A;<br />
CREATE MATERIALIZED VIEW MV_TEST_NOSTAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;REFRESH FAST WITH ROWID<br />
AS SELECT ROWID RID, A.TNAME, A.TABTYPE, <br />
&nbsp;&nbsp; A.CLUSTERID FROM T_MVTEST A;
</p></blockquote>
<p>&nbsp; &nbsp; 接下来对表作一个增加列的操作. </p>
<blockquote class="prefont"><p>
SQL&gt; ALTER TABLE T_MVTEST ADD COL4 VARCHAR2(20);</p>
<p>Table altered.
</p></blockquote>
<p>&nbsp; &nbsp; 接下来来完全刷新两上实体化视图, 看看运行情况: </p>
<blockquote class="prefont"><p>
SQL&gt; EXEC DBMS_MVIEW.REFRESH(&#8216;MV_TEST_STAR&#8217;, &#8216;COMPLETE&#8217;);<br />
BEGIN DBMS_MVIEW.REFRESH(&#8216;MV_TEST_STAR&#8217;, &#8216;COMPLETE&#8217;); END;</p>
<p>*<br />
ERROR at line 1:<br />
ORA-12018: following error encountered during code generation for<br />
&#8220;ANYSQL&#8221;.&#8221;MV_TEST_STAR&#8221;<br />
ORA-00904: &#8220;COL4&#8243;: invalid identifier<br />
ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 2255<br />
ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 2461<br />
ORA-06512: at &#8220;SYS.DBMS_SNAPSHOT&#8221;, line 2430<br />
ORA-06512: at line 1</p>
<p>
SQL&gt; EXEC DBMS_MVIEW.REFRESH(&#8216;MV_TEST_NOSTAR&#8217;, &#8216;COMPLETE&#8217;);</p>
<p>PL/SQL procedure successfully completed.
</p></blockquote>
<p>&nbsp; &nbsp; 这是因为在进行全部方式的刷新时, 实体化视图的定义根据当前表的定义被展开了, 将会要刷新新增的&#8221;COL4&#8243;这个列, 而在表&#8221;MV_TEST_STAR&#8221;中现在没有这个例, 所以刷新失败, 解决的方法呢是在, 这个视图中手工加一个列: </p>
<blockquote class="prefont"><p>
SQL&gt; ALTER TABLE MV_TEST_STAR ADD COL4 NUMBER;</p>
<p>Table altered.</p>
<p>SQL&gt; EXEC DBMS_MVIEW.REFRESH(&#8216;MV_TEST_STAR&#8217;, &#8216;COMPLETE&#8217;);</p>
<p>PL/SQL procedure successfully completed.
</p></blockquote>
<p>&nbsp; &nbsp; 可以这样解决结果还算好了. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/improve_mv_refresh.html" title="Oracle的实体化视图(MVIEW)的深入研究之一">Oracle的实体化视图(MVIEW)的深入研究之一</a> (0)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/08 -- <a href="http://www.anysql.net/oracle/reorg_master_table.html" title="Oracle的实体化视图(MVIEW)的深入研究之二">Oracle的实体化视图(MVIEW)的深入研究之二</a> (0)</li><li>2008/07/24 -- <a href="http://www.anysql.net/oracle/linux_move_files.html" title="事务数高了会如何?">事务数高了会如何?</a> (3)</li><li>2008/03/06 -- <a href="http://www.anysql.net/dba/shareplex_from_europe.html" title="HVR, 欧州的Shareplex?">HVR, 欧州的Shareplex?</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/star_in_mview.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一种特殊的Library Cache Lock情况</title>
		<link>http://www.anysql.net/oracle/mview_library_cache_lock.html</link>
		<comments>http://www.anysql.net/oracle/mview_library_cache_lock.html#comments</comments>
		<pubDate>Fri, 09 Mar 2007 04:25:19 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Lock]]></category>
		<category><![CDATA[MVIEW]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e4%b8%80%e7%a7%8d%e7%89%b9%e6%ae%8a%e7%9a%84library-cache-lock%e6%83%85%e5%86%b5.html</guid>
		<description><![CDATA[&#160; &#160; 在Oracle 10g中的我用两个会话, 搞出了下面这个等待情况, 很是有趣, 也很危险. SQL&#62; SELECT SID, EVENT FROM V$SESSION &#160;&#160;2&#160;&#160;WHERE USERNAME=&#8217;ANYSQL&#8217;; &#160;&#160;&#160;&#160;&#160;&#160; SID EVENT &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;29 library cache lock &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;32 SQL*Net message from client &#160; &#160; 这个情况是如何出来的呢, 在32会话中, 我执行了语句: SQL&#62; exec dbms_mview.begin_table_reorganization(&#8216;ANYSQL&#8217;,'T_IOT&#8217;); PL/SQL procedure successfully completed. &#160; &#160; 在29这个会话中, 我发出如下命令, 但一直处于等待情况: SQL&#62; delete t_iot; &#160; &#160; 看来Oracle的新功能, 有时是比较危险的, 当在第32会话中再发一个Commit之后, 就好了, [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 在Oracle 10g中的我用两个会话, 搞出了下面这个等待情况, 很是有趣, 也很危险. </p>
<blockquote class="prefont"><p>
SQL&gt; SELECT SID, EVENT FROM V$SESSION <br />
&nbsp;&nbsp;2&nbsp;&nbsp;WHERE USERNAME=&#8217;ANYSQL&#8217;;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID EVENT<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;29 library cache lock<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32 SQL*Net message from client
</p></blockquote>
<p>&nbsp; &nbsp; 这个情况是如何出来的呢, 在32会话中, 我执行了语句: </p>
<blockquote class="prefont"><p>
SQL&gt; exec dbms_mview.begin_table_reorganization(&#8216;ANYSQL&#8217;,'T_IOT&#8217;);</p>
<p>PL/SQL procedure successfully completed.
</p></blockquote>
<p>&nbsp; &nbsp; 在29这个会话中, 我发出如下命令, 但一直处于等待情况: </p>
<blockquote class="prefont"><p>
SQL&gt; delete t_iot;
</p></blockquote>
<p>&nbsp; &nbsp; 看来Oracle的新功能, 有时是比较危险的, 当在第32会话中再发一个Commit之后, 就好了, 29这个会话就可以往下执行了, Oracle为什么不是那个过程最后默认加个Commit呢? </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2008/01/17 -- <a href="http://www.anysql.net/oracle/drop_busy_materialized_view.html" title="不能删除物化视图?">不能删除物化视图?</a> (1)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/08/06 -- <a href="http://www.anysql.net/oracle/oracle_skip_locked_gets.html" title="FOR UPDATE SKIP LOCKED语句中的逻辑读">FOR UPDATE SKIP LOCKED语句中的逻辑读</a> (3)</li><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li><li>2007/03/12 -- <a href="http://www.anysql.net/oracle/oracle_mview_to_mysql.html" title="从Oracle向MySQL或其他库的数据复制方法">从Oracle向MySQL或其他库的数据复制方法</a> (7)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/mview_library_cache_lock.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle的实体化视图(MVIEW)的深入研究之二</title>
		<link>http://www.anysql.net/oracle/reorg_master_table.html</link>
		<comments>http://www.anysql.net/oracle/reorg_master_table.html#comments</comments>
		<pubDate>Fri, 09 Mar 2007 02:39:58 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[MVIEW]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/oracle%e7%9a%84%e5%ae%9e%e4%bd%93%e5%8c%96%e8%a7%86%e5%9b%bemview%e7%9a%84%e6%b7%b1%e5%85%a5%e7%a0%94%e7%a9%b6%e4%b9%8b%e4%ba%8c.html</guid>
		<description><![CDATA[&#160; &#160; 当在一个表上建了物化视图的日志(Materialized View Log)后, 所有的DML操作都会被相应地记录到物化视图日志表(MLOG$_)中, 如果想对这个表进行操作, 但不想这些操作被记录到日志(MVIEW LOG)中, 应当怎么办呢? 在DBMS_MVIEW包中有两个过程可以用来完成这个要求. 这里我们需要打开两个会话, 其中一个会话以DBA的身份登陆(Session DBA), 另一个会话随便了(Session USER), 按如下次序来进行操作: &#160; &#160; 在Session USER中先运行以下语句去看一下MVIEW LOG表中有多少条记录: SQL&#62; SELECT count(*) FROM MLOG$_T_REORG; &#160;&#160;COUNT(*) &#8212;&#8212;&#8212;- &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0 &#160; &#160; 在Session DBA中运行BEGIN_TABLE_REORGANIZATION过程开始维护, 记得执行完后要运行COMMIT命令, 否则会阻塞(Block)别的进程: SQL&#62; exec dbms_mview.begin_table_reorganization(&#8216;ANYSQL&#8217;,'T_REORG&#8217;); PL/SQL procedure successfully completed. &#160; &#160; 在Session USER中先运行DML直接修改表的数据, 提交后看一下MVIEW LOG表中的记录有没有增加: SQL&#62; insert into t_reorg select [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 当在一个表上建了物化视图的日志(Materialized View Log)后, 所有的DML操作都会被相应地记录到物化视图日志表(MLOG$_)中, 如果想对这个表进行操作, 但不想这些操作被记录到日志(MVIEW LOG)中, 应当怎么办呢? 在DBMS_MVIEW包中有两个过程可以用来完成这个要求. 这里我们需要打开两个会话, 其中一个会话以DBA的身份登陆(Session DBA), 另一个会话随便了(Session USER), 按如下次序来进行操作: </p>
<p>&nbsp; &nbsp; 在Session USER中先运行以下语句去看一下MVIEW LOG表中有多少条记录: </p>
<blockquote class="prefont"><p>
SQL&gt; SELECT count(*) FROM MLOG$_T_REORG;</p>
<p>&nbsp;&nbsp;COUNT(*)<br />
&#8212;&#8212;&#8212;-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0
</p></blockquote>
<p>&nbsp; &nbsp; 在Session DBA中运行BEGIN_TABLE_REORGANIZATION过程开始维护, 记得执行完后要运行COMMIT命令, 否则会阻塞(Block)别的进程: </p>
<blockquote class="prefont"><p>
SQL&gt; exec dbms_mview.begin_table_reorganization(&#8216;ANYSQL&#8217;,'T_REORG&#8217;);</p>
<p>PL/SQL procedure successfully completed.
</p></blockquote>
<p>&nbsp; &nbsp; 在Session USER中先运行DML直接修改表的数据, 提交后看一下MVIEW LOG表中的记录有没有增加: </p>
<blockquote class="prefont"><p>
SQL&gt; insert into t_reorg select * from tab;</p>
<p>13 rows created.</p>
<p>SQL&gt; COMMIT;</p>
<p>Commit complete.</p>
<p>SQL&gt; SELECT count(*) FROM MLOG$_T_REORG;</p>
<p>&nbsp;&nbsp;COUNT(*)<br />
&#8212;&#8212;&#8212;-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0
</p></blockquote>
<p>&nbsp; &nbsp; 在Session DBA中运行END_TABLE_REORGANIZATION过程结束维护, 记得执行完后要运行COMMIT命令, 否则会阻塞(Block)别的进程: </p>
<blockquote class="prefont"><p>
SQL&gt; exec dbms_mview.end_table_reorganization(&#8216;ANYSQL&#8217;,'T_REORG&#8217;);</p>
<p>PL/SQL procedure successfully completed.
</p></blockquote>
<p>&nbsp; &nbsp; 在Session USER中先运行一些DML语句, 检查一下MVIEW LOG表中的记录数是不是增多了: </p>
<blockquote class="prefont"><p>
SQL&gt; delete t_reorg;</p>
<p>13 rows deleted.</p>
<p>SQL&gt; commit;</p>
<p>Commit complete.</p>
<p>SQL&gt; SELECT count(*) FROM MLOG$_T_REORG;</p>
<p>&nbsp;&nbsp;COUNT(*)<br />
&#8212;&#8212;&#8212;-<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13
</p></blockquote>
<p>&nbsp; &nbsp; 在这儿说了一大堆, <strong>其实是如何让表不生成实体化视图日志的问题</strong>. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2008/07/24 -- <a href="http://www.anysql.net/oracle/linux_move_files.html" title="事务数高了会如何?">事务数高了会如何?</a> (3)</li><li>2008/03/06 -- <a href="http://www.anysql.net/dba/shareplex_from_europe.html" title="HVR, 欧州的Shareplex?">HVR, 欧州的Shareplex?</a> (0)</li><li>2008/02/29 -- <a href="http://www.anysql.net/developer/give_mylog_to_zizzy.html" title="向Zizzy项目注入MyLOG">向Zizzy项目注入MyLOG</a> (8)</li><li>2008/01/17 -- <a href="http://www.anysql.net/oracle/drop_busy_materialized_view.html" title="不能删除物化视图?">不能删除物化视图?</a> (1)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/09/04 -- <a href="http://www.anysql.net/oracle/oracle11g_compres_log_transfer.html" title="Oracle 11g新特性 &#8212; DG压缩传送日志">Oracle 11g新特性 &#8212; DG压缩传送日志</a> (0)</li><li>2007/09/04 -- <a href="http://www.anysql.net/research/oracle_log_research_tasks.html" title="Oracle Log格式研究未完成的主要任务">Oracle Log格式研究未完成的主要任务</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/reorg_master_table.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle的实体化视图(MVIEW)的深入研究之一</title>
		<link>http://www.anysql.net/oracle/improve_mv_refresh.html</link>
		<comments>http://www.anysql.net/oracle/improve_mv_refresh.html#comments</comments>
		<pubDate>Thu, 08 Mar 2007 18:36:25 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Fast]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[Query Rewrite]]></category>
		<category><![CDATA[Refresh]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/oracle%e7%9a%84%e5%ae%9e%e4%bd%93%e5%8c%96%e8%a7%86%e5%9b%bemview%e7%9a%84%e6%b7%b1%e5%85%a5%e7%a0%94%e7%a9%b6%e4%b9%8b%e4%b8%80.html</guid>
		<description><![CDATA[&#160; &#160; 从Oracle 8i开始提供了实体化视图, 能过预先计算好的中间表来提高应用的访问速度, 在特定的情况下是很有用的一项技术. 另外实体化视图还可用于数据复制, 在这个上面的应用越来越多. MVIEW中经常跗以遇到刷新很慢的情况, 如何提高呢? 首先来研究一下刷新的过程. 下面是用来创建演示表的角本: CREATE TABLE T_MVLOG (COL1 VARCHAR2(20)); CREATE MATERIALIZED VIEW LOG ON T_MVLOG &#160;&#160;&#160;&#160;WITH ROWID, sequence; CREATE MATERIALIZED VIEW MV_T_MVLOG &#160;&#160; REFRESH FAST &#160;&#160; WITH ROWID AS &#160;&#160; SELECT ROWID R_ID, A.* FROM T_MVLOG A; &#160; &#160; 我们对DBMS_MVIEW.REFRESH作一个SQL_TRACE, 在这个例子中, 我在基表中插入了一打记录, 然后作跟踪的. 可以看到第一步为: update &#8220;ANYSQL&#8221;.&#8221;MLOG$_T_MVLOG&#8221; set [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 从Oracle 8i开始提供了实体化视图, 能过预先计算好的中间表来提高应用的访问速度, 在特定的情况下是很有用的一项技术. 另外实体化视图还可用于数据复制, 在这个上面的应用越来越多. MVIEW中经常跗以遇到刷新很慢的情况, 如何提高呢? 首先来研究一下刷新的过程. 下面是用来创建演示表的角本: </p>
<blockquote class="prefont"><p>
CREATE TABLE T_MVLOG (COL1 VARCHAR2(20));<br />
CREATE MATERIALIZED VIEW LOG ON T_MVLOG <br />
&nbsp;&nbsp;&nbsp;&nbsp;WITH ROWID, sequence;<br />
CREATE MATERIALIZED VIEW MV_T_MVLOG <br />
&nbsp;&nbsp; REFRESH FAST <br />
&nbsp;&nbsp; WITH ROWID <br />
AS <br />
&nbsp;&nbsp; SELECT ROWID R_ID, A.* FROM T_MVLOG A;
</p></blockquote>
<p>&nbsp; &nbsp; 我们对DBMS_MVIEW.REFRESH作一个SQL_TRACE, 在这个例子中, 我在基表中插入了一打记录, 然后作跟踪的. 可以看到第一步为: </p>
<blockquote class="prefont"><p>
update &#8220;ANYSQL&#8221;.&#8221;MLOG$_T_MVLOG&#8221; set snaptime$$ = :1&nbsp;&nbsp;<br />
&nbsp;&nbsp; where snaptime$$ &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(&#8217;2100-01-01:00:00:00&#8242;,&#8217;YYYY-MM-DD:HH24:MI:SS&#8217;)
</p></blockquote>
<p>&nbsp; &nbsp; 第二步, 取得在这段时间内发生修改的每一行的ROWID</p>
<blockquote class="prefont"><p>
SELECT DISTINCT M_ROW$$ FROM <br />
(<br />
&nbsp;&nbsp; SELECT M_ROW$$ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM &#8220;ANYSQL&#8221;.&#8221;MLOG$_T_MVLOG&#8221; MLOG$ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE &#8220;SNAPTIME$$&#8221; &gt; :1 AND (&#8220;DMLTYPE$$&#8221; != &#8216;I&#8217;)<br />
) LOG$ <br />
WHERE (M_ROW$$) NOT IN <br />
&nbsp;&nbsp;&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT ROWID FROM &#8220;T_MVLOG&#8221; &#8220;MAS_TAB$&#8221; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE MAS_TAB$.ROWID = LOG$.M_ROW$$<br />
&nbsp;&nbsp;&nbsp;&nbsp; )
</p></blockquote>
<p>&nbsp; &nbsp; 第三步, 取得刷新后的值</p>
<blockquote class="prefont"><p>
SELECT CURRENT$.&#8221;R_ID&#8221;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CURRENT$.&#8221;COL1&#8243;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWIDTOCHAR(CURRENT$.ROWID) M_ROW$$ <br />
FROM <br />
(<br />
&nbsp;&nbsp;SELECT &#8220;A&#8221;.ROWID &#8220;R_ID&#8221;,&#8221;A&#8221;.&#8221;COL1&#8243; &#8220;COL1&#8243; FROM &#8220;T_MVLOG&#8221; &#8220;A&#8221;<br />
) CURRENT$, <br />
(<br />
&nbsp;&nbsp;SELECT DISTINCT M_ROW$$ FROM &#8220;ANYSQL&#8221;.&#8221;MLOG$_T_MVLOG&#8221; MLOG$ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE &#8220;SNAPTIME$$&#8221; &gt; :1 AND (&#8220;DMLTYPE$$&#8221; != &#8216;D&#8217;)<br />
) LOG$ <br />
WHERE CURRENT$.ROWID = LOG$.M_ROW$$
</p></blockquote>
<p>&nbsp; &nbsp; 第四步, 对MVIEW进行插入</p>
<blockquote class="prefont"><p>
INSERT INTO &#8220;ANYSQL&#8221;.&#8221;MV_T_MVLOG&#8221;&nbsp;&nbsp;(&#8220;R_ID&#8221;,&#8221;COL1&#8243;,&#8221;M_ROW$$&#8221;)<br />
&nbsp;&nbsp; VALUES (:1,:2,:3)
</p></blockquote>
<p>&nbsp; &nbsp; 最后一步, 删除MVLOG中的值</p>
<blockquote class="prefont"><p>
delete from &#8220;ANYSQL&#8221;.&#8221;MLOG$_T_MVLOG&#8221; where snaptime$$ &lt;= :1
</p></blockquote>
<p>&nbsp; &nbsp; 从这外过程来看,  可以调的方法有四个, 首先<strong>尽量使用快速刷新, 提高刷新频率</strong>, 其次可以<strong>在MLOG$_T_MVLOG这个表的snaptime$$字段上建索引</strong>, 第三<strong>为刷新的过程设定会话级的DB_FILE_MULTIBLOCK_READ_COUNT以及SORT_AREA_SIZE等参数</strong>, 第四选择时间<strong>对MLOG$_T_MVLOG这个表进行重组以减少表的大小</strong>. 这些方法仅供参考.</p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/mvlog_with_rowid_primarykey.html" title="Oracle的实体化视图(MVIEW)的深入研究之四">Oracle的实体化视图(MVIEW)的深入研究之四</a> (2)</li><li>2007/03/09 -- <a href="http://www.anysql.net/oracle/star_in_mview.html" title="Oracle的实体化视图(MVIEW)的深入研究之三">Oracle的实体化视图(MVIEW)的深入研究之三</a> (0)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2008/01/17 -- <a href="http://www.anysql.net/oracle/drop_busy_materialized_view.html" title="不能删除物化视图?">不能删除物化视图?</a> (1)</li><li>2007/09/04 -- <a href="http://www.anysql.net/developer/tuning_with_array_dml.html" title="在Perl中用Array DML来进行性能调优">在Perl中用Array DML来进行性能调优</a> (0)</li><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/improve_mv_refresh.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何对MVIEW进行直接的DML操作来进行刷新?</title>
		<link>http://www.anysql.net/oracle/oracle_update_mview.html</link>
		<comments>http://www.anysql.net/oracle/oracle_update_mview.html#comments</comments>
		<pubDate>Fri, 20 Oct 2006 05:05:57 +0000</pubDate>
		<dc:creator>anysql</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[MVIEW]]></category>
		<category><![CDATA[OLAP]]></category>
		<category><![CDATA[数据仓库]]></category>

		<guid isPermaLink="false">http://www.anysql.net/wordpress/uncategorized/%e5%a6%82%e4%bd%95%e5%af%b9mview%e8%bf%9b%e8%a1%8c%e7%9b%b4%e6%8e%a5%e7%9a%84dml%e6%93%8d%e4%bd%9c%e6%9d%a5%e8%bf%9b%e8%a1%8c%e5%88%b7%e6%96%b0.html</guid>
		<description><![CDATA[&#160; &#160; 在我的机器上有一个MVIEW (MV_FACT_SALES), 直接更新肯定是不行的, 会报以下错误: SQL&#62; DESC MV_FACT_SALES Name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Null?&#160;&#160;&#160;&#160;Type &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;- F_MONTH&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;VARCHAR2(7) M_AMOUNT1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NUMBER M_AMOUNT2&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NUMBER SQL&#62; INSERT INTO MV_FACT_SALES VALUES (&#8217;3000-1&#8242;,1500,1600); INSERT INTO MV_FACT_SALES VALUES (&#8217;3000-1&#8242;,1500,1600) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;* ERROR at line 1: ORA-01732: data manipulation operation not legal on this view &#160; &#160; 但可以通过Exchange Partition的方法来更新MVIEW中的数据, 实现人为地刷新, 首先检查一下现在的MVIEW的状态: SQL&#62; SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS; STALENESS&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; STALE_SINCE &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp; &nbsp; 在我的机器上有一个MVIEW (MV_FACT_SALES), 直接更新肯定是不行的, 会报以下错误: </p>
<blockquote class="prefont"><p>
SQL&gt; DESC MV_FACT_SALES<br />
Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Null?&nbsp;&nbsp;&nbsp;&nbsp;Type<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;-<br />
F_MONTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(7)<br />
M_AMOUNT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER<br />
M_AMOUNT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER</p>
<p>SQL&gt; INSERT INTO MV_FACT_SALES VALUES (&#8217;3000-1&#8242;,1500,1600);<br />
INSERT INTO MV_FACT_SALES VALUES (&#8217;3000-1&#8242;,1500,1600)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
ERROR at line 1:<br />
ORA-01732: data manipulation operation not legal on this view
</p></blockquote>
<p>&nbsp; &nbsp; 但可以通过Exchange Partition的方法来更新MVIEW中的数据, 实现人为地刷新, 首先检查一下现在的MVIEW的状态: </p>
<blockquote class="prefont"><p>
SQL&gt; SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS;</p>
<p>STALENESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STALE_SINCE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;<br />
FRESH
</p></blockquote>
<p>&nbsp; &nbsp; 接下来创建一个只有一个分区的分区表, 用于实现分区交换: </p>
<p><span id="more-95"></span></p>
<blockquote class="prefont"><p>
SQL&gt; CREATE TABLE P_MV_FACT_SALES<br />
&nbsp;&nbsp;2&nbsp;&nbsp;(<br />
&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; F_MONTH VARCHAR2(7),<br />
&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp; M_AMOUNT1 NUMBER,<br />
&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp; M_AMOUNT2 NUMBER<br />
&nbsp;&nbsp;6&nbsp;&nbsp;)<br />
&nbsp;&nbsp;7&nbsp;&nbsp;PARTITION BY RANGE (F_MONTH)<br />
&nbsp;&nbsp;8&nbsp;&nbsp;(<br />
&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; PARTITION P_MAX VALUES LESS THAN (MAXVALUE)<br />
10&nbsp;&nbsp;)<br />
11&nbsp;&nbsp;/</p>
<p>Table created.</p>
<p>SQL&gt; ALTER TABLE P_MV_FACT_SALES EXCHANGE PARTITION P_MAX WITH TABLE MV_FACT_SALES;</p>
<p>Table altered.</p>
<p>SQL&gt; SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS;</p>
<p>STALENESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STALE_SINCE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;<br />
FRESH
</p></blockquote>
<p>&nbsp; &nbsp; 向分区表中插入一条记录, 在实际的应用中, 要保证你的修改是对的. 然后再交换回去, 并检查MVIEW的状态. </p>
<blockquote class="prefont"><p>
SQL&gt; INSERT INTO P_MV_FACT_SALES VALUES (&#8217;3000-1&#8242;,1500,1600);</p>
<p>1 row created.</p>
<p>SQL&gt; commit;</p>
<p>Commit complete.</p>
<p>SQL&gt; ALTER TABLE P_MV_FACT_SALES EXCHANGE PARTITION P_MAX WITH TABLE MV_FACT_SALES;</p>
<p>Table altered.</p>
<p>SQL&gt; SELECT STALENESS,STALE_SINCE FROM USER_MVIEWS;</p>
<p>STALENESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STALE_SINCE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;<br />
FRESH
</p></blockquote>
<p>&nbsp; &nbsp; MVIEW本身提供的刷新方法是不错, 不过在数据仓库中, 它的刷新方法就不太好控制了, 因此可以用这种方法来试试. </p>
<h3  class="related_post_title">Relative Posts:</h3><ul class="related_post"><li>2006/10/11 -- <a href="http://www.anysql.net/oracle/olap_tuning_startransformation.html" title="数据库优化中什么是星型转换(Star Transform)?">数据库优化中什么是星型转换(Star Transform)?</a> (4)</li><li>2006/10/09 -- <a href="http://www.anysql.net/oracle/oracle_olap_dimension.html" title="利用维对象来优化数据仓库的高级技巧">利用维对象来优化数据仓库的高级技巧</a> (7)</li><li>2008/01/17 -- <a href="http://www.anysql.net/oracle/drop_busy_materialized_view.html" title="不能删除物化视图?">不能删除物化视图?</a> (1)</li><li>2007/12/18 -- <a href="http://www.anysql.net/oracle/mview_ora_04031.html" title="MVIEW引起ORA-04031">MVIEW引起ORA-04031</a> (0)</li><li>2007/07/17 -- <a href="http://www.anysql.net/dba/capture_table_row_change.html" title="问题解答 &#8212; 如何得知一张表的纪录有变化?">问题解答 &#8212; 如何得知一张表的纪录有变化?</a> (2)</li><li>2007/03/29 -- <a href="http://www.anysql.net/tools/refresh_mysql_delete_where.html" title="使refresh_mysql适用于数据归档的一点改进">使refresh_mysql适用于数据归档的一点改进</a> (0)</li><li>2007/03/29 -- <a href="http://www.anysql.net/dba/data_lost_by_mview_refresh.html" title="由物化视图Complete刷新引起的数据丢失">由物化视图Complete刷新引起的数据丢失</a> (11)</li><li>2007/03/24 -- <a href="http://www.anysql.net/developer/mysql_mview_log.html" title="在MySQL中建立实体化视图日志">在MySQL中建立实体化视图日志</a> (2)</li><li>2007/03/14 -- <a href="http://www.anysql.net/tools/oracle_mysql_replication_demo.html" title="refresh_mysql.pl角本的一个配置例子">refresh_mysql.pl角本的一个配置例子</a> (0)</li><li>2007/03/13 -- <a href="http://www.anysql.net/tools/perl_refresh_mysql.html" title="写了一个从Oracle复制到MySQL的Perl角本">写了一个从Oracle复制到MySQL的Perl角本</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.anysql.net/oracle/oracle_update_mview.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
