task1:收集信息准备备份:
1.在主节点,建立一个临时目录,比如
mkdir -p /opt/oracle/stage
2.在目标节点建立一个同样的目录
mkdir -p /opt/oracle/stage
3.在主节点,连接到主库,并建立一个PFILE(从现有的SPFILE),并保存到 临时目录里
SQL>create pfile='/opt/oracle/stage/initCHICAGO.ora' from spfile;
4.在主接点,建立一个主库的备份,并把所有的块放入临时目录里
rman target /
RMAN>BACKUP DEVICE TYPE DISK FORMAT '/opt/oracle/stage/%U' database plus archivelog;
RMAN>BACKUP DEVICE TYPE DISK FORMAT '/opt/oracle/stage/%U' CURRENT CONTROLFILE FOR STANDBY;
5.在主节点,对linstener.ora,tnsnames.ora,sqlnet.ora 放入临时目录。
cp
$ORACLE_HOME/network/admin/*.ora /opt/oracle/stage
6.把主节点的数据拷贝到备节点
(这步我们不需要做了,因为是通过NFS mount过来的)
task2:在备节点上 建立网络服务,
1.在standby节点,把临时的文件夹里listener.ora ,tnsnames.ora,sqlnet.ora 的数据拷贝到
所有standby的节点上。
2.修改standby 节点listener.ora参数,来保证每个 standby主机包含了 本节点的VIP地址。
3.修改standby 节点 的tnsnames.ora文件,包含主RAC 节点的内容和 STANDBY节点的内容,包含了所有主和从网络的名字。你还应该修改被 local_listener以及remote_listener参数使用的 ORACLE 网络别名参数来指向每个standby主机。下面举例,每个tnsnames.ora文件应该包含了 下面表中所有的网络服务名字。
CHICAGO=
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = chicago_host1vip)
(HOST = chicago_host2vip)
(PORT = 1521)
(CONNECT_DATA =
(SERVICE = DEDICATED)
(SERVICE_NAME = CHICAGO)
)
)
BOSTON=
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = boston_host1vip)
(HOST = boston_host2vip)
(PORT = 1521)
(CONNECT_DATA =
(SERVICE = DEDICATED)
(SERVICE_NAME = BOSTON)
)
)
task3:建立备用的实例和库
1.使能redo数据的秘密传输,请确定主库和备库之间使用了密码文件,并确定两边SYS用户的密码
是一致的。
$cd $ORACLE_HOME/dbs
$orapwd file=orapwBOSTON password=oracle
2.从临时的文件佳中,把pfile文件拷贝到standby 主机上并重新命名,语法如下
cp initCHICAGO1.ora $ORACLE_HOME/dbs/initBOSTON1.ora
3.修改(从 primary 节点上拷贝过来的) standby 的初始化参数文件,包含data guard的参数,
放在下面的table中
cluster_database = true
*.db_unique_name=CHICAGO
CHICAGO1.instance_name = CHICAGO1
CHICAGO2.instance_name = CHICAGO2
CHICAGO1.instance_number = 1
CHICAGO2.instance_number = 2
CHICAGO1.thread=1
CHICAGO2.thread=2
CHICAGO1.undo_tablespace=UNDOTBS1
CHICAGO2.undo_tablespace=UNDOTBS2
*.remote_listener=LISTENERS_CHICAGO
CHICAGO1.LOCAL_LISTENER=LISTENER_CHICAGO_HOST1
CHICAGO2.LOCAL_LISTENER=LISTENER_CHICAGO_HOST2
*.backgroup_dump_dest=
/opt/oracle/admin/CHICAGO/bdump
*.core_dump_dest=
/opt/oracle/admin/CHICAGO/cdump
*.user_dump_dest=
/opt/oracle/admin/CHICAGO/udump
*.audit_file_dest=
/opt/oracle/admin/CHICAGO/adump
*.db_recovery_dest='+RECOVERY'
*.log_archive_dest_1=
'LOCATION=+DATA/CHICAGO/'
*.dispatchers=CHICAGOXDB
修改为
cluster_database = true
*.db_unique_name=BOSTON
CHICAGO1.instance_name = BOSTON1
CHICAGO2.instance_name = BOSTON2
CHICAGO1.instance_number = 1
CHICAGO2.instance_number = 2
CHICAGO1.thread=1
CHICAGO2.thread=2
CHICAGO1.undo_tablespace=UNDOTBS1
CHICAGO2.undo_tablespace=UNDOTBS2
*.remote_listener=LISTENERS_BOSTON
CHICAGO1.LOCAL_LISTENER=LISTENER_BOSTON_HOST1
CHICAGO2.LOCAL_LISTENER=LISTENER_BOSTON_HOST2
*.log_archive_config='dg_config=(BOSTON,CHICAGO)'
*.log_archive_dest_2='service=CHICAGO
valid_for=(online_logfiles,primary_role)
db_unique_name=CHICAGO'
*.db_file_name_convert='+DATA/CHICAGO/',
'+DATA/BOSTON/','+RECOVERY/CHICAGO',
'+RECOVERY/BOSTON'
*.log_file_name_convert='+DATA/CHICAGO/',
'+DATA/BOSTON/','+RECOVERY/CHICAGO',
'+RECOVERY/BOSTON'
*.standby_file_management=auto
*.fal_server='CHICAGO'
*.fal_client='BOSTON'
*.servcie_names='BOSTON'
*.backgroup_dump_dest=
/opt/oracle/admin/BOSTON/bdump
*.core_dump_dest=
/opt/oracle/admin/BOSTON/cdump
*.user_dump_dest=
/opt/oracle/admin/BOSTON/udump
*.audit_file_dest=
/opt/oracle/admin/BOSTON/adump
*.db_recovery_dest='+RECOVERY'
*.log_archive_dest_1=
'LOCATION=USE_DB_RECOVERY_FILE_DEST'
*.dispatchers=BOSTONXDB
4.在STANDBY主机上连接到 ASM 实例,在磁盘组上建立一个文件夹,这个文件夹名字
和standby 数据库的 DB_UNIQUE_NAME 名字一样。
SQL>ALTER DISKGROUP data ADD DIRECTORY '+DATA/BOSTON';
5.从standby主机 连接到 standby 数据库上,当standby的数据库处于IDLE状态的时候,
建立一个SPFILE,这个SPFILE 位于 数据的磁盘组中
SQL>CREATE SPFILE='+DATA/BOSTON/spfileBOSTON.ora' FROM pfile='?/dbs/initBOSTON.ora';
6.在每个standby 主机上的 $ORACLE_HOME/dbs 文件夹下,建立一个 pfile,名字是
initoracle_sid.ora ,包含了一个指针指向 spfile.
举例如下:
cd $ORACLE_HOME/dbs
echo
"SPFILE='+DATA/BOSTON/spfileBOSTON.ora'">initBOSTON1.ora
7.在standby database里面建立dump文件夹(和初始化参数里面设置成一样)
mkdir -p $ORACLE_BASE/admin/BOSTON/bdump
mkdir -p $ORACLE_BASE/admin/BOSTON/cdump
mkdir -p $ORACLE_BASE/admin/BOSTON/udump
mkdir -p $ORACLE_BASE/admin/BOSTON/adump
8.当把相关的环境参数设置好了之后,(比如ORACLE_SID,ORACLE_HOME,PATH),在有临时目录
的standby 主机上启动instance.
SQL>startup nomount
9.从 刚启动 standby 实例的standby主机上,把主库的内容导入 ASM 磁盘组中。
比如
$rman target sys/oracle@CHICAGO auxiliary /
RMAN>DUPLICATE TARGET DATABASE FOR STANDBY;
10.连接到 standby的数据库上,建立standby redo日志来支持 standby的角色。
standby redo的大小必须和主库的 online 日志大小一致。建议的standby redo 日志
的数量情况如下:
(maximum # of logfiles +1)*maximum # of threads
这个例子为每个thread 使用了两个在线日志。这样的话,standby redo 日志的数量应该是
(2+1)*2.即,每一个thread 对应多一个 standby redo 日志。
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1
GROUP 5 SIZE 10M,
GROUP 6 SIZE 10M,
GROUP 7 SIZE 10M;
SQL>ALTER DATABASE ADD STANDBY LOGFILE THREAD 2
GROUP 8 SIZE 10M,
GROUP 9 SIZE 10M,
GROUP 10 SIZE 10M;
上面的句子为每个组建立了两个 standby log成员,而且每个成员大小是10M。一个成员是
通过初始化参数(DB_CREATE_FILE_DEST)里面定义的,另一个成员是通过初始化参数
(DB_RECOVERY_FILE_DEST)设定的。这个例子确保了两个threads中有两个redo log组,另一个组是
group 5.
你可以通过如下命令来检查 redo log信息的 号码和组号码。
SQL>SELECT * FROM V$LOG;
你可以通过 查询v$standby_log视图来检查前一个查询的结论。
SQL>SELECT * FROM V$STANDBY_LOG;
你也能够看到 使用查询 V$LOGFILE 视图来检查成员组。
SQL>SELECT * FROM V$LOGFILE;
11.在某一个standby主机上(这个是你指定的redo 应用实例),开始 managed recovery 和 standby 日志的实时应用。
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
(
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
USING CURRENT LOGFILE 启动real-time apply,which recovers redo from the standby redo log files as soon as they are written, without requiring them to be archived first at the physical standby database. standby的重做日志文件是standby自己产生的还是从primary接收到的?
DISCONNECT indicate that Redo Apply should be performed in the background. Doing so leaves the current session available for other tasks. The FROM SESSION keywords are optional and are provided for semantic clarity.
)
12.在 cluster的任何节点 上,做注册 数据库的实例的操作,把实例信息写入
ORACLE Cluster Registry(OCR),使用 Server Control(SRVCTL) 组建。
比如:
$srvctl add database -d BOSTON -o
/opt/oracle/product/10g_db_rac
$srvctl add instance -d BOSTON -i BOSTON1 -n boston_host1
$srvctl add instance -d BOSTON -i BOSTON2 -N boston_host2
如下是对这些命令选项的描述
-d 选项指定了 数据库的唯一名
(DB_UNIQUE_NAME)
-i 选项指定了数据库的实例名
-n 选项 描述实例在哪个节点运行。
-o 选项指定了数据库的HOME位置
使用OCR 来注册ASM 实例
$srvctl add asm -n boston_host1 -i +ASM1 -o
/opt/oracle/product/10g_db_rac -p
/opt/oracle/product/10g_db_rac/dbs/spfile+ASM1.ora
$srvctl add asm -n boston_host2 -i +ASM2 -O
/opt/oracle/product/10g_db_rac -p
/opt/oracle/product/10g_db_rac/dbs/spfile+ASM2.ora
如下是对可选项的描述
-i 命令指定了 ASM实例名,如果你的ASM实例名字是 +ASM1,需要指定+这个选项。
在crs_stat 的输出里,资源名字不会有将不包含 + 参数。
-n 选项指定了 节点名字,在该节点上,asm 实例正在运行。
-o 选想指定了ASM 实例的 home目录。
-p 选项指定了 完全合格的spfile名字。如果你选用了pfile参数,就不需要指定这个选项了。
如下的命令指定了 数据库和 asm实例的关系,如果 是一个ASM实例的话,前面要加一个 ‘+’参数。
$srvctl modify instance -d BOSTON -i BOSTON1 -s +ASM1
$srvctl modify instance -d BOSTON -i BOSTON2 -s +ASM2
$srvctl enable asm -n boston_host1 -i +ASM1
$srvctl enable asm -n boston_host1 -i +ASM2
-d 命令指定了 数据库的唯一名字(DB_UNIQUE_NAME)
-i 指定了数据库的实例名
-s 指定了ASM实例名。
从OCR的角度来看,所有的ASM实例用下面的命令
$srvctl start asm -n boston_host1
$srvctl start asm -n boston_host2
当你想用 多asm实例跑在同一个节点,只想启动某一个 ASM实例,指定下面的ASM 实例
名。
$srvctl start asm -n boston_host1 -i +ASM1
TASK4.配置主库的属性来适合DATA GUARD
1.修改主库的启动参数来支持 primary 以及standby 规则。
*.log_archive_config='dg_config=(BOSTON,CHICAGO)'
*.log_archive_dest2='service=BOSTON
valid_for=(online_logfiles,primary_role)
db_unique_name=BOSTON'
*.db_file_name_convert='+DATA/BOSTON/','+DATA/CHICAGO/',
'+RECOVERY/BOSTON','+RECOVERY/CHICAGO'
*.log_file_name_convert='+DATA/BOSTON/','+DATA/CHICAGO/',
'+RECOVERY/BOSTON','+RECOVERY/CHICAGO'
*.standby_file_management=auto
*.fal_server='BOSTON'
*.fal_client='CHICAGO'
*.service_names=CHICAGO
2.在主库上建立 standby的 redo日志。(略)
TASK5 确认 dataguard配置
1.在备用的数据库上,查询 v$ARCHIVED_LOG 视图来确认 已归档文件的存在文件。
SQL>SELECT SEQUENCE#,FIRST_TIME,NEXT_TIME FROM
V$ARCHIVED_LOG ORDER BY SEQUENCE#;
2.在主数据库上,确定如下的命令来强制一次日志切换,并对当前的日志进行归档
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
3.在备库上,查询 V$ARCHIVED_LOG视图来确认 redo 信息已经接收而且在standby 接点上
已经归档。
sql>select SEQUENCE#,FIRST_TIME,NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;