一、概述

本文将介绍如何给单实例搭建一个rac dg,以及如何对其进行角色转换,完成从单实例到rac的迁移。预先具备的知识(rac搭建,单实例-单实例dg搭建)

二、实验环境介绍

主库(已有数据库实例prod)
prod:192.168.56.102,sid:prod,version:11.2.0.4

从库rac(已安装rac软件,无数据库实例)
rac1:192.168.56.11,version:11.2.0.4
rac2:192.168.56.12,version:11.2.0.4

三、搭建dg

1. 主库打开归档模式,并强制写日志

先查看数据库的归档状态以及是否开启强制写日志,从下图可以看到目前数据库并没有打开归档,也没有开启强制写日志
SQL> select log_mode, force_logging from v$database;

数据库在mount状态下打开归档
[oracle@prod ~]$ mkdir -p /u01/app/oracle/oradata/prod/archivelog
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/oradata/prod/archivelog/' scope=spfile;
SQL> shutdown immediate;
SQL> startup mount; 
SQL> alter database archivelog;
SQL> alter database open;

强制日志写,数据库在open状态就能修改
SQL> alter database force logging;

再来查看数据库的归档状态以及是否开启强制写日志
SQL> select log_mode, force_logging from v$database;

2. 主库打开dataguard开关

SQL> alter system set log_archive_config='dg_config=(prod,proddg)';  # prod是主库的db_unique_name,proddg是从库的db_unique_name,这里只需要把主从环境中所有db_unique_name列出来就行,谁先谁后并不影响。

3. 主库设置远程归档

SQL> alter system set log_archive_dest_3='service=proddg valid_for=(online_logfiles,primary_role) db_unique_name=proddg';

4. 将主库的口令文件传送给从库

[oracle@prod ~]$ scp $ORACLE_HOME/dbs/orapw$ORACLE_SID 192.168.56.11:$ORACLE_HOME/dbs/orapwproddg1
[oracle@prod ~]$ scp $ORACLE_HOME/dbs/orapw$ORACLE_SID 192.168.56.12:$ORACLE_HOME/dbs/orapwproddg2

5. 从库准备参数文件

[oracle@rac1 ~]$ vi /home/oracle/pfile_initproddg1.ora  # 只在从库节点1上创建

*.audit_file_dest='/u01/app/oracle/admin/proddg/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='+DATA/PRODDG/CONTROLFILE/control01.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='prod'
*.diagnostic_dest='/u01/app/oracle'
*.log_archive_config='dg_config=(prod,proddg)'
*.log_archive_dest_2='location=+DATA/PRODDG/ARCHSTDLOG/ valid_for=(standby_logfiles,standby_role) db_unique_name=proddg'
*.memory_target=838860800
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='exclusive'
*.standby_file_management=auto
*.db_unique_name='proddg'
*.db_file_name_convert='/u01/app/oracle/oradata/prod/','+DATA/proddg/datafile/','/u01/app/oracle/oradata/prod/','+DATA/proddg/tempfile/'
*.log_file_name_convert='/u01/app/oracle/oradata/prod/','+DATA/proddg/onlinelog/'
*.cluster_database=false
proddg1.undo_tablespace='UNDOTBS1'
proddg2.undo_tablespace='UNDOTBS2'
proddg1.instance_number=1
proddg2.instance_number=2
proddg1.thread=1
proddg2.thread=2

6. 从库中准备相关目录

[oracle@oradg ~]$ mkdir -p /u01/app/oracle/admin/proddg/adump  # 从库两节点都创建

[grid@rac1 ~]$ asmcmd  # 只在从库节点1上创建
ASMCMD> lsdg
ASMCMD> cd data
ASMCMD> mkdir PRODDG
ASMCMD> cd PRODDG
ASMCMD> mkdir ARCHIVELOG
ASMCMD> mkdir ARCHSTDLOG
ASMCMD> mkdir CONTROLFILE
ASMCMD> mkdir DATAFILE
ASMCMD> mkdir ONLINELOG
ASMCMD> mkdir TEMPFILE

7. 从库生成spfile文件

[oracle@oradg ~]$ export ORACLE_SID=proddg1  # 只在从库节点1上做
[oracle@oradg ~]$ sqlplus / as sysdba
SQL> startup nomount pfile='/home/oracle/pfile_initproddg1.ora';
SQL> create spfile='+DATA/PRODDG/spfileproddg.ora' from pfile='/home/oracle/pfile_initproddg1.ora';
SQL> shutdown abort
SQL> exit

8. 从库生成pfile文件

[oracle@rac1 ~]$ echo "SPFILE='+DATA/PRODDG/spfileproddg.ora'" > $ORACLE_HOME/dbs/initproddg1.ora  # 节点1生成
[oracle@rac2 ~]$ echo "SPFILE='+DATA/PRODDG/spfileproddg.ora'" > $ORACLE_HOME/dbs/initproddg2.ora  # 节点2生成

9. 主库生成全库备份和standby controlfile并拷贝至从库节点1

[oracle@prod ~]$ export ORACLE_SID=prod
[oracle@prod ~]$ rman target /
RMAN> backup database format '/home/oracle/prod_%t_%s';
RMAN> backup current controlfile for standby format '/home/oracle/prod_control01.ctl';

[oracle@prod ~]$ scp /home/oracle/prod* 192.168.56.11:/home/oracle/backup

10. 在从库节点1启动实例,并恢复控制文件

[oracle@oradg ~]$ export ORACLE_SID=proddg1  # 只在从库节点1上做
[oracle@oradg ~]$ sqlplus / as sysdba
SQL> startup nomount

再开启一个窗口
[oracle@oradg ~]$ export ORACLE_SID=proddg1  # 只在从库节点1上做
[oracle@oradg ~]$ rman target /
RMAN> restore controlfile from '/home/oracle/backup/prod_control01.ctl';
RMAN> alter database mount;
RMAN> catalog start with '/home/oracle/backup';  # 将备份片的信息重新注册到控制文件中

11. 在从库节点1还原和恢复数据库备份

# 具体的数据文件和临时文件编号可以在主库通过dba_data_files,dba_temp_files查到
# 偶然通过实验发现一个比较神奇的现象,因为我前面在参数文件中定义了db_file_name_convert和log_file_name_convert,所以控制文件中的logfile和datafile的路径已经被转换好了,下面run中set newname for xxx其实是没必要的。
RMAN> run {
set newname for datafile 1 to '+DATA';
set newname for datafile 2 to '+DATA';
set newname for datafile 3 to '+DATA';
set newname for datafile 4 to '+DATA';
set newname for datafile 5 to '+DATA';
set newname for tempfile 1 to '+DATA';
restore database;
switch datafile all;
switch tempfile all;
}

RMAN> recover database;
以下错误可以暂时忽略,因为开启同步后,dg会自动同步归档日志

unable to find archived log
archived log thread=1 sequence=8
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 12/16/2019 15:09:48
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 8 and starting SCN of 1019774

12. 在从库节点1创建standby log

# 添加的日志的大小跟主库的onlinelog保持一致,数量多两组(主库的onlinelog信息查看v$log)
SQL> alter database add standby logfile thread 1 group 21 ('+data') size 50M;
SQL> alter database add standby logfile thread 1 group 22 ('+data') size 50M;
SQL> alter database add standby logfile thread 1 group 23 ('+data') size 50M;
SQL> alter database add standby logfile thread 1 group 24 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 25 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 26 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 27 ('+data') size 50M;
SQL> alter database add standby logfile thread 2 group 28 ('+data') size 50M;

13. 主库配置服务命名

[oracle@prod ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora

# 这里只需要指向节点1就行了

proddg =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = proddg)
)
)

14. 从库打开应用日志

SQL> alter database recover managed standby database disconnect from session;

15. 主库切换归档

SQL> alter system switch logfile;

16. 打开从库

当从库应用归档一段时间后,就关闭应用归档日志,打开从库。
SQL> alter database recover managed standby database cancel;
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect from session;

17. 验证同步

主库做修改
SQL> update scott.emp set sal=30;
SQL> commit;

从库查询
SQL> select * from scott.emp;

至此,从库rac1已经搭建完成,接下来将rac2加入进来

四、把从库节点2加入到集群中

18. 主库再添加一个undo tablespace

# 因为从库是2节点的rac,每个rac节点都需要使用自己的undo tablespace,所以主库添加的undotbs2同步到同库中,给从库节点2使用
SQL> create undo tablespace undotbs2 datafile '/u01/app/oracle/oradata/prod/undotbs02.dbf' size 1G autoextend on maxsize unlimited;

19. 在从库节点1修改数据库为rac模式

SQL> alter system set cluster_database=true scope=spfile;
SQL> alter system set cluster_database_instances=2 scope=spfile;
SQL> shutdown immediate 
SQL> startup
SQL> alter database recover managed standby database using current logfile disconnect from session;

20. 启动从库节点2

[oracle@rac2 ~]$ export ORACLE_SID=proddg2 
[oracle@rac2 ~]$ sqlplus / as sysdba
SQL> startup

21. 验证修改

主库做修改
SQL> update scott.emp set sal=40;
SQL> commit;
SQL> alter system switch logfile;

从库查询
SQL> select * from scott.emp;

22. 在从库节点1注册数据库到集群中

注册数据库
[oracle@rac1 ~]$ srvctl add database -d proddg -n prod -o /u01/app/oracle/product/11.2.0/db_1 -p +DATA/proddg/spfileproddg.ora -r physical_standby -a "DATA,OCR"
# 相关参数的意义可以通过srvctl add database -h查看
 
注册节点
[oracle@rac1 ~]$ srvctl add instance -d proddg -i proddg1 -n rac1
[oracle@rac1 ~]$ srvctl add instance -d proddg -i proddg2 -n rac2 
 
检查资源配置
[oracle@rac1 ~]$ srvctl config database -d proddg

查看数据库实例是否随集群启动自动启动
[root@rac1 ~]# crsctl status res ora.proddg.db -p

修改成随集群启动自动启动
[root@rac1 ~]# crsctl modify res "ora.proddg.db" -attr "AUTO_START=always"

至此,给单实例搭建一个rac dg就已经完成,接下来将介绍如何对其做角色切换

五、主从切换准备

23. 主库添加standby logfile归档路径

[oracle@prod ~]$ mkdir -p /u01/app/oracle/oradata/prod/archstdlog

使用sys数据库账号,修改数据库参数
SQL> alter system set log_archive_dest_2='location=/u01/app/oracle/oradata/prod/archstdlog/ valid_for=(standby_logfiles,standby_role) db_unique_name=prod' sid='*';

24. 主库添加standby logfile

[oracle@prod ~]$ mkdir -p /u01/app/oracle/oradata/prod/standbylog

添加的日志的大小跟主库的onlinelog保持一致,数量多两组(主库的onlinelog信息查看v$log)
SQL> alter database add standby logfile group 21 '/u01/app/oracle/oradata/prod/standbylog/std01.log' size 50M;
SQL> alter database add standby logfile group 22 '/u01/app/oracle/oradata/prod/standbylog/std02.log' size 50M;
SQL> alter database add standby logfile group 23 '/u01/app/oracle/oradata/prod/standbylog/std03.log' size 50M;
SQL> alter database add standby logfile group 24 '/u01/app/oracle/oradata/prod/standbylog/std04.log' size 50M;
SQL> alter database add standby logfile group 25 '/u01/app/oracle/oradata/prod/standbylog/std05.log' size 50M;
SQL> alter database add standby logfile group 26 '/u01/app/oracle/oradata/prod/standbylog/std06.log' size 50M;
SQL> alter database add standby logfile group 27 '/u01/app/oracle/oradata/prod/standbylog/std07.log' size 50M;
SQL> alter database add standby logfile group 28 '/u01/app/oracle/oradata/prod/standbylog/std08.log' size 50M;

25. 主库修改参数文件

SQL> alter system set standby_file_management=auto sid='*';
SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/prod/','+DATA/proddg/datafile/' sid='*' scope=spfile;
SQL> alter system set log_file_name_convert='/u01/app/oracle/oradata/prod/','+DATA/proddg/onlinelog/' sid='*' scope=spfile;

到这里,主库转换为备库的准备工作已完成!

26. 从库配置tnsnames.ora

这里的配置tnsnames.ora的目的是,当原从库转变为新主库之后,原主库变为新从库,新主库需要给新从库发送归档日志,所以这里的tnsnames要指向新从库。

[oracle@rac1 ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora  # rac两个节点都要设置

toprod =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = prod)
)
)

27. 从库为onlinelog设置归档路径

# 只在节点1设置即可
SQL> alter system set log_archive_dest_1='location=+DATA/proddg/archivelog/ valid_for=(online_logfiles,primary_role) db_unique_name=proddg' sid='*';

28. 从库设置远程归档参数

# 只在节点1设置即可
SQL> alter system set log_archive_dest_3='service=toprod valid_for=(online_logfiles,primary_role) db_unique_name=prod' sid='*';

到这里,从库转为主库的准备工作已完成!

六、主从切换

29. 查看主库的角色转换状态

SQL> select database_role,switchover_status from v$database;

30. 主转从

执行以下命令,将主库转为从库,并且关闭实例
SQL> alter database commit to switchover to physical standby with session shutdown;

31. 在从库节点1上从转主

由于从库是集群,在从转主的过程中,只能有一个活动节点,因此关闭从库节点2
SQL> shutdown immediate # 只关闭节点2

SQL> select database_role,switchover_status from v$database;

如果是"NOT ALLOWED"表示归档还没有应用完成,可以等待一段时间

如果日志全部应用了再查看角色转换状态
SQL> select database_role,switchover_status from v$database;

如果角色转换状态是TO PRIMARY,那么表示可以进行角色转换

执行从转主的命令,命令执行成功后,数据库的状态会变为mount
SQL> alter database commit to switchover to primary;
SQL> alter database open;

32. 打开新从库

SQL> startup

应用归档
SQL> alter database recover managed standby database using current logfile disconnect from session;

在主库节点1上切换归档
SQL> alter system switch logfile;

33. 验证同步

主库做修改
SQL> update scott.emp set sal=4000;
SQL> commit;

从库查询
SQL> select * from scott.emp;

34. 在主库节点1上为节点2添加日志文件

SQL> alter database add logfile thread 2 group 4 '+DATA/proddg/onlinelog/redo04.log' size 50M;
SQL> alter database add logfile thread 2 group 5 '+DATA/proddg/onlinelog/redo05.log' size 50M;
SQL> alter database add logfile thread 2 group 6 '+DATA/proddg/onlinelog/redo06.log' size 50M;
SQL> alter database enable thread 2;

35. 启动新主库节点2实例

SQL> startup  # 只在节点2上操作

36. 错误处理

如果发现日志传不到备库的话可以在主库通过以下命令查看错误原因

SQL> select dest_id,dest_name,log_sequence,status,error from v$archive_dest;

如果报上面的错误的话,可以把归档开关重启一下即可
SQL> alter system set log_archive_dest_state_3='defer' sid='*';
SQL> alter system set log_archive_dest_state_3='enable' sid='*';

七、总结

1. dg的切换需要停掉所有的应用,并把数据库的所有连接全部kill掉,账号全锁(此举是为了防止切换过程中有其它用户登录数据库),切换完成后再解锁
2. rac在切换时,只留一个活的实例,其它全部关闭
3. 命令每执行一条,就留意返回的结果,并实时查看alert.log
4. 由于篇幅限制,文章没有展示每步运行的结果。所以文章只是提供一个思路,具体步骤还需要根据自己库的实际情况来

Oracle - 通过dg,完成单实例到rac的迁移的更多相关文章

  1. DataGuard 单实例到RAC搭建

    背景简介: 本文为针对一次windows平台RAC数据库迁移至Linux平台RAC的笔记,基本步骤为: 1.搭建windows RAC到Linux 单实例数据库的DataGuard 2.做switch ...

  2. Oracle 归档开启切换和归档日志删除(单实例和RAC)

    Oracle默认安装后,是没有开启归档模式的,需要手动开启. 开启归档--单实例如果archive log模式下不能正常startup,则先恢复成noarchive log,startup成功后,再s ...

  3. oracle rac与单实例DG切换

    1.主库查看状态(RAC库) SQL> select database_role,switchover_status from v$database; DATABASE_ROLE SWITCHO ...

  4. Oracle 单实例 迁移到 RAC 实例 -- 使用RMAN 异机恢复

    Oracle 官网有关单实例迁移到RAC的一个步骤说明: How to Convert 10g Single-Instance database to 10g RAC using Manual Con ...

  5. 【RAC】将单实例备份集恢复为rac数据库

    [RAC]将单实例备份集恢复为rac数据库 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识, ...

  6. oracle 11g r2 rac到单实例的dg

    oracle 11g r2 rac到单实例的dg 1 主备环境说明 rac环境--primary CentOS release 6.5 (Final)hostname rac1 rac2ip 10.* ...

  7. Oracle - 给rac创建单实例dg,并做主从切换

    一.概述 本文将介绍如何给rac搭建单节点的dg,以及如何对其进行角色转换.预先具备的知识(rac搭建,单实例-单实例dg搭建) 二.实验环境介绍 主库rac(已安装rac,并已有数据库orcl)ra ...

  8. oracle rac切换到单实例DG后OGG的处理

    在RAC切换到单实例DG后,将OGG目录复制过去,在使用alter extract ext_name,begin now的时候报错 2016-04-10 11:27:03 WARNING OGG-01 ...

  9. oracle rac搭建单实例DG步骤(阅读全篇后再做)

    环境介绍 主库: 主机名 rac01 rac02 实体IP 10.206.132.232 10.206.132.233 私有IP 192.168.56.12 192.168.56.13 虚拟IP 10 ...

随机推荐

  1. nyoj 53-不高兴的小明 (遍历)

    53-不高兴的小明 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:28 submit:89 题目描述:    小明又出问题了.妈妈认为聪明的小明应该 ...

  2. nyoj 47-过河问题 (贪心)

    47-过河问题 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:2 submit:5 题目描述: 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的 ...

  3. 【Java】面向对象之多态

    生活中,比如动物中跑的动作,小猫.小狗和大象,跑起来是不一样的.再比如飞的动作,昆虫.鸟类和飞机,飞起来也是不一样的.可见,同一类的事物通过不同的实际对象可以体现出来的不同的形态.多态,描述的就是这样 ...

  4. 关于log4j

    搭建完maven+SpringMVC以后,我们还需要添加日志功能,方便记录应用在应用中产生的日志信息. 1.添加依赖包:依赖中除了对slf4j依赖外还有对邮件插件的依赖.当遇到报错的时候可以发送邮件到 ...

  5. java多线程,多线程加锁以及Condition类的使用

    看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这 ...

  6. mac中安装Jenkins+jdk

    Jenkins是基于Java开发的一种持续集成工具,用于持续的软件版本发布/测试项目,并监控外部调用执行的工作.简单来说就是自动化测试+部署. 首先我们需要安装jdk,注意,目前jenkins只支持j ...

  7. 理解Redis持久化

    本文首发于:https://mp.weixin.qq.com/s/WVUGWuNrGoyY_7aDf7NNmA 微信公众号:后端技术指南针 0.前言 通俗讲持久化就是将内存中的数据写入非易失介质中,比 ...

  8. python容器类型字典的操作

    字典(dict):由大括号进行描述一组键值对,其键值对之间使用冒号隔开,键值对与键值对之间使用逗号隔开: 注意:字典的key可以为数字,但是不可以重复,因为key是唯一标识符: 1.声明一个字典:语法 ...

  9. vue—自定义指令

    今日分享—自定义指令 需要学习的点: modifiers属性的具体实例就是v-on:click.stop=”handClick” 一样,为指令添加一个修饰符. 全局指令:新建一个newDir.js i ...

  10. DDCTF2019 的四道题wp

    MIsc:流量分析 这道题,在比赛的时候就差个key了,但是没想到要改高度,后来群里师傅说了下,就再试试, 导出来改高度. 导出来,把 把%5c(4)前面的hex删掉,改成png,就直接拿去那个img ...