建立 Logical Standby Database
一、確認主庫包含邏輯STANDBY支援的表和資料型別
1、 邏輯STANDBY支援的資料型別:
CHAR
NCHAR
VARCHAR2 and VARCHAR
NVARCHAR2
NUMBER
DATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
RAW
CLOB
BLOB
2、邏輯STANDBY不支援的資料型別:
NCLOB
LONG RAW
BFILE
ROWID
UROWID
3、邏輯STANDBY不支援的表和序列:
Tables and sequences in the SYS schema
Tables with unsupported datatypes
Tables used to support functional indexes
Tables used to support materialized views
Global temporary tables
邏輯STANDBY不支援的表和列可以透過檢視dba_logstdby_unsupported來查詢:
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
4、邏輯STANDBY不支援的SQL語句操作(會過濾掉下面語句):
ALTER DATABASE
ALTER SESSION
ALTER SNAPSHOT
ALTER SNAPSHOT LOG
ALTER SYSTEM SWITCH LOG
CREATE CONTROL FILE
CREATE DATABASE
CREATE DATABASE LINK
CREATE PFILE FROM SPFILE
CREATE SCHEMA AUTHORIZATION
CREATE SNAPSHOT
CREATE SNAPSHOT LOG
CREATE SPFILE FROM PFILE
CREATE TABLE AS SELECT FROM A CLUSTER TABLE
DROP DATABASE LINK
DROP SNAPSHOT
DROP SNAPSHOT LOG
EXPLAIN
LOCK TABLE
RENAME
SET CONSTRAINTS
SET ROLE
SET TRANSACTION
確認主資料庫是否包含不支援的物件能夠查詢資料字典表dba_logstdby_unsupported:
SQL> select distinct owner,table_name from dba_logstdby_unsupported
order by owner,table_name;
用以下的方式檢視上面所得出的表的欄位名和資料型別:
SQL> select column_name,data_type from dba_logstdby_unsupported
where owner=oe and table_name = customers;
二、 確認主庫中所有表都具備唯一約束
邏輯STANDBY需要確保主庫中每一行每一列的更新都能被日誌應用到邏輯備用庫裡面,因此最好主庫中的表都具備唯一約束。可以透過檢視DBA_LOGSTDBY_NOT_UNIQUE來查詢主庫中不具備唯一約束的表。
找出沒有主鍵的表:
SQL> select owner, table_name, bad_column from dba_logstdby_not_unique
where table_name not in (select table_name from dba_logstdby_unsupported);
選擇出來看bad_column欄位值.假如此值為n表示這個表關於沒有主鍵欄位列有足夠的列資訊傳到備用資料庫中.假如此值為y表示資訊不夠必須對這個表加一個disable rely constraint以使關於這個表的log能夠apply到邏輯備用庫中.
選擇出來只有system使用者下的表repcat$_runtime_parms需要做修改,然後檢視這個表的結構.然後做修改如下:
SQL> desc system.repcat$_runtime_parms
SQL> alter table system.repcat$_runtime_parms add primary key (runtime_parm_id,parameter_name) rely disable;
修改完以後再做上面的查詢以確認沒有表需要再做修改:
SQL> select owner, table_name, bad_column from dba_logstdby_not_unique
where table_name not in (select table_name from dba_logstdby_unsupported);
owner table_name b
------------------------------ ------------------------------ -
outln ol$hints n
outln ol$nodes n
system mview$_adv_basetable n
system mview$_adv_sqldepend n
system mview$_adv_filterinstance n
system def$_origin n
system repcat$_snapgroup n
system repcat$_ddl n
system repcat$_resolution_statistics n
system mview$_adv_index n
如果表不具備唯一約束的話,建議建立一個RELY的唯一約束:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;
如果不具備唯一約束的話,那麼ORACLE的supplemental logging特性可以自動產生用於標識主庫中每一行更改的資訊,使得邏輯STANDBY能夠同步這些變更。
檢視是否啟用了supplemental logging特性:
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
NO NO
如果未啟用的話,那麼開啟supplemental logging特性:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
YES YES
三、 主庫其他檢查事項
1、 確保主庫是歸檔模式
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /oraclelog
Oldest online log sequence 12800
Next log sequence to archive 12804
Current log sequence 12804
2、 log_parallelism引數必須設定為1:
SQL> show parameter log_parallelism
NAME TYPE VALUE
---------------- ----------- -------
log_parallelism integer 1
3、 建立一個logminer所用的表空間:
建立邏輯STANDBY物件的預設表空間是SYSTEM表空間,為了減少對系統表空間的影響,我們建立一個專門的表空間用於邏輯STANDBY:
SQL> CREATE TABLESPACE logminer DATAFILE ‘d:/oracle/oradata/xue9/logminer01.dbf’ size 50M;
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE(‘logminer’);
四、 邏輯STANDBY配置主庫端操作:
1、用rman全庫遷移。
2、MOUNT主庫,生成備用庫控制檔案:
SQL> startup mount
ORACLE instance started.
Total System Global Area 80813392 bytes
Fixed Size 453968 bytes
Variable Size 54525952 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
Database mounted.
Sql> ALTER DATABASE BACKUP CONTROLFILE TO 'd:/oracle/oradata/standby/control01.ctl';
Database altered.
4、 開啟主庫,執行DBMS_LOGSTDBY.BUILD生成邏輯STANDBY所需LOGMINER字典資訊:建立logminer字典(logical standby database在分解redo log為sql語句時需要logminer工具,而這個工具在使用之前需要建立logminer字典):
SQL> alter database open;
Database altered.
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
PL/SQL procedure successfully completed.
5、歸檔當前日誌,並記錄包含建立邏輯STANDBY字典資訊的最新歸檔日誌,將最新歸檔COPY至STANDBY的相應歸檔目錄:
SQL> alter system switch logfile;
System altered.
SQL> select name from v$archived_log where dictionary_begin='yes' and standby_dest='no';
6、 生成STANDBY初始化引數檔案:
SQL> create pfile=’d:/init.ora’ from spfile
五、 邏輯STANDBY配置:
1、 更改初始化引數檔案:
注意更改control_files、background_dump_dest等指定的相應目錄,這些目錄必須預先建立好,注意新增以下幾個引數:
standby_archive_dest:指定備用庫的歸檔路徑
parallel_max_servers:設定為9,必須設定,因為STANDBY日誌恢復里程會啟動相應的並行程式:
LOGMINER: Fetch Slave process P003 started with pid=17 OS id=3632
LOGMINER: Apply Slave process P004 started with pid=18 OS id=1888
LOGMINER: Apply Slave process P005 started with pid=19 OS id=2292
LOGMINER: Apply Slave process P006 started with pid=20 OS id=3336
LOGMINER: Apply Slave process P007 started with pid=21 OS id=3824
LOGMINER: Apply Slave process P008 started with pid=22 OS id=1788
instance_name:如果是同機配置STANDBY的話,必須指定和主庫不同的例項名
更改後的引數檔案如下:
*.aq_tm_processes=1
*.background_dump_dest='$ORACLE_BASE'
*.compatible='10.2.0.3.0'
*.control_files='$ORACLE_BASE/oradata/STANDBY/control01.ctl','$ORACLE_BASE/oradata/STANDBY/control02.ctl','$ORACLE_BASE/oradata/STANDBY/control03.ctl'
*.core_dump_dest='$ORACLE_BASE /admin/STANDBY/cdump'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='gpicdb0'
*.fast_start_mttr_target=300
*.hash_join_enabled=TRUE
*.instance_name='gpicdb0'
*.java_pool_size=8388608
*.job_queue_processes=10
*.large_pool_size=8388608
*.log_archive_dest_1='location=/orarach'
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=12582912
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=20971520
*.sort_area_size=524288
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=5400
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='$ORACLE_BASE /admin/STANDBY/udump'
*.STANDBY_ARCHIVE_DEST='$ORACLE_BASE /oradata/STANDBY/archive'
*.LOG_ARCHIVE_FORMAT=ARC%S.%T
*.lock_name_space=STANDBY
*.standby_file_management='AUTO'
*.parallel_max_servers=9
*.log_parallelism=1
3、將備用庫的控制檔案按引數檔案中的設定COPY 3份並更名,MOUNT資料庫,更改資料檔案和日誌檔案和路徑
4、更改資料庫名字並啟動資料庫(這步可做可不做):
5、STANDBY建立臨時檔案,如果v$tempfile有記錄主庫的臨時檔案資訊,必須先offline drop掉後再建立。這步必須要做,要不STANDBY將無法配置成功。
idle> select * from v$tempfile;
no rows selected
Elapsed: 00:00:00.01
idle> alter tablespace temp add tempfile 'd:/oracle/oradata/standby/temp01.dbf' size 50M reuse;
Tablespace altered
6、手工註冊COPY過來的歸檔日誌檔案:
idle> ALTER DATABASE REGISTER LOGICAL LOGFILE 'D:/oracle/oradata/STANDBY/archive
/ARC00094.001';
Database altered
7、啟動STANDBY日誌應用模式:
idle> ALTER DATABASE START LOGICAL STANDBY APPLY INITIAL;
Database altered
六、 配置listener.ora和tnsnames.ora:
listener.ora新增STANDBY的配置資訊:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = //oracle/app/oracle10g)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = gpicdb0)
(ORACLE_HOME = /oracle/app/oracle10g)
(SID_NAME = gpicdb0)
)
(SID_DESC =
(GLOBAL_DBNAME = standby)
(ORACLE_HOME = /oracle/app/oracle10g)
(SID_NAME = standby)
)
(SID_DESC =
(GLOBAL_DBNAME = XUE9)
(ORACLE_HOME = /oracle/app/oracle10g)
(SID_NAME = gpicdb0)
)
)
Tnsnames.ora新增STANDBY的連線字:
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 100.250.128.21)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =gpicdb0)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 100.250.128.24)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standby)
)
)
配置完成後重啟監聽:lsnrctl reload
七、 主庫配置STANDBY的歸檔資訊:
SQL> alter system set log_archive_dest_2='service=standby lgwr';
SQL> alter system set log_archive_dest_state_2=enable;
至此,邏輯STANDBY配置完成。
八、 測試日誌應用:
主庫端操作:
SQL> create user roby identified by roby;
SQL> grant dba to roby;
SQL> alter user roby default tablespace users;
SQL> alter system switch logfile
SQL> conn roby/roby
Connected.
SQL> create table t(a int);
SQL> insert into t values(1);
SQL> insert into t values(1);
SQL> insert into t values(1);
SQL> insert into t values(1);
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> select * from t;
A
----------
1
1
1
1
Elapsed: 00:00:00.00
備用庫端檢查:
Alert log記錄的資訊:
程式碼:
LOGSTDBY stmt: create user roby identified by VALUES '3937FA8E626D1ADE'
LOGSTDBY event: ORA-16204: DDL successfully applied
LOGSTDBY stmt: grant dba to roby
LOGSTDBY event: ORA-16204: DDL successfully applied
LOGSTDBY stmt: alter user roby default tablespace users
Thu Jun 21 13:58:15 2007
LOGSTDBY event: ORA-16204: DDL successfully applied
LOGSTDBY stmt: create table t(a int)
Thu Jun 21 14:05:16 2007
LOGSTDBY event: ORA-16204: DDL successfully applied
SQLPLUS登入進去,可以看到建立的表已經成功同步了:
idle> conn roby/roby
Connected.
idle> select * from t;
A
----------
1
1
1
1
啟用STANDBY保護模式並開啟資料庫:
idle> ALTER DATABASE GUARD ALL;
Database altered.
idle> ALTER DATABASE OPEN RESETLOGS;
Database altered.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21102096/viewspace-1018974/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle DG建立Logical Standby DatabaseOracleDatabase
- 建立Data guard logical standby database須知Database
- manage logical standby databaseDatabase
- 監控Logical standby databaseDatabase
- 4 Creating a Logical Standby Database 建立邏輯備庫Database
- Logical Standby Database的配置步驟.Database
- [江楓]In Memory Undo與logical standby databaseDatabase
- 建立Oracle 11g logical standbyOracle
- Oracle10g logical standby 建立Oracle
- Oracle DG建立Physical Standby DatabaseOracleDatabase
- 使用rman建立standby database的過程Database
- DataGuard:Logical Standby Switchover
- 10g Logical Standby的建立,優化及管理 - 更新優化
- 建立一個standby database的全過程Database
- DataGuard:Logical Standby FailoverAI
- alter database recover to logical standby xxx 很長時間,為什麼Database
- standby databaseDatabase
- Convert a Physical Standby Database into a Snapshot Standby DatabaseDatabase
- 同事總結的 : 用RMAN建立Physical Standby DatabaseDatabase
- Oracle 11g Data Guard 使用 duplicate from active database 建立 standby databaseOracleDatabase
- Oracle 11g Data Guard 使用duplicate from active database 建立 standby databaseOracleDatabase
- standby database to primary database.Database
- Physical Standby Database 切換到 Snapshot Standby DatabaseDatabase
- oracle實驗記錄 (oracle 10G dataguard(11)建立logical standby)Oracle
- Standby Database ---09Database
- 物理Standby資料庫及邏輯Standby資料庫(Physical Standby & Logical Standby)資料庫
- 在Logical Standby上處理DDL及DML , ORA-16224: Database Guard is enabledDatabase
- 1.1 Logical Structure of Database ClusterStructDatabase
- Create Logical Standby For Oracle 10GOracle 10g
- Logical Standby的維護操作_SKIP
- Logical Standby中Job的處理
- Create RAC Standby Database for RAC Primary DatabaseDatabase
- standby database No RFS 程式Database
- Rman backup standby databaseDatabase
- Standby Database for reportDatabase
- Oracle10gR2 Logical Standby (zt)Oracle
- [zt] Logical standby維護命令手冊
- Standby Database的工作原理Database