ORACLE 11G R2 RAC+Mutilpath+RAW+ASM+Silent+AddNode+DG 完全安
发布时间:2020-12-12 15:30:43 所属栏目:百科 来源:网络整理
导读:################################### DG # ################################## # 这里经测试可以一次性 刷完脚本,但是不建议,操作 生产库 的话有一定 危险性 ,建议充分理解后分段刷 # 情况一:RAC + DUPLICATE + 单节点 DG(复杂,需要转换路径) # 主
###################################
DG
###################################
# 这里经测试可以一次性 刷完脚本,但是不建议,操作 生产库 的话有一定 危险性 ,建议充分理解后分段刷 # 情况一:RAC + DUPLICATE + 单节点 DG(复杂,需要转换路径) # 主节点RAC 主库配置 #修改主节点 hosts 增加一条 dg 的 ip 地址 #vim /etc/hosts /etc/hosts mv /etc/hosts /etc/hosts.bak cat > /etc/hosts <<EOF 127.0.0.1 localhost # Public IP(eth0) 192.168.1.91 rac1 192.168.1.92 rac2 192.168.1.96 dg # Public Virtual IP(eth0:1) 192.168.1.93 rac1-vip 192.168.1.94 rac2-vip # Private IP(eth1) 192.168.99.1 rac1-priv 192.168.99.2 rac2-priv # Single Client Access Name Virtua IP(eth0:2) 192.168.1.95 rac-cluster-scan EOF # 建立rac1 和 dg 的 oracle 对等( 需要 安装介质) /grid/sshsetup/sshUserSetup.sh -user oracle-hosts " rac1 dg" -advanced -exverify -confirm -noPromptPassphrase # 传送 备库 oracle 软件 环境 (主库上运行,用增加 node 的方法直接传送,以提高效率) su - oracle -c 'export IGNORE_PREADDNODE_CHECKS=Y && /u01/app/oracle/product/11.2.0/db_1/oui/bin/addNode.sh "CLUSTER_NEW_NODES={ dg}"' # 修复 主库(清除 RAC 上的 dg 节点信息,可以略过) # su - oracle -c '$ORACLE_HOME/oui/bin/runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac1,rac2}"' # 配置 网络服务名文件( 主库 和 备库 都要配,如果不想改 HOSTS 可以将 HOST 设置为对应的 IP 地址) cat > /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora << EOF primary=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST= rac1)(PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME= orcl))) standby=(DESCRIPTION=(ADDRESS= (PROTOCOL=TCP) (HOST= dg) (PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME= orclbak))) EOF # 测试 网络服务名 su -oracle-c'tnspingstandby&&tnsping primary' # 查看 CRS 资源和 数据库 状态 # su -grid-c "crs_stat -t" # su - grid -c "srvctl status database -d orcl" # 关闭 主库( 谨慎如果是生产库,要先停 监听 和 CRS ) su -grid-c "srvctl stop database -dorcl" # 更改主库 配置 su - oracle -c 'sqlplus / as sysdba' << EOF set linesize 300; set pagesize 50; -- 启动数据库至 MOUNT 状态 startup mount; -- 改变数据库为强制日志模式 alter database force logging; -- 改变数据库为归档模式 alter database archivelog; -- 开启数据库至 OPEN 模式(这里只启动了 RAC 的节点一) alter database open; -- 查看闪回区路径(如已经设置,则跳过修改。该路径为空默认为控制文件的路径,修改至 +FRA 磁盘组) -- 修改归档日志及闪回区存放路径(db_recovery_file_dest 与 log_archive_dest 冲突,官方已弃用后者) -- 官方建议将归档日志写到本地磁盘,如果共享磁盘够大的话尽量放到 ASM 里(设置 size 大小后开启) -- 如果不启用闪回日志,当出现故障转移时,你需要重建一个新的备库。(强烈建议开启闪回) show parameter db_recovery; -- alter system set db_recovery_file_dest_size=2Gsid='*'; -- alter system set db_recovery_file_dest=' +FRA ' sid='*'; --alter database flashback on; -- 切换联机日志文件 alter system switch logfile; -- 强制归档当前重做日志 --alter system archive log current; -- 增加 standbylog file(备库 用 RAM 复制数据时会自动生成) select * from v$log; -- ORACLE 要求 standby redo 要比 primary online redo 日志组多一个,每个 RAC 节点是一个 thread alter database add standbylogfile thread 1group 11size 50M,group 12size 50M,group 13size 50M; alter database add standbylogfile thread 2group 14size 50M,group 15size 50M,group 16size 50M; -- DG 相关配置( fal_client 11G 已弃用,file_name_convert 经测试只是 RMAN 复制数据用来转换路径,备库设置即可 ) alter system set fal_server= standby sid='*'; alter system set standby_file_management=AUTO sid='*'; alter system set log_archive_config='DG_CONFIG=( orcl ,orclbak)' sid='*'; alter system setlog_archive_dest_2='SERVICE= standbyLGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME= orclbak' sid='*'; -- alter system setlog_file_name_convert=('/u01/app/oracle/oradata/orclbak','+DATA/orcl/onlinelog','/u01/app/oracle/oradata/orclbak','+FRA/orcl/onlinelog')sid='*'; -- alter system setdb_file_name_convert=('/u01/app/oracle/oradata/orclbak','+DATA/orcl/datafile','+DATA/orcl/tempfile') sid='*'; -- 重启远程归档 alter system set log_archive_dest_state_2='defer' sid='*'; alter system set log_archive_dest_state_2='enable' sid='*'; EOF # 检测主库状态 su - oracle -c 'sqlplus / as sysdba' << EOF set linesize 300; set pagesize 50; -- 检测数据库 实例名称 数据库状态 归档模式 强制日志 闪回 select inst_id,name,dbid,open_mode,log_mode,force_logging,flashback_on from gv$database; -- 查看 各种数据文件存放路径 select value from v$parameter where name like '%spfile%' union select name from v$datafileunionselect name from v$controlfileunionselect member from v$logfile union select name from v$tempfile union select name from v$archived_log union select name from v$flashback_database_logfile; EOF # 单节点DG 备库配置 # 修改 IP # 修改主机名(重新登录才能看到修改结果) mv /etc/HOSTNAME /etc/HOSTNAME.bak hostnamedg hostname > /etc/HOSTNAME sysctl kernel.hostname=dg # 修改hosts 文件 # DG 节点 修改 hosts 文件 及 IP 地址 mv /etc/hosts /etc/hosts.bak cat > /etc/hosts <<EOF 127.0.0.1 localhost # Public IP(eth0) 192.168.1.91 rac1 192.168.1.96 dg EOF #用户环境变量 echo ' export TMP=/tmp export TMPDIR=$TMP export ORACLE_TERM=xterm export THREADS_FLAG=native export ORACLE_SID=dg export ORACLE_UNQNAME=orclbak export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 export PATH=/usr/sbin:$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib export LANG=zh_CN.UTF-8 export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS" export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" alias rsqlplus="rlwrap sqlplus / as sysdba" alias rrman="rlwrap rman target /" ' > /home/oracle/.bash_profile # 配置静态监听 cat > /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora<< EOF SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME= orclbak ) (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1) (SID_NAME= dg ))) LISTENER= (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=dg) (PORT=1521)))) EOF #启动监听 su -oracle-c ' lsnrctl start' # | stop | reload | status' # 配置网络服务名文件( 主库和 备库都要配,如果不想改 HOSTS 可以将 HOST 设置为对应的 IP 地址) cat > /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora << EOF primary= (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST= rac1 ) (PORT=1521) ) (CONNECT_DATA=(SERVER=DEDICATED) (SERVICE_NAME=orcl) ) ) standby= (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=dg) (PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED) (SERVICE_NAME=orclbak) ) ) EOF # 测试 网络服务名 su -oracle-c ' tnsping standby && tnsping primary ' # 清空ORACLE 软件的配置文件 rm -rf /u01/app/oracle/product/11.2.0/db_1/dbs/* # 创建密码文件(密码必须和主库相同,有说 11G 以后密码文件不能手动创建,要从主库复制,暂未遇见) su - oracle -c 'orapwd file=/u01/app/oracle/product/11.2.0/db_1/dbs/orapw dgpassword= sysforce=y' # 创建备库 数据存放文件夹 su - oracle -c 'mkdir -p /u01/app/oracle/oradata/orclbak' # 创建备库 spfile (如果只设置db_name,db_unique_name 和 service_names 会跟随 db_name。如果设置了db_name 又显式设置了 db_unique_name,那么 service_names 会跟随db_unique_name,DG 要求主库与备库的db_unique_name 必须不同) cat > /u01/app/oracle/product/11.2.0/db_1/dbs/initdg.ora <<EOF *.compatible='11.2.0.4.0' *.db_name=' orcl' *.DB_UNIQUE_NAME=' orclbak' *.remote_login_passwordfile='EXCLUSIVE' *.cluster_database=false *.FAL_SERVER=' primary ' *.standby_file_management='AUTO' *.log_archive_config='DG_CONFIG=( orcl,orclbak )' *.log_archive_dest_2='SERVICE= primaryLGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME= orcl' *.log_file_name_convert=('+DATA/orcl/onlinelog','+FRA/orcl/onlinelog','/u01/app/oracle/oradata/orclbak') *.db_file_name_convert=('+DATA/orcl/datafile','/u01/app/oracle/oradata/orclbak' ,' +DATA/orcl/tempfile ','/u01/app/oracle/oradata/orclbak' ) EOF # 修复备库(去除 RAC 信息,改为单机 ORACLE 软件,仅需要修改一次) su - oracle -c 'make -f /u01/app/oracle/product/11.2.0/db_1/rdbms/lib/ins_rdbms.mk ops_off && make -f /u01/app/oracle/product/11.2.0/db_1/rdbms/lib/ins_rdbms.mk install' #启动备库至 NOMOUNT 状态 su - oracle -c 'sqlplus / as sysdba' << EOF startup nomount pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initdg.ora'; EOF #复制数据 #这里我们使用duplicate database 在不停库状态下直接将数据复制到备库中,11g以前的版本在 RMAN 执行复制命令dupilicate时,必须在备库上存在有备份文件,即主库上备份完成后将文件拷到备库相同目录下, 但是在 11G 里一切都变的简单,只需要在复制命令后加上 FROM ACTIVE DATABASE 参数即可。如果你的主备库路径相同,需要在 DUPLICATE 命令后加上 nofilenamecheck 参数,否则会报错。 su - oracle -c 'rlwrap rmantargetsys/sys@primary1auxiliarysys/sys@standby' << EOF duplicate target database for standby from active database; EOF # 如果 RMAN 中途失败或异常终止,备库需要关闭并重新启动到 nomount 状态,不要在 RMAN 里重启数据库,会连主库也一并重启。 #检测状态(红色是关键参数,主库和备库要仔细对照,手动 sqlplus 里刷命令请去掉转义字符) su - oracle -c 'sqlplus / as sysdba' << EOF set linesize 300; set pagesize 50; --altersystemswitchlogfile; -- 查询 (节点 数据库名 scn号 保护模式 库角色 强制归档 闪回打开状态 故障切换状态) select inst_id,current_scn,protection_mode,database_role,flashback_on,open_mode,switchover_statusfrom gv$database; -- 查询 远程归档是否成功 select DESTINATION,STATUS, ERROR from V$ARCHIVE_DEST where DEST_ID<=2; -- select process,client_process,sequence#,status from v$managed_standby; -- 查询 redo log 是否一致 及 是否被应用 select THREAD#,SEQUENCE#,ARCHIVED,APPLIED,DELETED,STATUS from v$archived_log; -- 查询 各种数据文件存放路径 --select value from v$parameter where name like '%spfile%' union select name from v$datafileunionselect name from v$controlfileunionselect member from v$logfile union select name from v$tempfile union select name from v$archived_log union select name from v$flashback_database_logfile; EOF #这里对 DG 的 switchover_status状态做一个详细的说明(先将主库转为备库,然后再将备库转为主库。) #这里由于环境不同,或者 RAC 多节点情况下 可能会存在很多造成 redo log 不一致或其他未知的状态,比如主库的切换状态一直是 session active 或者 备库的切换状态一直是 not allowed,这里不用担心,先将主库转换为备库试试,可能转换完主库,备库的状态就变成可以转换的状态了。这里 session active 其实也是一种故障现象,问题一般是主库的 log 无法写到远程备库或写入很慢,一般是网络不良或 tnsnames 不通,或者 RAC 节点二没有备库地址或无法联通备库,主库的 dest_2 参数错误等等。。。 #主库:(OPEN_MODE 默认是READ WRITE状态,转换后 RAC 节点二自动关闭) # ① switchover_status 为 TO_STANDBY 就可以直接将 主库 转换为 物理备库 的状态 # alter database commit to switchover to physical standby; # startup nomount ; # alter database mount standby database; # alter database recover managed standby database disconnect from session; # ② switchover_status 为SESSIONS ACTIVE则要先关闭会话然后转换为备库 # alter database commit to switchover to physical standby with session shutdown; # startup nomount; # alter database mount standby database; # alter database recover managed standby database disconnect from session; # 备库:(OPEN_MODE 默认是 MOUNTED状态,转换之后必须重启,否则有权限问题) # ① switchover_status 为TO_PRIMARY切换的标记已经被接收到,并且应用了所有数据,可以直接转换 # alter database commit to switchover to primary; # shutdown immediate; # startup; # ② switchover_status 为SESSION ACTIVE则要先关闭会话然后转换为主库 # alter database commit to switchover to primary with session shutdown; # shutdown immediate; # startup; # ③ switchover_status 为NOT ALLOWED切换标记还没收到,此时不能 执行转换。 # 主库 其他常见状态:(都需要解决问题后才能切换) # RESOLVABLE GAP:该状态表明一个或多个备库有重做间隙。这些间隙可以从主库或其他备库中获取缺省redo后自动地修复。 # UNRESOLVABLE GAP:该状态表明一个或多个备库有重做间隙。这些间隙不可以从主库或其他备库中获取缺省redo后自动地修复。 # LOG SWITCH GAP:该状态表明一个或多个备库在最近的一次 log switch 后丢失了 redo。 # FAILED DESTINATION:该状态表明一个或多个备库在错误状态。 # 更改 protection_mode 保护模式(主备切换后,备库自动沿袭主库的保护模式) # 最大性能 ( 默认,无法同步日志时不影响主库) # ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE; # 最大高可用(无法同步日志时自动切换到最大性能,待可同步时再切换到最大保护) # ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY; # 最大保护 (无法同步日志时主库会 shutdown) # ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION; #DG的 关闭 和 启动 顺序 # 监听 关主库 再 关备库(开启相反) # 数据库 关主库 再 关备库(开启相反) # 备库 启动命令 # startup nomount; # alter database mount standby database; # alter database recover managed standby database using current logfile disconnect from session; # 以 standby 模式打开(可做查询库,但是主备切换时,备库必须是 MOUNT 状态) # alter database recover managed standby database cancel; # alter database open read only; # alter database recover managed standby database using current logfile disconnect from session; # 备库 关闭命令 # alter database recover managed standby database cancel; # shutdown immediate; # 物理备库 failover(此操作以后,原主库不再属于该 DG 中的一部分,至针对主库失效后操作) # ALTERDATABASERECOVERMANAGEDSTANDBYDATABASEFINISHFORCE; # ALTERDATABASECOMMITTOSWITCHOVERTOPRIMARY; # ALTERDATABASEOPEN; #至此,本教程暂告一段落,祝刷本愉快 ~~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |