oracle中使用物化视图实现表的同步

表的同步可以使用物化视图来实现,可以是同库的也可以是不同数据库之间进行数据同步,建议在同库的数据同步可以使用实时的同步,如果使用db link建议使用增量的刷新方式,防止dblink导致原库的性能急剧下降。

主要步骤:

1.在原表上建立物化视图日志

2.在创建目标表

3.创建与目标表同名的物化视图日志

1.创建原表和物化视图日志
SQL> conn bre/bre
Connected.

SQL> create table t1(id int,name varchar2(30));

Table created.

SQL> alter table t1 add constraint pk_t1 primary key(id) using index;

Table altered.

SQL> create materialized view log on t1 with primary key;

Materialized view log created.
<pre name="code" class="sql">2.创建目标表和物化视图
注意这里我创建是refresh fast on commit类型的物化视图

SQL> create table t2 as select * from t1 where 1=2;

Table created.

SQL> CREATE MATERIALIZED VIEW  t2 on prebuilt table refresh fast on commit  as select * from t1;

Materialized view created.

3.简单测试
在t1插入一条数据,一提交t2即存在数据
SQL> insert into t1 values(1,'A');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t2;

	ID NAME
---------- ------------------------------
	 1 A
4.ddl测试
通过测试我们发现物化视图不支持ddl语句
我们给t1添加一个列和rename一个列
SQL> alter table t1 add sf int;

Table altered.

SQL> alter table t1 rename column name to names;

Table altered.

SQL> select * from t1;

	ID NAMES				  SF
---------- ------------------------------ ----------
	 2 B

SQL> select * from t2;

	ID NAME
---------- ------------------------------
	 2 B

SQL> insert into t1 values(3,'X',123);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t1;

	ID NAMES				  SF
---------- ------------------------------ ----------
	 2 B
	 3 X					 123

SQL> select * from t2;

	ID NAME
---------- ------------------------------
	 2 B
我们发现数据没有过来,我们看一下物化视图的定义和状态

SQL> select dbms_metadata.get_ddl('MATERIALIZED_VIEW','T2') from dual;

DBMS_METADATA.GET_DDL('MATERIALIZED_VIEW','T2')
--------------------------------------------------------------------------------

  CREATE MATERIALIZED VIEW "BRE"."T2" ("ID", "NAME")
  ON PREBUILT TABLE WITHOUT REDUCED PRECISION
  USING INDEX
  REFRESH FAST ON COMMIT
  WITH PRIMARY KEY USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
  AS SELECT "T1"."ID" "ID","T1"."NAME" "NAME" FROM "T1" "T1"

SQL> SELECT STALENESS from user_mviews;

STALENESS
-------------------
COMPILATION_ERROR
此时物化视图为编译错误。
5.重新创建一个demand物化视图

SQL> CREATE MATERIALIZED VIEW  t2 on prebuilt table refresh fast on demand as select * from t1;

Materialized view created.

SQL> select * from t2;

no rows selected

SQL> exec dbms_mview.refresh('T2','c');  --手工全量刷新

PL/SQL procedure successfully completed.

SQL> select * from t2;

	ID NAMES				  SF
---------- ------------------------------ ----------
	 2 B
	 3 X					 123

SQL> insert into t1 values(4,'Y',88);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t2;

	ID NAMES				  SF
---------- ------------------------------ ----------
	 2 B
	 3 X					 123

SQL> exec dbms_mview.refresh('T2','f');  --手工增量刷新

PL/SQL procedure successfully completed.

SQL> select * from t2;

	ID NAMES				  SF
---------- ------------------------------ ----------
	 2 B
	 3 X					 123
	 4 Y					  88
6.创建物化视图的语句
官方文档:
http://docs.oracle.com/database/121/SQLRF/statements_6002.htm#SQLRF01302
CREATE MATERIALIZED VIEW [ schema. ] materialized_view
  [ OF [ schema. ] object_type ]
  [ ( { scoped_table_ref_constraint
      | column_alias [ENCRYPT [encryption_spec]]
      }
      [, { scoped_table_ref_constraint
         | column_alias [ENCRYPT [encryption_spec]]
         }
      ]...
    )
  ]
  { ON PREBUILT TABLE
    [ { WITH | WITHOUT } REDUCED PRECISION ]
  | physical_properties materialized_view_props
  }
  [ USING INDEX
    [ physical_attributes_clause
    | TABLESPACE tablespace
    ]...
  | USING NO INDEX
  ]
  [ create_mv_refresh ]
  [ FOR UPDATE ]
  [ evaluation_edition_clause ]
  [ query_rewrite_clause ]
AS subquery ;

7.创建物化视图日志的语句
官方文档:
http://docs.oracle.com/database/121/SQLRF/statements_6003.htm#SQLRF01303

CREATE MATERIALIZED VIEW LOG ON [ schema. ] table
  [ physical_attributes_clause
  | TABLESPACE tablespace
  | logging_clause
  | { CACHE | NOCACHE }
  ]...
  [ parallel_clause ]
  [ table_partitioning_clauses ]
  [ WITH [ { OBJECT ID
         | PRIMARY KEY
         | ROWID
         | SEQUENCE
         | COMMIT SCN
         }
           [ { , OBJECT ID
             | , PRIMARY KEY
             | , ROWID
             | , SEQUENCE
             | , COMMIT SCN
             }
           ]... ]
    (column [, column ]...)
    [ new_values_clause ]
  ] [ mv_log_purge_clause ]
;

时间: 2024-08-03 07:10:22

oracle中使用物化视图实现表的同步的相关文章

转: Oracle中的物化视图

物化视图创建语法:CREATE MATERIALIZED VIEW <schema.name>PCTFREE <integer>--存储参数PCTUSED <integer>--存储参数TABLESPACE <tablespace_name>--表空间BUILD IMMEDIATE|DEFERRED--创建方式ENABLE|DISABLE QUERY REWRITE--是否支持查询重写REFRESH <FORCE|FAST|COMPLETE|NEVER

Oracle 使用物化视图实现表数据同步

1.创建原表和物化视图日志 SQL> create table t1(id int,name varchar2(30)); Table created. SQL> alter table t1 add constraint pk_t1 primary key(id) using index; Table altered. SQL> create materialized view log on t1 with primary key; Materialized view log crea

Oracle数据库入门——物化视图语法

一.Oracle物化视图语法 create materialized view [view_name]refresh [fast|complete|force][on [commit|demand] | start with (start_time) next (next_time)]as{创建物化视图用的查询语句} 以上是Oracle创建物化视图(Materialized View, 以下简称MV)时常用的语法,各参数的含义如下: 1.refresh [fast|complete|force]

oracle中查看当前用户的表结构、主键、索引

1.查询表的所有列及其属性 select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表 2.查找表的所有索引(包括索引名,类型,构成列) select t.*,i.index_type from user_ind_columns t,user

Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create or replace type splitTable is table of varchar2(100); 2.创建函数fn_splitString(功能是将字符串分割成多条记录)--测试语句select * from table(fn_splitString('ernanyinv','nan'))

Oracle数据库入门——物化视图日志结构

物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号. 物化视图日志在建立时有多种选项:可以指定为ROWID.PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE或明确指定列名.上面这些情况产生的物化视图日志的结构都不相同. 任何物化视图都会包

恢复oracle中误删除drop掉的表

查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin; 恢复表 SQL>flashback table test_drop to before drop;或SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop; 注:必须9i或10g以上版本

在Oracle中查询表的大小、表的占用情况和表空间的大小

转载自http://blog.csdn.net/cuker919/article/details/8514253 select segment_name, bytes as 大小 from user_segments where segment_type = 'TABLE' and segment_name in ('VIEW_JLZDH_MP_DL_DAY_01','VIEW_JLZDH_MP_DL_DAY_02','VIEW_JLZDH_MP_DL_DAY_03', 'VIEW_JLZDH_

Oracle中scott用户下基本表练习SQL语句

--选择部门中30的雇员SELECT * from emp where DEPTNO=30;--列出所有办事员的姓名.部门.编号--采用内连接方式,也就是等值链接,也是最常用的链接SELECT ename,empno,dname from emp e INNER JOINdept d on e.deptno=d.deptno where job='CLERK';--找出佣金高于薪金的雇员select * from emp where comm>sal;--找出佣金高于薪金60%的雇员select