【数据迁移】- 单实例 to RAC的ADG

一、概述

        ADG 是数据迁移最常用工具之一,也是我个人认为最简单,最省事的迁移方式。因为ADG属于物理(块)迁移,换句话说就是主库是什么样子,迁移后的数据库就是什么样子。不像其他逻辑迁移(数据泵、OGG等)需要大量时间验证数据完整性以及业务适配等问题。使用ADG迁移时,这些问题一般都不用担心。下面我们开始从单实例 —— RAC的ADG迁移。

二、部署ADG环境
2.1 主库前提要求

开启归档模式

SQL> archive log list

如果是noarchive log模式,需要设置为归档模式

SQL> alter system set log_archive_dest_1='location=/arch';

SQL> startup mount

SQL> alter database archivelog;

设置force logging

SQL> alter database force logging;
SQL> select log_mode,force_logging from v$database; 

 创建standby logfile

## 创建redo blocksize相同,日志大小相同,每个实例至少比主库+1组数的standby log

SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl/standby01.log' SIZE 1G;

        ... ...

拷贝密码文件到备库 

# cd $ORACLE_HOME/dbs/
# scp orapwpri1 192.168.6.101:/u01/app/oracle/products/11.2.0/dbs/orapwstb1
# scp orapwpri2 192.168.6.102:/u01/app/oracle/products/11.2.0/dbs/orapwstb2

配置tns ,这步主备都要做

## 主库在oracle用户下配置tnsnames.ora,备库在grid用户下配置

pri=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pri )
    )
  )


stb=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.101)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME =pri )
    )
  )

2.2 配置备库 

 创建静态监听

grid用户执行(备库第一节点):

#cd ORACLE_HOME/network/admin/
# cp listener.ora listener.ora.bak
# vi listener.ora
添加以下内容
listener=
   (DESCRIPTION_LIST=
    (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.6.101)(PORT=1521))))
SID_LIST_listener = 
  (SID_LIST = 
   (SID_DESC =
    (ORACLE_HOME =/u01/app/oracle/products/11.2.0) 
    (SID_NAME = stb1)
    (GLOBAL_DBNAME = stb)))

 创建adump目录

# mkdir -p /u01/app/oracle/admin/stb/adump

 配置pfile,可从主库创建pfile后根据实际修改

# vi $ORACLE_HOME/dbs/initstb1.ora
*.audit_trail='FALSE'
*.compatible='11.2.0.4.0'
*.db_domain=''
*.db_files=2000
*.open_cursors=1000
*.processes=5000
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.diagnostic_dest='/u01/app/oracle'
*.cluster_database=true
*.audit_file_dest='/u01/app/oracle/admin/stb/adump'
*.db_unique_name='stb'
*.db_name='pri'
*.control_files='+DATADG'
*.db_create_file_dest='+DATADG'
*.db_create_online_log_dest_1='+DATADG'
*.log_archive_dest_1='location=+ARCHDG'
*.pga_aggregate_target=12G
*.sga_target=64G
*.remote_listener='rac-scan:1521'
*.fal_server='pri'
stb1.instance_number=1
stb2.instance_number=2
stb1.thread=1
stb2.thread=2
*.undo_retention=10800
stb1.undo_tablespace='UNDOTBS1'
stb2.undo_tablespace='UNDOTBS2'

启动到nomount,主备验证网络和密码文件是否正常

备库执行:

SQL> startup nomount 

# sqlplus sys/oracle@pri as sysdba
SQL> select instance_name, version, status, instance_role from v$instance;
SQL> select name, open_mode, force_logging, database_role from v$database;

主库执行:

# sqlplus sys/oracle@stb as sysdba
SQL> select instance_name, version, status, instance_role from v$instance;
SQL> select name, open_mode, force_logging, database_role from v$database;

2.3 开始duplicate 

duplicate复制备库,主库执行都可以

创建duplicate.sh脚本
# echo "
rman target sys/oracle@pri auxiliary sys/oracle@stb >/home/oracle/duplicate.log << EOF
run {
allocate channel ch001 type disk;
allocate channel ch002 type disk;
allocate channel ch003 type disk;
allocate auxiliary channel ch006 type disk;
allocate auxiliary channel ch007 type disk;
allocate auxiliary channel ch008 type disk;
duplicate target database for standby from active database dorecover nofilenamecheck;
}
exit;
EOF
" >> /home/oracle/duplicate.sh

后面执行duplicate,避免会话中断,注意检查主库归档删除策略
nohup sh /home/oracle/duplicate.sh 2>&1 & 

2.4 主库修改参数

SQL> alter system set log_archive_dest_10='SERVICE=stb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=stb';
SQL> alter system set log_archive_dest_state_10=defer;
SQL> alter system set log_archive_dest_state_10=enable;

2.5 备库启动mrp

SQL> alter database open;
SQL> recover managed standby database using current logfile disconnect;
SQL> select process,status,thread#,sequence#,block#,blocks from v$managed_standby;

2.6 备库注册数据库到集群

oracle用户执行(备库第一节点): 
1. 检查controlfile路径

SQL> show parameter control

2. pfile添加最新controlfile路径
# vi $ORACLE_HOME/dbs/initstb1.ora

3. 生成spfile
SQL> create spfile='+DATADG' from pfile='$ORACLE_HOME/dbs/initstb1.ora';

4. 关闭备库
SQL> shutdown immediate

5. 注册集群资源
# srvctl add database -d stb -o $ORACLE_HOME -p 'spfile路径'
# srvctl add instance -d stb -n rac1 -i stb1
# srvctl add instance -d stb -n rac2 -i stb2

4.  移除init/spfile文件
# mv $ORACLE_HOME/dbs/initstb1.ora $ORACLE_HOME/dbs/initstb1.ora.bak
# mv $ORACLE_HOME/dbs/spfilestb1.ora $ORACLE_HOME/dbs/spfilestb1.ora.bak

5.  使用srvctl启动备库,确认配置正确
# srvctl start database -d stb

6.  开启MRP
SQL> alter database recover managed standby database using current logfile disconnect;

三、主备切换
3.1  备库保留一个节点

oracle用户执行(备库第二节点)
1. 系统层面kill会话
$ ps -ef|grep LOCAL=NO|grep -v grep|grep stb2|awk '{print $2}'|xargs kill -9


2.关闭备库第二节点
$ srvctl stop instance -d stb -i stb2

3.2 检查主备库状态

1. 检查主库状态
SQL> set lines 200
SQL> select db_unique_name,database_role,switchover_status from v$database;
#主库状态正常为:to standby/session active,可以准备切换成备库

2. 检查备库状态
oracle用户执行(备库第一节点)
SQL> select process,status,thread#,sequence#,block#,blocks from v$managed_standby;

SQL> select*  from V$DATAGUARD_STATS;
#备库状态正常为:block#、blocks会实时变化,主库执行切换归档命令,sequence#会增加。主备延迟最好等于接近0.

3.3 关闭生产监听,kill连接会话

oracle用户执行(主库第一节点)
1. 关闭生产监听
$ lsnrctl stop
2. kill生产会话
$ ps -ef|grep LOCAL=NO|grep -v grep|grep pri|awk '{print $2}'|xargs kill -9

3.4 主库切换为备库

oracle用户执行(主库)
SQL> alter database commit to switchover to physical standby with session shutdown;
SQL> exit;
SQL> startup;
SQL> alter database recover managed standby database using current logfile disconnect;
SQL> select DB_UNIQUE_NAME,DATABASE_ROLE,OPEN_MODE,SWITCHOVER_STATUS from v$database;

3.5 备库切换为主库 

oracle用户执行(备库第一节点)
SQL> alter database commit to switchover to primary with session shutdown;
SQL> alter database open; 

3.6 新主库新建undotbs和thread 2 redo

oracle用户执行(主库)
1.  主库创建undotbs2
SQL> create undo tablespace undotbs2 datafile '+DATADG' size 10G;
#注意主库路径剩余空间是否足够,可先创建较小文件,切换后添加


2. 主库创建thread 2 redo
#路径、组数、大小、blocksize与thread 1保持一致
SQL> alter database add logfile thread 2 '+DATADG' size 1G;

... ...
#注意主库路径剩余空间是否足够


3、主库启用thread 2(不影响现有thread 1)
SQL> alter database enable thread 2; 

3.7 新主库应用补丁 

oracle用户执行(新主库第一节点)
1. 新主库补丁大于原主库时需执行
#11g

$cd $ORACLE_HOME/rdbms/admin
SQL> @catbundle.sql psu apply
SQL> @utlrp.sql


#19c
$cd $ORACLE_HOME/OPatch
$./datapatch -verbose


2. 验证
SQL> set lines 200
SQL> col VERSION for a10
SQL> col BUNDLE_SERIES for a20
SQL> col COMMENTS for a60
SQL> select version, id, bundle_series, comments from dba_registry_history;

 3.8 新主库重启验证

oracle用户执行(新主库第一节点)
$ srvctl stop database -d stb
$ srvctl start database -d stb

3.9 开启主备同步 

oracle用户执行(新备库第一节点)
1.开启监听
$ srvctl start listener
$ srvctl start scan_listener


#oracle用户执行(新主库第一节点)
2.新主库配置同步参数
SQL> alter system set log_archive_dest_11='SERVICE=pri LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=pri';
SQL> alter system set log_archive_dest_state_11=defer;
SQL> alter system set log_archive_dest_state_11=enable;

3.10 应用验证 

你可能感兴趣的:(#,ADG,数据库,数据迁移,adg)