在AnySQL.net中搜索标签(Tags) 'MVIEW' 的结果:
不能删除物化视图?
几分钟前一网友问我如何删除一个实体化视图, 当然不是什么语法不会的问题了, 是发了Drop命令后一直挂着, 几个小时都没有结束, 你可以想想为什么? 先看一下创建的语法. create materialized view user_order_mavi build immediate refresh on commit enable query rewrite as select service_id,substr(user_isdn,1,7), bill_type,follow_action,count(user_isdn) from user_order group by service_id,substr(user_isdn,1,7), bill_type,follow_action 看到这个语句, 应当是刷新的类型那儿有问题, 在ON COMMIT刷新模式下, 如果基表的DML很频繁, 会造成刷新很频繁,...
MVIEW引起ORA-04031
有一个数据库报了ORA-04031错误, 等我们上去看时, 却是好的, 通过查询Statspack有关视图, 发现Shared Pool Free Memory在这之前是逐渐减少的, sql area部分占得很大. 可能的原因是, 当Oracle遇到这个错误后, 自动做了一次Flush Pool操作. 于是写了一段程序去跟踪SQL占用的内存, 发现有两个SQL语句很不正常, 版本数很多, 占用的内存也很大, 差不多占了一半的sql area. ASQL> ora share ADDRESS CHILDS BYTES ---------------- ------ --------- 0000040000A328F8 1026 215577124 000004000F7AB058 1026 215503530 来看一下这两个SQL语句是什么? ASQL>...
问题解答 -- 如何得知一张表的纪录有变化?
网上有一个问题, 要想知道那些表记录发生了变化? 对于一些更新不是很多(一秒种有几百条上下的)的表, 我会建议用实体化视图日志(Materialize View Log/Snapshot Log)去实现. 其基本原理是能过一个内部(Internal)的内核(Kernal)一级的行级触发器(Row Level Trigger), 将变化过的记录的ROWID或主键值保存到另一个表中去. 实体化视图的增量刷新(Fast Refresh)正是基于这个技术. 假设我们需要监控的表名为T_OBJECTS, 主键为OBJECT_ID, 如果没有主键则用ROWID, 则可以用如下语句来创建实体化视图日志. -- Using Primary Key CREATE MATERIALIZED VIEW LOG ON T_OBJECTS TABLESPACE users WITH PRIMARY KEY, SEQUENCE; -- Using ROWID...
使refresh_mysql适用于数据归档的一点改进
受上一篇中案例的启发, 对refresh_mysql角本作了一点点改进, 可以为DELETE目标数据库的SQL加一个WHERE条件, 以防止删除不想删除的数据. 举个简单的例子来说, 有一个产品数据和历史库, 产品库中只有今年的记录, 而历史库中包括所有(当前的和07年以前)的数据, 我们还需要将产品库的修改比较实时地反应到历史库中, 那么我有可能要经常在产品库中删除三个月以前的记录, 为了不让这些删除操作被复制到历史库中, 就可以加一个Where条件了, 如"CREATE_DATE > SYSDATE - 30", 这样的话, 就只能在历史库中更新最近三个月的记录了: 只需要refresh_mysql角本的配置文件后面再加一列, 如下所示: # SOURCE # PKEY # MVIEW Log # TARGET T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS #...
由物化视图Complete刷新引起的数据丢失
今日早上, 在网上看到一篇贴子, 问了如下两个问题: 数据仓库中有2007年之前的数据 问题一: 如何保持erp与数据仓库中2007年数据一致而数据仓库中2007年之前数据不变(以前通过dbms_mview.refresh('xxx','fast'))? 问题二: 我对x物化视图做了一个全部刷新,但是x物化视图中的数据全部变成2007年的数据,以前数据丢失?如阿恢复到刷新前的状态 其中第一个问题是个难题, 现在很多公司都在想这样的一个解决方案, 其实就是一个实时复制方案, 从在的角度来说, 这方面可以用的方案有: 1, Quest公司的SharePlex; 2, DSG公司的RealSync(没有一点印象); 3, Oracle公司的Stream. 前两者都是比较贵的解决方案, Oracle的Stream懂的人少, 而且在9i中还不够稳定. 物化视图并不适合用来归档生产库的数据到历史库, 原来就象第二点所说的那样, 如果进行全部刷新, Oracle会先在目标数据库上运行一个DELETE命令来删除所有的数据(你可以SQL_TRACE一把), 估计这位老兄也是查了资料或翻了贴子后, 觉得物化视图可以做到这一点, 所以这样做了一把, 结果就是数据被删除了. 最近我也一直在想这样的一个解决的方法, 在物化视图中, 用物化视图日志来捕获对表的变更, 是一个比较好的方法(对于负荷不是很高的数据库),...
在MySQL中建立实体化视图日志
在MySQL中建立实体化视图日志表, 在这里基表表名是T_MVLOG, 主键字段是COL1. 日志表结构如下: CREATE TABLE MLOG$_T_MVLOG ( SEQUENCE$$ BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, DMLTYPE$$ CHAR, COL1 BIGINT ); Oracle中的实体化视图是用触发器来实现的, 不同的是早期版本是用Internal Trigger(但还可以在Trigger$表中查到), 而在8i及以后的版本中, 则变为Kernel Level Trigger(在Trigger$中是找不到了). 我们现在在MySQL中手工建立触发器, 说不定以后MySQL真的也引入实体化视图功能呢? 也在Kernel级别来实现呢? 发现建立触发器的语句好象Oracle的PL/SQL. DELIMITER |...
refresh_mysql.pl角本的一个配置例子
在Oracle中创建表和实体化视图日志: CREATE TABLE T_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM < 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; ...
写了一个从Oracle复制到MySQL的Perl角本
根据对实体化视图的研究及昨天的设想, 花了大约一个早上的时间, 写了一个从Oracle复制到MySQL的Perl角本, 早上测试时还是比较有趣的. 在现在的角本中, 源表名和目标表名可以不一样, 但字段名必须一样. 做测试时, 先开一个窗口, 运行刷新角本: C:\AnySQL>perl refresh_mysql.pl -s anysql:anysql:test -t mysql:root:mysql:localhost:test -c myrefresh.conf 02/13 12:52:25 - 1 tables will be processed. 02/13 12:53:06 - Start replication from T_MVLOG to T_MVLOG with...
从Oracle向MySQL或其他库的数据复制方法
最近花了几天时间更深入地研究了一上实体化视图(Materialized View), 接下来就要利用研究的所得去练习一下了, 想做什么呢? 利用实体化视图日志(Materialized View Log)来跟踪Oracle数据库中表的变化, 然后写Perl程序去将变化过的数据刷新到MySQL数据库中, 充分防照实体化视图增量刷新(Fast Refresh)的原理, 可以高效地实现这一功能, 足以应对一般的业务需求了. 下面强调最主要的几点: 1, 每一个表必需要有主键. 2, 用With Primary Key, Sequence选项创建实体化视图日志, 以支持增量刷新. 3, 在实化化视图日志上可以建一个CREATE_DATE列, 默认值SYSDATE. 4, 在实化化视图日志上为SEQUENCE$$列创建一个索引. 5, 现在只考虑简单的记录复制. Oracle的增量刷新有些小问题, 当实体化视图日志中有很多的记录时, 刷新过程很容易失败, 因此我在这儿对这个过程作些改进, 根据SEQUENCE$$的值来进行刷新, 每次最多刷新1000条记录, 小批量地做, 可以提高刷新频率....
Oracle的实体化视图(MVIEW)的深入研究之四
现在对第一篇中基表进行移动(Move)操作, 会发现不能进行快速刷新, 必须进行全部(Complete)刷新才行. 如下所示: SQL> ALTER TABLE T_MVLOG MOVE; Table altered. SQL> EXEC DBMS_MVIEW.REFRESH('MV_T_MVLOG','FAST'); BEGIN DBMS_MVIEW.REFRESH('MV_T_MVLOG','FAST'); END; * ERROR at line 1: ORA-12034: materialized view log on "ANYSQL"."T_MVLOG" younger than last refresh ORA-06512: at "SYS.DBMS_SNAPSHOT", line 803 ORA-06512:...
Oracle的实体化视图(MVIEW)的深入研究之三
在Oracle中创建视图时, 如果我们用了"*"符号, 会被自动地根据当时表的定义扩展成字段列表, 在后面再加列时, 新的列不会自动出现在视图的定义中, 直到你重建视图为止. 那么在MVIEW中呢, 通过一个不经意的操作, 发现一个有趣的问题. 总之, 不要随便地在实体视图的定义中使用"*"号. 下面我们在一个表上建两个实体化视图, 角本如下: CREATE TABLE T_MVTEST AS SELECT * FROM TAB; CREATE MATERIALIZED VIEW LOG ON T_MVTEST WITH ROWID,SEQUENCE; CREATE MATERIALIZED VIEW MV_TEST_STAR REFRESH FAST WITH...
一种特殊的Library Cache Lock情况
在Oracle 10g中的我用两个会话, 搞出了下面这个等待情况, 很是有趣, 也很危险. SQL> SELECT SID, EVENT FROM V$SESSION 2 WHERE USERNAME='ANYSQL'; SID EVENT ---------- ------------------------------------- 29 library cache lock 32 SQL*Net message from client 这个情况是如何出来的呢, 在32会话中, 我执行了语句: SQL> exec dbms_mview.begin_table_reorganization('ANYSQL','T_IOT'); PL/SQL procedure successfully...
Oracle的实体化视图(MVIEW)的深入研究之二
当在一个表上建了物化视图的日志(Materialized View Log)后, 所有的DML操作都会被相应地记录到物化视图日志表(MLOG$_)中, 如果想对这个表进行操作, 但不想这些操作被记录到日志(MVIEW LOG)中, 应当怎么办呢? 在DBMS_MVIEW包中有两个过程可以用来完成这个要求. 这里我们需要打开两个会话, 其中一个会话以DBA的身份登陆(Session DBA), 另一个会话随便了(Session USER), 按如下次序来进行操作: 在Session USER中先运行以下语句去看一下MVIEW LOG表中有多少条记录: SQL> SELECT count(*) FROM MLOG$_T_REORG; COUNT(*) ---------- 0 在Session DBA中运行BEGIN_TABLE_REORGANIZATION过程开始维护, 记得执行完后要运行COMMIT命令, 否则会阻塞(Block)别的进程: SQL> exec dbms_mview.begin_table_reorganization('ANYSQL','T_REORG');...
Oracle的实体化视图(MVIEW)的深入研究之一
从Oracle 8i开始提供了实体化视图, 能过预先计算好的中间表来提高应用的访问速度, 在特定的情况下是很有用的一项技术. 另外实体化视图还可用于数据复制, 在这个上面的应用越来越多. MVIEW中经常跗以遇到刷新很慢的情况, 如何提高呢? 首先来研究一下刷新的过程. 下面是用来创建演示表的角本: CREATE TABLE T_MVLOG (COL1 VARCHAR2(20)); CREATE MATERIALIZED VIEW LOG ON T_MVLOG WITH ROWID, sequence; CREATE MATERIALIZED VIEW MV_T_MVLOG REFRESH FAST WITH ROWID AS SELECT ROWID...
如何对MVIEW进行直接的DML操作来进行刷新?
在我的机器上有一个MVIEW (MV_FACT_SALES), 直接更新肯定是不行的, 会报以下错误: SQL> DESC MV_FACT_SALES Name Null? Type ----------------------- -------- ------------- F_MONTH VARCHAR2(7) M_AMOUNT1 NUMBER M_AMOUNT2 NUMBER SQL> INSERT INTO MV_FACT_SALES VALUES ('3000-1',1500,1600); INSERT INTO MV_FACT_SALES VALUES ('3000-1',1500,1600) * ERROR at line 1: ORA-01732: data manipulation operation not legal on this...
站内搜索 | Search
总数: 519 | 留言: 1607
- Name: Fangxin Lou
- MSN: anysql©live.com
- Mail:anysql©yahoo.com
anysql©gmail.com - Skype: anysql
- AIM: loufangxin
- Mobile:008615925611590
分类 | Categories
软件下载:
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql