ADG 是数据迁移最常用工具之一,也是我个人认为最简单,最省事的迁移方式。因为ADG属于物理(块)迁移,换句话说就是主库是什么样子,迁移后的数据库就是什么样子。不像其他逻辑迁移(数据泵、OGG等)需要大量时间验证数据完整性以及业务适配等问题。使用ADG迁移时,这些问题一般都不用担心。下面我们开始从单实例 —— RAC的ADG迁移。
开启归档模式
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 )
)
)
创建静态监听
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;
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 &
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;
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;
oracle用户执行(备库第一节点):
1. 检查controlfile路径
SQL> show parameter control2. pfile添加最新controlfile路径
# vi $ORACLE_HOME/dbs/initstb1.ora3. 生成spfile
SQL> create spfile='+DATADG' from pfile='$ORACLE_HOME/dbs/initstb1.ora';4. 关闭备库
SQL> shutdown immediate5. 注册集群资源
# 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 stb24. 移除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.bak5. 使用srvctl启动备库,确认配置正确
# srvctl start database -d stb6. 开启MRP
SQL> alter database recover managed standby database using current logfile disconnect;
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
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.
oracle用户执行(主库第一节点)
1. 关闭生产监听
$ lsnrctl stop
2. kill生产会话
$ ps -ef|grep LOCAL=NO|grep -v grep|grep pri|awk '{print $2}'|xargs kill -9
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;
oracle用户执行(备库第一节点)
SQL> alter database commit to switchover to primary with session shutdown;
SQL> alter database open;
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;
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;
oracle用户执行(新主库第一节点)
$ srvctl stop database -d stb
$ srvctl start database -d stb
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;