Oracle 9i Logical Standby Database
1. 准备至少2台主机,其中一台已经安装了Oracle9R2的版本数据库,并创建了实例,另外一台为从库需要安装Oracle数据库软件;
我们定义:有实例的为主库;另外一个standby的环境为从库;
2. 准备好存储,建议使用和环境相同的存储;
3.需要拥有2个角色的用户LOGSTDBY_ADMINISTRATOR role和SELECT_CATALOG_ROLE;
1. 必须在主库端强制生成log,因为如果在主、从库是通过redolog进行信息同步的,如果主库端进行了nologging的强制的话,那么信息将无法传递给从库导致两库环境的不统一;
SQL> ALTER DATABASE FORCE LOGGING;
2. 主库端必须要开启归档日志,并定义好归档的目录;
SQL> alter system set log_archive_dest_1='location=/u01/oracle/arch MANDATORY ' scope=both;
这里如何开归档就不再详细描述了,如果不会开可以参考一下Oracle的官方文档;
3. 在主库端允许日志的并行即SET LOG_PARALLELISM=1
SQL> alter system set log_parallelism=1 scope=spfile;
System altered.
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1561401968 bytes
Fixed Size 453232 bytes
Variable Size 486539264 bytes
Database Buffers 1073741824 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SQL>
4. 明确主从两个数据库之间可以同步的数据类型和表的类型,对于有些数据类型和表是可以同步的,但是有些数据类型和表是无法通过DataGuard进行同步的:
可以同步的数据类型 | 可以同步的表类型 |
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
| |
不能同步的数据类型 | 不支持的表类型 |
NCLOB LONG LONG RAW BFILE ROWID UROWID user-defined types object types REFs varrays nested tables | User-defined tables and sequences in the SYS schema Tables with unsupported datatypes Tables using data segment compression Index-organized tables |
5. 明确在当前的主库中哪些表是可以同步哪些表是不能同步的,可以通过下列语句查询:
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列中会显示Y或者N两种情况,注意:
Y-
表示查询到的表中使用了无限制的数据类型,比如CLOB or BLOB,此时提交的操作会继续在这些表中进行同步,但是你必须要保证这些类型在表中的列是唯一的,如果有2行相同的类型在一个表中,那么同步的过程很可能会出现错误,如果无法确认的话可以考虑在表上创建主键;
N-表示这个表包含了足够的信息来进行同步;
6. 确认在主库上追加日志的功能必须打开,可以用以下的语句来确认是否已经打开了此功能:
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP --- --- YES YES上边这个列子表示追加日志的功能已经打开;
如果没有开这个功能请按照以下操作进行:
第一:开启日志追加功能
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;第二:切换一个新的redolog
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;第三: 检查配置结果
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE; SUP SUP --- --- YES YES7. 创建一个主从库转换用的表空间:
SQL>CREATE TABLESPACE logmnrts DATAFILE '/u01/oracle/oradata/report/logmnrts.dbf' SIZE 25M AUTOEXTEND ON MAXSIZE UNLIMITED;
SQL>EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts');步骤 | 内容 | 操作库 |
1 | 确认主库上的数据文件和日志文件 | Primary |
2 | 生成一份主库的备份 | Primary |
3 | 生成一份初始化参数文件并拷贝到从库端 | Primary |
4 | 把主库的文件副本复制到从库上 | Primary |
5 | 设置从库端的初始化参数文件 | Standby |
6 | 如果从库安装在Windowns环境,创建一个Windowns服务 | Standby |
7 | 配置两个数据库的监听 | Primary and Standby |
8 | 开启死进程监控系统 | Standby |
9 | 配置主库和从库的server_name文件 | Primary and Standby |
10 | 从库启动到mount状态 | Standby |
11 | 修改数据文件的名称 | Standby |
12 | 修改redolog的名称 | Standby |
13 | 开启DatabaseGuard功能 | Standby |
14 | 为逻辑从库修改sid名称 | Standby |
15 | 在参数文件里修改DB-name | Standby |
16 | 为从库创建临时文件 | Standby |
17 | 注册归档日志,开始sql同步功能 | Standby |
18 | 从库开启归档功能 | Primary |
1. 确认主库上的数据文件和日志文件
数据文件:
SQL> SELECT NAME FROM V$DATAFILE;
NAME
--------------------------------------------------------------------------------
/u01/oracle/oradata/report/system01.dbf
/u01/oracle/oradata/report/undotbs01.dbf
/u01/oracle/oradata/report/users01.dbf
/u01/oracle/oradata/report/report_tab01.dbf
/u01/oracle/oradata/report/report_ind02.dbf
/u01/oracle/oradata/report/logmnrts.dbf
日志文件:
SQL> select MEMBER FROM V$LOGFILE;
MEMBER
----------------------------------------------------------------------------------
/u01/oracle/oradata/report/redo01.log
/u01/oracle/oradata/report/redo02.log
/u01/oracle/oradata/report/redo03.log
2. 生成一份主库的备份
第一步:shutdow 主库
SQL> SHUTDOWN IMMEDIATE;第二步:把主库的数据文件copy到一个临时的目录里:
cp /u01/oracle/oradata/report/system01.dbf /u01/oracle/oradata/standby/system01.dbf cp /u01/oracle/oradata/report/undotbs01.dbf /u01/oracle/oradata/standby/undotbs01.dbf
cp /u01/oracle/oradata/report/users01.dbf /u01/oracle/oradata/standby/users01.dbf
cp /u01/oracle/oradata/report/report_tab01.dbf /u01/oracle/oradata/standby/report_tab01.dbf
cp /u01/oracle/oradata/report/report_ind02.dbf /u01/oracle/oradata/standby/report_ind02.dbf
cp /u01/oracle/oradata/report/logmnrts.dbf /u01/oracle/oradata/standby/logmnrts.dbf
第三步:启动主库到mount状态:
SQL> startup mount;
第四步:生成一个从库使用的controlfile:
ALTER DATABASE BACKUP CONTROLFILE TO '/u01/oracle/oradata/standby/std.ctl';
第五步:开启主库的DML和DDL的限制:
ALTER SYSTEM ENABLE RESTRICTED SESSION;
第六步:生成LogMiner的数据字典:
SQL> ALTER DATABASE OPEN;
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;第七步:开启数据库的DML和DDL功能:
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;第八步:查看最后一个归档的归档日志:
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT; SQL> SELECT NAME FROM V$ARCHIVED_LOG 2> WHERE (SEQUENCE#=(SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG 3> WHERE DICTIONARY_BEGIN = 'YES' AND STANDBY_DEST= 'NO')); NAME -------------------------------------------------------------------------------- /u01/oracle/arch/1_14.dbf3. 为从库准备初始化参数文件:
SQL> CREATE PFILE='/u01/oracle/oradata/standby/initstdreport.ora' FROM SPFILE;
4. 把从库的文件copy到主库上:
[oracle@s22028 oradata]$ scp -r standby oracle@10.4.120.218:/u01/oracle/oradata
oracle@10.4.120.218's password:
system01.dbf 100% 1024MB 6.9MB/s 02:28
users01.dbf 100% 500MB 6.8MB/s 01:14
report_tab01.dbf 100% 1024MB 8.1MB/s 02:06
logmnrts.dbf 100% 25MB 8.3MB/s 00:03
report_ind02.dbf 100% 512MB 8.0MB/s 01:04
initstdreport.ora 100% 1154 1.1KB/s 00:00
undotbs01.dbf 100% 2048MB 7.9MB/s 04:21
std.ctl 100% 1592KB 1.6MB/s 00:00
5. 修改从库的配置文件:
修改之前:
*.aq_tm_processes=1
*.background_dump_dest='/u01/oracle/admin/report/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/u01/oracle/oradata/report/control01.ctl','/u01/oracle/oradata/report/control02.ctl','/u01/oracle/oradata/report/control03.ctl'
*.core_dump_dest='/u01/oracle/admin/report/cdump'
*.db_block_size=8192
*.db_cache_size=1073741824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='report'
*.fast_start_mttr_target=300
*.hash_join_enabled=TRUE
*.instance_name='report'
*.java_pool_size=200
*.job_queue_processes=10
*.large_pool_size=209715200
*.log_archive_dest_1='location=/u01/oracle/arch MANDATORY'
*.log_archive_dest_2=''
*.log_archive_start=TRUE
*.log_parallelism=1
*.open_cursors=300
*.pga_aggregate_target=209715200
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=209715200
*.sort_area_size=524288
*.standby_archive_dest='/u01/oracle/stdarch'
*.standby_file_management='AUTO'
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/oracle/admin/report/udump'
修改之后:
*.aq_tm_processes=1
*.background_dump_dest='/u01/oracle/admin/report/bdump'
*.compatible='9.2.0.0.0'
*.control_files='/u01/oracle/oradata/standby/std.ctl'
*.core_dump_dest='/u01/oracle/admin/report/cdump'
*.db_block_size=8192
*.db_cache_size=1073741824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='report'
*.fast_start_mttr_target=300
*.hash_join_enabled=TRUE
*.instance_name='stdrep'
*.java_pool_size=200
*.job_queue_processes=10
*.large_pool_size=209715200
*.log_archive_dest_1='location=/u01/oracle/arch'
*.log_archive_dest_2=''
*.log_archive_start=TRUE
*.log_parallelism=1
*.open_cursors=300
*.pga_aggregate_target=209715200
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=209715200
*.sort_area_size=524288
*.standby_archive_dest='/u01/oracle/stdarch'
*.standby_file_management='AUTO'
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/oracle/admin/report/udump'
*.lock_name_space=stdrep
注意一点:lock_name_space的名称不能超过8个字符,否则启动的时候会提示错误
6. 如果是windows环境需要创建windows service,我们这里就不介绍了
7. 配置两个数据库的监听文件
从库的监听:
#LISTENER.ORA-Network-Configuration-File: /u01/oracle/product/9207/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.4.120.218)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle/product/9207)
(PROGRAM = extproc)
)
)
主库的监听:
#LISTENER.ORA-Network-Configuration-File: /u01/oracle/product/9207/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.4.120.38)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle/product/9207)
(PROGRAM = extproc)
)
)
8. 打开Dead Connect 配置:
文件内容如下:
cat sqlnet.ora
SQLNET.EXPIRE_TIME=2
9. 配置netservicename:
这个使用过Oracle的人都知道怎么配置,就不多说了;
10. 把从库启动到mount状态:
SQL> startup mount pfile ='/u01/oracle/oradata/standby/initstdreport.ora'
ORACLE instance started.
Total System Global Area 1561926256 bytes
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/598601/viewspace-1013372/ ,如需转载,请注明出处,否则将追究法律责任。