网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.CERN应用Oracle9iAS提高网络应用.
.oracle数据库用户创建、权限分配.
.在Redhat 9上安装 Oracle 817心得.
.OCP认证培训:是口误还是阴谋.
.如何使用oracle的decode函数进行.
.Oracle Fail Safe Step-By-Step .
.通过实例来教你如何配置Oracle监.
.Oracle 10g 中管理物化视图变得更.
.如何导入指定表.
.详解 Oracle 10g 中 MERGE 功能的.
.分析函数lag小技巧.
.Oracle10g新增的用以简化用户管理.
.Oracle数据库技术(44).
.让数据围着银行转.
.用脚本和查询主动监视Oracle 9i性.
.Oracle中的数据字典技术简析.
.关于Oracle数据库中的N层认证具体.
.rman备份,未用catalog,控制文件丢.
.Oracle8i在linux下的安装(中文).
.ORACLE问题,每天10问(三).

不重建快照的情况下可以修改主表 (二)

发表日期:2008-2-9


    不知道谁在主表上删除了一个字段,搞得snapshot无法快速refresh;还好是on prebuilt table的,再一看发现mlog里面有记录,如何才能保证2边数据一致那,我可不想complete refresh。     解决方法 只在只有一个snapshot的前提下,且master table无任何dml语句。     测试如下: SQL> create table st as select * from dba_users where rownum<5; Table created. SQL> alter table st add primary key (user_id); Table altered. SQL> create snapshot log on st; Materialized view log created. SQL> delete from st where rownum=1; 1 row deleted. SQL> commit; Commit complete. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered.     观察mlog中的纪录,注重SNAPTIME$$ 时间字段。 SQL> select * from mlog$_st; USER_ID SNAPTIME$$ D O ---------- ------------------- - - CHANGE_VECTOR$$ ------------------------------------------------------------------------------------------------------------------------------------------------------ 249 4000-01-01 00:00:00 D O 0000     创建一个on prebuilt snapshot SQL> create table sts as select * from st; SQL> alter table sts add primary key(user_id); SQL> create snapshot sts on prebuilt table as select * from st; Materialized view created.     创建快照后,mlog中的数据自动清除 SQL> select * from mlog$_st; no rows selected     在主表上作修改 SQL> delete from st where rownum=1; 1 row deleted. SQL> commit; Commit complete.     观察日志 SQL> select * from mlog$_st; USER_ID SNAPTIME$$ D O ---------- ------------------- - - CHANGE_VECTOR$$ ------------------------------------------------------------------------------------------------------------------------------------------------------ 256 4000-01-01 00:00:00 D O 0000     删除一个字段 SQL> alter table st set unused column username;     用临时表保存mlog中的纪录 SQL> create table mlog_st as select * from mlog$_st; Table created.     执行快速刷新失败 SQL> exec dbms_snapshot.refresh('sts','f'); BEGIN dbms_snapshot.refresh('sts','f'); END; * ERROR at line 1: ORA-12008: error in snapshot refresh path ORA-00904: invalid column name ORA-06512: at "SYS.DBMS_SNAPSHOT", line 617 ORA-06512: at "SYS.DBMS_SNAPSHOT", line 674 ORA-06512: at "SYS.DBMS_SNAPSHOT", line 654 ORA-06512: at line 1     察看mlog纪录,发现SNAPTIME$$被修改了 SQL> select * from mlog$_st; USER_ID SNAPTIME$$ D O ---------- ------------------- - -
CHANGE_VECTOR$$ ------------------------------------------------------------------------------------------------------------------------------------------------------ 256 2005-06-04 02:39:39 D O 0000     删除snapshot ,预备重新建立;但对应的mlog内容被自动删除,所以之前要保留mlog中的纪录,要不然数据不一致就完了 SQL> drop snapshot sts; Materialized view dropped. SQL> select * from mlog$_st; no rows selected 在on prebuilt table上作修改 SQL> alter table sts set unused column username; Table altered. SQL> create snapshot sts on prebuilt table as select * from st; Materialized view created.     发现不一致 SQL> select ( select count(*) from st) st, ( select count(*) from sts) sts from dual; ST STS ---------- ---------- 2 3     fast refresh成功,但是数据不一致 SQL> exec dbms_snapshot.refresh('sts','f'); PL/SQL procedure sUCcessfully completed. SQL> select ( select count(*) from st) st, ( select count(*) from sts) sts from dual; ST STS ---------- ---------- 2 3     将mlog纪录再copy回来。 SQL> insert into mlog$_st select * from mlog_st; 1 row created. SQL> commit; Commit complete.     刷新后,数据一致 SQL> exec dbms_snapshot.refresh('sts','f'); PL/SQL procedure successfully completed. SQL> select ( select count(*) from st) st, ( select count(*) from sts) sts from dual; ST STS ---------- ---------- 2 2     要害在于mlog数据的保存和时间字段的设置,4000-01-01 00:00:00 表示还没有被刷新过。     假如,这个mlog被多个snapshot使用,可能过程更复杂。
上一篇:sqlplus的oci prefetch特性 人气:681
下一篇:查找bad sql的方法 人气:572
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐