此次搭建过程主要参考:http://www.oracle-base.com/articles/11g/data-guard-setup-11gr2.php
http://www.5ienet.com/note/html/dg/index.shtml
前提:
- 两台已经装有oracle的linux机器。本次使用的是centos3_x86
- 主库上装有oracle服务及添加了一个名ora10g的实例
- 从库仅安装了oracle服务
- 为了方便,主从库oracle的安装路径完全一致。主库上的ORACLE_HOME=/u01/app/oracle
详细步骤:
主库服务设置
- 归档日志
****检查主库的实例是否为归档状态
SQL>SELECT log_mode FROM v$database;
LOG_MODE
------------------------
NOARCHIVELOG
SQL>
****如果是非归档状态,将其更换为归档状态
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP MOUNT;
SQL>ALTER DATABASE ARCHIVELOG;
SQL>ALTER DATABASE OPEN;
****启动数据库的force logging
SQL>ALTER DATABSE FORCE LOGGING; - 初始化参数
****检查db_name和db_unique_name这两个参数,这次将这两个参数都设置为ora10g
SQL>show parameter db_name;
NAME TYPE VALUE
---------------- --------------- ----------------
db_name string ora10g
SQL>show parameter db_unique_name;
NAME TYPE VALUE
---------------- --------------- ----------------
db_unique_name string ora10g
****主从库的db_name一致,可是db_unique_name不能相同,因为主从库的db-unique_name会在dg_config当作log_archive_config参数。这个例子里,将从库的db_unique_name设置为“ora10g_stby”。
SQL>ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(ORA10G,ORA10G_STBY)';
****设置合适的远程归档日志路径。这个例子里,把flash_recover_area当作本地路径,或者你自己也可以指定一个特定的路径。指定SERVICE和DB_UNIQUE_NAME为了给从库路径做参考
SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=‘SERVICE=ora10g_stby NOAFFIRM ASYNC VALID=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORA10G_STBY';
SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
****LOG_ARCHIVE_FORMAT和LOG_ARCHIVE_MAX_PROCESSES参数要合理设置,REMOTE_LOGIN_PASSWORDFILE 要设置为EXCLUSIVE。
SQL>ALTER SYSTEM SET LOG_ARCHIVE_FORMAT=‘%t_%s_%r.arc' SCOPE=SPFILE;
SQL>ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=30;
SQL>ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
****除了之前的设置,还要确保主库和备库能互换角色。为了使互换角色能正常使用,需要设置如下参数。调整*_CONVERT参数用于解释主备库文件名和路径不同的地方。****
SQL>ALTER SYSTEM SET FAL_SERVER=ORA10G_STBY;
SQL>ALTER SYSTEM SET DB_FILE_NAME_CONVERT='ORA10G_STBY','ORA10G' SCOPE=SPFILE;
SQL>ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='ORA10G_STBY','ORA10G' SCOPE=SPFILE;
SQL>ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
****记住,一些参数是不会立即生效的,所以需要重启数据库以确保他们能起作用。 - 服务设置
****主备库都需要“$ORACLE_HOME/network/admin/tnsnames.ora”文件。你可以用Network Configuration Utility(netca)或者手动创建。
****主库的tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle//network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORA10G_STBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.238)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora10g)
)
)
ORA10G =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.185)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORA10G)
)
)
****备库的tnsname.ora****
# tnsnames.ora Network Configuration File: /u01/app/oracle//network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORA10G =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.185)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORA10G)
)
)
ORA10G_STBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.238)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora10g)
)
)
- 备份主库
****如果你使用duplicate模式去创建从库,则这一步是不必要的。基于备份的duplicate,或者手动恢复,都要备份主库。
$ rman target = /
RMAN> BACKUP DATABASE PLUS ARCHIVELOG; - 生成从库的控制文件和pfile文件
****在主库同步如下命令生成备库的控制文件
SQL>ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/ora10g_stby.ctl';
****由spfile文件生成备库的参数文件。
SQL>CREATE PFILE='/tmp/iniora10g_stby.ora' FROM SPFILE;
****修改与备库有关的参数,因为备库是复制过来的,所以只需修改如下参数:
*.db_unique_name='ORA10G_STBY'
*.fal_server='ORA10G'
*.log_archive_dest_2='SERVICE=ora10g ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ORA10G'
(以上是原文翻译,不过在我实践的过程中,我的备库是值安装了oracle服务,并没有oracle实例。所以$ORACLE_HOME/admin下的某些路径会不存在,那么则需看清楚生成的iniora10g_stby.ora中存在哪些路径。如果文件中有,而备库机器实际上没有该路径的话,则需手动添加。如有不符合的路径,也许手动更改该路径或修改ora文件)
从库服务设置
- 拷贝文件
****在从库添加必要的路径
$ mkdir -p /u01/app/oracle/oradata/ORA10G
$ mkdir -p /u01/app/oracle/flash_recovery_area/ORA10G
$ mkdir -p /u01/app/oracle/admin/ORA10G/adump
****将文件从主库拷贝到从库
$ # Standby controlfile to all locations.
$ scp oracle@192.168.88.185:/tmp/ora10g_stby.ctl /u01/app/oracle/oradata/ORA10G/control01.ctl
$ cp /u01/app/oracle/oradata/ORA10G/control01.ctl /u01/app/oracle/flash_recovery_area/ORA10G/control02.ctl
$ # Archivelogs and backups
$ scp -r oracle@192.168.88.185:/u01/app/oracle/flash_recovery_area/ORA10G/archivelog /u01/app/oracle/flash_recovery_area/ORA10G
$ scp -r oracle@192.168.88.185:/u01/app/oracle/flash_recovery_area/ORA10G/backupset /u01/app/oracle/flash_recovery_area/ORA10G
$ # Parameter file.
$ scp oracle@192.168.88.185:/tmp/initORA10G_stby.ora /tmp/initORA10G_stby.ora
$ # Remote login password file.
$ scp oracle@192.168.88.185:$ORACLE_HOME/dbs/orapwORA10G $ORACLE_HOME/dbs
- 启动listener(监听程序)
****主备库的listener如下:
****主库:
# listener.ora Network Configuration File: /u01/app/oracle//network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = ora10g)
(ORACLE_HOME = /u01/app/oracle/)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
****备库:
# listener.ora Network Configuration File: /u01/app/oracle//network/admin/listener.ora
# Generated by Or
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle)
(PROGRAM = extproc)
)
(SID_DESC =
#(GLOBAL_DBNAME = ORA10G_STBY)
(ORACLE_HOME = /u01/app/oracle)
(SID_NAME = ora10g)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON
启动监听
$lsnrctl start - 恢复从库
****在备库通过修改了的pfile文件生成spfile
$export ORACLE_SID=ora10g
$sqlplus / as sysdba
SQL>CREATE SPFILE FROM PFILE='/tmp/initora10g_stby.ora';
****恢复备份的文件
$ export ORACLE_SID=ora10g
$ rman target=/
RMAN>STARTUP MOUNT;
RMAN>RESTORE DATABASE; - 添加redo日志
****添加备库的online redo logs。
SQL>ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=MANUAL;
ALTER DATABASE ADD LOGFILE ('/u01/app/oracle/oradata/ora10g/online_redo01.log') SIZE 50M;
ALTER DATABASE ADD LOGFILE ('/u01/app/oracle/oradata/ora10g/online_redo02.log') SIZE 50M;
ALTER DATABASE ADD LOGFILE ('/u01/app/oracle/oradata/ora10g/online_redo03.log') SIZE 50M;
ALTER DATABASE ADD LOGFILE ('/u01/app/oracle/oradata/ora10g/online_redo04.log') SIZE 50M;
****除了online redo logs之外,你还要生成在主备库两边都生成standby redo logs为了使它们能够进行角色转换。备库的redo logs至少和online redo log一样大
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ora10g/standby_redo01.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ora10g/standby_redo02.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ora10g/standby_redo03.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/ora10g/standby_redo04.log') SIZE 50M;
设置DG的同步
- 在备库启动同步设置
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; - 如果你需要取消同步,用如下命令
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 如果你希望的话,可以自己设置同步时间。
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCLE;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DELAY 30 DISCONNECT FROM SESSION;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCLE;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY DISCONNECT FROM SESSION;
测试日志的传输
- 在主库,检查最后的归档日志(archived redo log)和强制切换日志
SQL>ALTER SESSION SET nls_date_format='DD-MON-YYYY HH24:MI:SS';
SQL>SELECT sequence#,applied,deleted,name from v$archived_log;
SQL>ALTER SYSTEM SWITCH LOGFILE; - 在备库检查归档日志是否已经改变
SQL>SELECT sequence#,applied,deleted,name from v$archived_log;
。。。。。。。DG搭建已告一段落,可以进行正常的同步了。后面的还未实践过,暂且编写这么多
主备库的启动关闭顺序
启动顺序:先standby,后primary
关闭顺序:先primary,后standby
启动实例:
SQL>startup nomount;
SQL>alter database mount stadby database;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>alter database recover managed standby database disconnect from session
在备库启动监听
$lsnrctl start
在主库启动实例
SQL>startup
在主库启动监听
$lsnrctl start
保护模式
主库从角色装换