Overview
Read-only
snapshot sites can be used to provide local access to remote master tables. Having a
local snapshots of the data improves query response time. Updates can only be issued
against the master table.
Starting from
Oracle10g Read-only Snapshots are so called Read-Only
Materialized Views
Read-Only Materialized Views
In a basic configuration, materialized views can
provide read-only access to the table data that originates from a master site or master
materialized view site. Applications can query data from read-only materialized views to
avoid network access to the master site, regardless of network availability. However,
applications throughout the system must access data at the master site to perform data
manipulation language changes (DML). The master tables and master materialized views of
read-only materialized views do not need to belong to a replication group.
Read-only materialized views provide the following
benefits:
-
Eliminate the possibility of conflicts because
they cannot be updated.
-
Support complex materialized views. Examples of
complex materialized views are materialized views that contain set operations or a
CONNECT BY clause.
Example
In order to
create one (or many) read-only snapshot of the master Oracle database tables, the
following steps are necessary.
-
Master
Site: Oracle 10.1.0.3, Solaris 9, SID=QUO3
-
Snapshot
Site: Oracle 8.1.7.4, Solaris 8, SID=DIA1
- On Master
(Host=quorum)
DIA1.WORLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = diamond)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = DIA1)
(INSTANCE_NAME = DIA1)
(SRVR = DEDICATED)
)
)
DIA1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = diamond)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = DIA1)
(INSTANCE_NAME = DIA1)
(SRVR = DEDICATED)
)
)
On Snapshot
(Host=diamond)
QUO3.WORLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = quorum)(PORT = 1523))
(CONNECT_DATA =
(SERVICE_NAME = QUO3)
(INSTANCE_NAME = QUO3)
(SRVR = DEDICATED)
)
)
QUO3 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = quorum)(PORT = 1523))
(CONNECT_DATA =
(SERVICE_NAME = QUO3)
(INSTANCE_NAME = QUO3)
(SRVR = DEDICATED)
)
)
On Master
(Host=quorum)
sqlplus scott/tiger@QUO3
CREATE DATABASE LINK DIA1 CONNECT TO scott IDENTIFIED BY tiger using 'DIA1';
Database link created.
On Snapshot
(Host=diamond)
sqlplus scott/tiger@DIA1
CREATE DATABASE LINK QUO3 CONNECT TO scott IDENTIFIED BY tiger using 'QUO3';
Database link created.
desc emp@QUO3;
Name
Null? Type
----------------------------------------- -------- ----------------------
EMPNO
NOT NULL NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
For each
table, which should be replicated, a SNAPSHOT LOG must be created (as user, who owns the
table).
A materialized view
log (Snapshot Log) is a table at the materialized view's master site or master
materialized view site that records all of the DML changes to the master table or master
materialized view. A materialized view log is associated with a single master table or
master materialized view, and each of those has only one materialized view log,
regardless of how many materialized views refresh from the master. A fast refresh of a
materialized view is possible only if the materialized view's master has a materialized
view log. When a materialized view is fast refreshed, entries in the materialized
view's associated materialized view log that have appeared since the materialized view
was last refreshed are applied to the materialized view.
On Master
(Host=quorum)
sqlplus scott/tiger@QUO3
DROP SNAPSHOT LOG ON emp;
CREATE SNAPSHOT LOG ON emp
TABLESPACE tab
STORAGE
(INITIAL 200K
NEXT
200K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0);
Materialized view log created.
A snapshot
contains on the remote site the data of the master table. All data changes are reflected
in the snapshot after a refresh
of the snapshot (either triggered manually or automatically).
On Snapshot
(Host=diamond)
sqlplus scott/tiger@DIA1
CREATE SNAPSHOT emp
PCTFREE 15
STORAGE
(INITIAL 200K
NEXT 200K
PCTINCREASE 0)
TABLESPACE tab
USING INDEX
PCTFREE 0
STORAGE
(INITIAL 200K
NEXT 200K
PCTINCREASE 0)
TABLESPACE idx
REFRESH FORCE
START WITH SYSDATE NEXT SYSDATE+(1/1440) /* 60 SECONDS
*/
AS SELECT * FROM emp@QUO3;
Materialized view created.
On Snapshot
(Host=diamond)
sqlplus scott/tiger@DIA1
CREATE PUBLIC SYNONYM emp FOR scott.emp; Synonym
created.
Now, you can access the table emp locally which will
be automatically refreshed every 60 sec.
The snapshot on the remote site must be refreshed regularily. This
can be done bullet either by hand after a substantial change on the master site or in
regular intervalls.
On Snapshot
(Host=diamond)
sqlplus scott/tiger@DIA1
execute dbms_snapshot.refresh('scott.emp','F'); PL/SQL
procedure successfully completed.
The first parameter is a list of snapshots to be refreshed. The
second describes the method, F stands for FAST refresh (only changes in the master table
are propagated, C stands for complete refresh.
There is also a dbms_snapshot.refresh_all routine. It
requires some more privileges.
execute
dbms_snapshot.refresh_all;
Automatic refresh is realized by parameters for a refresh group or
by the definition of the snapshot. In order to run periodoc jobs in the database (as
automatic refresh jobs), the ability to run SNP background jobs must be given.
Especially, in the file init<instance>.ora , located the parameter
job_queue_processes = 1
must be included (the default is 0) and the database must be
restarted! This parameter allows background processes to be executed in one job
queue.
You may use the following query to check, if automatically refresh
works.
SELECT SUBSTR(job,1,4) "Job",
SUBSTR(log_user,1,5) "User",
SUBSTR(schema_user,1,5) "Schema",
SUBSTR(TO_CHAR(last_date,'DD.MM.YYYY HH24:MI'),1,16) "Last Date",
SUBSTR(TO_CHAR(next_date,'DD.MM.YYYY HH24:MI'),1,16) "Next Date",
SUBSTR(broken,1,2) "B", SUBSTR(failures,1,6) "Failed",
SUBSTR(what,1,20) "Command"
FROM dba_jobs;
Job User Schem Last
Date Next
Date B Failed Command
---- ----- ----- ---------------- ---------------- - ------ --------------------
2 SCOTT SCOTT 06.09.2005 15:05 06.09.2005 15:06 N
0 dbms_refresh.refresh
On Master
(Host=quorum)
sqlplus scott/tiger@QUO3
spool drop_snapshot_logs.sql
select 'PROMPT Dropping Snapshot Log for '||MASTER||chr(10)
||'drop snapshot log on '||MASTER||';'
from USER_SNAPSHOT_LOGS;
spool off
@drop_snapshot_logs.sql
PROMPT Snapshot Logs Dropped
On Snapshot
(Host=diamond)
sqlplus scott/tiger@DIA1
spool drop_snapshots.sql
select 'PROMPT Dropping Snapshot for '||NAME||chr(10)
||'drop snapshot '||NAME||';'
from USER_SNAPSHOTS;
@drop_snapshots.sql
PROMPT Snapshots dropped
If the snapshot must obey certain integrity rules,
like referential integrity, then the refresh of the snapshot tables must be synchronized.
This is achieved by creating refresh groups.
dbms_refresh.make(
name =>
'MY_GRP',
list =>
'emp,dept,bonus,salgrade',
next_date =>
SYSDATE,
interval =>
'SYSDATE + (1/1440)', /* 60 seconds */
implicit_destroy => TRUE, /* delete the group if substracting
the last member */
lax =>
TRUE, /* delete from other group if
already
existing in a group */
rollback_seg => 'RB06'
);
commit;
|