Oracle数据库使用RMAN跨平台(Windows to Linux)迁移方案
  

YxY 58054人觉得有帮助

{{ttag.title}}


分享最近做的一个比较牛逼的跨操作系统单实例数据库迁移到RAC数据库的案例,绝对是良心作品。

1、  名称解释
RMAN:RMAN(Recovery Manager)是一种用于备份(backup)、还原(restore)和恢复(recover)数据库的 Oracle 工具。

冷备:数据库关闭状态时进行备份

一致性关闭数据库:数据库关闭前触发了check point,所有变动都写入到数据文件,保持数据文件处于同一scn;非强制关闭数据库,非异常关闭数据库。

CRS:Cluster Ready Service(Oracle集群就绪服务)

RAC:RAC是real application clusters的缩写,译为“实时应用集群”, 是Oracle新版数据库中采用的一项新技术,是高可用性的一种,也是Oracle数据库支持网格计算环境的核心技术。

2 、 方案说明
某公司为了保障系统能横向扩展,使用RAC架构,操作系统为Linux系统。由此需要Windows  向 Linux ASM RAC 迁移的方案。
方案主要分成4大块,分别是源端数据备份、目标端还原、还原后的调整、RAC相关参数调整,以下是对每个步骤的时间预估。预估时间前每个步骤都做了测试,业务数据约1.5T。

3、 源端备份
3.1 一致性关闭数据库
Oracle 在Windows下的redo 不支持在Linux进行还原,所以备份必须是冷备。
命令:
sqlplus / as sysdba
shutdown immediate
startup mount


3.2 创建pfile
生成pfile文件
命令:
create pfile='c:\rmanbackup\pfile.ora' from spfile;

3.3 创建备份
此处使用RMAN对数据库进行备份,以下的备份命令会进行压缩,是否使用压缩需要考虑传输速度快还是CPU压缩数据快。如果源端Windows服务器磁盘IO/CPU性能不怎么样,建议不要压缩。
命令:
rman target /

run{
allocate channel c1 type disk maxpiecesize=30G;
allocate channel c2 type disk maxpiecesize=30G;
allocate channel c3 type disk maxpiecesize=30G;
allocate channel c4 type disk maxpiecesize=30G;
allocate channel c5 type disk maxpiecesize=30G;
allocate channel c6 type disk maxpiecesize=30G;
allocate channel c7 type disk maxpiecesize=30G;
allocate channel c8 type disk maxpiecesize=30G;
allocate channel c9 type disk maxpiecesize=30G;
allocate channel c10 type disk maxpiecesize=30G;
backup as compressed backupset database tag 'dbfull' format 'c:\rmanbackup\full_%U_%T';
backup current controlfile format 'c:\rmanbackup\ctl_%U_%T';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
release channel c6;
release channel c7;
release channel c8;
release channel c9;
release channel c10;
}


3.4 修改pfile文件
将一系列目录改为linux上的对应目录,注意sga和PGA的修改,控制文件位置做好调整,调整后将RMAN备份文件、pfile文件传到linux上。
修改:
#*.audit_file_dest='C:\app\Administrator\admin\ORCL\adump'
*.audit_file_dest= "/u01/app/oracle/admin/ORCL/adump"
*.audit_trail='db'
*.compatible='11.2.0.4.0'
#*.control_files='C:\app\Administrator\oradata\ORCL\control01.ctl','C:\app\Administrator\fast_recovery_area\ORCL\control02.ctl'
*.control_files='+DATA/ORCL/controlfile/control01.ctl','+DATA/ORCL/controlfile/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='ORCL'
#*.db_recovery_file_dest='C:\app\Administrator\fast_recovery_area'
*.db_recovery_file_dest='+LOG'
#*.db_recovery_file_dest_size=4385144832
*.db_recovery_file_dest_size=512G
#*.diagnostic_dest='C:\app\Administrator'
*.diagnostic_dest="/u01/app/oracle"
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.pga_aggregate_target=2G
*.sga_max_size=3G
*.sga_target=3G

4、 目标端还原
4.1 创建路径
目标环境创建pfile中几个参数的路径:包括audit_file_dest、control_files、数据文件路径。其中audit_file_dest需要在两个节点中分别创建。
命令:
su - oracle
mkdir -p /u01/app/oracle/admin/ORCL/adump
exit
su - grid
asmcmd <<eof
mkdir +DATA/ORCL
mkdir +DATA/ORCL/controlfile
mkdir +DATA/ORCL/datafile
exit
eof
exit
chmod 777 /rmanbackup/ -R



4.2 nomount启动数据库
在节点1上启动数据库到nomount状态,如报错,根据报错排查对应错误。
命令:
su - oracle
export ORACLE_SID=ORCL1
sqlplus / as sysdba <<eof
startup nomount pfile='/rmanbackup/pfile.ora';
exit
eof


4.3 catalog 备份文件
备份文件存放的位置是记录在控制文件中的,前面做了控制文件的还原,能查询到所有的备份信息。但是记录的备份位置都是Windows的路径,此处主要做了备份的校验删除失效的备份信息,加载传输到Linux系统上的备份文件信息。其中/rmanbackup是本次演示备份文件存放的位置,根据实际情况做好调整。
命令:
rman target / <<eof
restore controlfile from '/rmanbackup/CONTROL_04UHB8EN_1_1';
sql 'alter database mount';
crosscheck backup;
delete expired backup;
yes
catalog start with '/rmanbackup/FULL_';
yes
eof


4.4 还原数据库
以下RMAN命令,会将备份还原出一个新库,set newname for database to '+DATA/ORCL/datafile/dbf_%U'指的是将数据文件指定到一个新的目录下。这里存在一个问题,数据文件名称就不再和以前一致了。
命令:
rman target / <<eof
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
allocate channel c6 type disk;
allocate channel c7 type disk;
allocate channel c8 type disk;
allocate channel c9 type disk;
allocate channel c10 type disk;
set newname for database to '+DATA/ORCL/datafile/dbf_%U';
restore database;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
release channel c6;
release channel c7;
release channel c8;
release channel c9;
release channel c10;
}
switch database to copy;
exit
eof

5、 目标端还原后的调整
5.1 创建spfile
前面启动时直接指定了pfile文件,为了方便参数调整,通过pfile创建一个spfile,保存到ASM磁盘组中,再将默认pfile的内容修改为spfile的位置。
注意,如果实例名与本方案不一样,需要注意调整实例名、路径、文件名。
命令:
sqlplus / as sysdba <<eof
alter database open resetlogs upgrade;
create spfile='+DATA/ORCL/spfileORCL.ora' from pfile='/rmanbackup/pfile.ora';
! echo "spfile=+DATA/ORCL/spfileORCL.ora" > $ORACLE_HOME/dbs/initORCL1.ora
eof

5.2 创建redo日志组
RAC数据库在启用其他节点前,需要为这个节点添加redo日志。日志的存放位置,可以根据需要做调整,为了保证节点奔溃后事物能继续,需要将redo文件存放在ASM磁盘组中。
命令:
sqlplus / as sysdba <<eof
alter database add logfile thread 1 group 11 ('+LOG') size 1024M;
alter database add logfile thread 1 group 12 ('+LOG') size 1024M;
alter database add logfile thread 1 group 13 ('+LOG') size 1024M;
alter database add logfile thread 1 group 14 ('+LOG') size 1024M;
alter database add logfile thread 1 group 15 ('+LOG') size 1024M;
alter database add logfile thread 1 group 16 ('+LOG') size 1024M;
alter database add logfile thread 1 group 17 ('+LOG') size 1024M;
alter database add logfile thread 1 group 18 ('+LOG') size 1024M;
alter database add logfile thread 2 group 21 ('+LOG') size 1024M;
alter database add logfile thread 2 group 22 ('+LOG') size 1024M;
alter database add logfile thread 2 group 23 ('+LOG') size 1024M;
alter database add logfile thread 2 group 24 ('+LOG') size 1024M;
alter database add logfile thread 2 group 25 ('+LOG') size 1024M;
alter database add logfile thread 2 group 26 ('+LOG') size 1024M;
alter database add logfile thread 2 group 27 ('+LOG') size 1024M;
alter database add logfile thread 2 group 28 ('+LOG') size 1024M;
eof


5.3 查询自动生成的redolog
查询数据库根据原Windows环境自动创建的redolog,并记住group#号。这部分日志会自动生成在$ORACLE_HOME/dbs目录下,需要删除掉。
命令:
$sqlplus / as sysdba
set lines 300
set pages 300
col member for a60


5.4 删除自动生成的redolog
前面查的是三组,这里就切3次日志。如果遇到无法删除的,再次切换日志并触发检查点操作。
命令:
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system checkpoint;
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
5.5 创建UNDO2
源库是单实例数据库时,通常只有1个undo表空间,而RAC中每个节点都需要1个UNDO表空间,所以双节点的RAC需要再加多一个UNDO表空间。
命令:
create undo tablespace UNDOTBS2 datafile '+DATA/orcl/datafile/undotbs02.dbf' size 100M AUTOEXTEND ON next 200M;

5.6 重建TEMP表空间
还原后,所有的temp表空间都需要重新创建,通过查询就能发现,其对应的文件路径还是Windows环境下的路径。
命令:
select file#, ts# ,name ,status from v$tempfile;

根据查询,确定目前有多少个临时表空间,这里只有一个。将其删除,重建。数据库的默认临时表空间是不然删除的。所以,如果只有一个表空间,就需要一个临时顶替的临时表空间。
命令:
#创建新的tempfile:
CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '+data/orcl/datafile/TEMP2.DBF' SIZE 200m AUTOEXTEND ON ;
#将新的temp表空间设置为默认表空间:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
#删除原默认temp 表空间:
drop tablespace temp;
#重新创建原temp表空间:
CREATE TEMPORARY TABLESPACE temp TEMPFILE '+data/orcl/datafile/TEMP01.DBF' SIZE 1G REUSE AUTOEXTEND ON NEXT 200M  MAXSIZE 30G;
#将数据库默认temp表空间设置为原表空间:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
#删除刚刚创建的temp2 临时表空间:
DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;


注意:上一步修改完之后, 删除temp表空间可能会宕住,需要退出再重新进sqlplus。


5.7 重新编译数据库
重新编译PLSQL代码块,并重新编译无效对象,注意不是utlrp脚本,而是使用utlirp。如果系统版本存在升级,需要根据readme.html中的要求执行脚本。如果存在新的补丁的,执行补丁对应的SQL脚本。
命令:
@?/rdbms/admin/utlirp.sql
#执行升级脚本(如果不存在版本升级,不需要执行):
#@?/rdbms/admin/catupgrd.sql


6 、 目标端RAC参数调整
6.1 修改数据库参数
经过前面一系例操作,数据库跨操作系统的问题就全部都解决了。到目前为止,接下来的操作和调整,是为了启用RAC。
命令:
startup mount force
alter system set instance_name='ORCL1' scope=spfile sid='ORCL1';
alter system set instance_name='ORCL2' scope=spfile sid='ORCL2';
alter system set instance_number=1 scope=spfile sid='ORCL1';
alter system set instance_number=2 scope=spfile sid='ORCL2';
alter system set thread=1 scope=spfile sid='ORCL1';
alter system set thread=2 scope=spfile sid='ORCL2';
alter system set undo_tablespace='UNDOTBS1' scope=spfile sid='ORCL1';
alter system set undo_tablespace='UNDOTBS2' scope=spfile sid='ORCL2';
alter system set cluster_database_instances=2 scope=spfile sid='*';
alter system set cluster_database=TRUE scope=spfile sid='*';


6.2 重新启动数据库并打开节点2
调整完后需要重启数据库。
命令:
SHUTDOWN IMMEDIATE
STARTUP
alter database enable thread 2;



6.3 编译无效对象
再次编译无效对象。
命令:
@?/rdbms/admin/utlrp.sql


6.4 添加CRS资源并测试启停数据库
操作完这一波,迁移就算完成了。注意这个操作是在oracle用户下完成,其中-d 是数据库唯一名、-p spfile、-i 实例名/SID、-n node 。
命令:
srvctl add database -d ORCL -o $ORACLE_HOME -p +DATA/orcl/spfileorcl.ora
srvctl add instance -d ORCL -i ORCL1 -n db01
srvctl add instance -d ORCL -i ORCL2 -n db02
srvctl start database -d ORCL -o open
srvctl stop database -d ORCL
srvctl start database -d ORCL -o open



6.5 创建密码文件
创建密码文件用来存放sys用户的密码,如果没有密码文件,sys用户无法通过远程连接数据库。
节点1:
命令:
orapwd file=$ORACLE_HOME/dbs/orapwdORCL1 password=oracle123
节点2:
命令:
orapwd file=$ORACLE_HOME/dbs/orapwdORCL2 password=oracle123



打赏鼓励作者,期待更多好文!

打赏
9人已打赏

cow977 发表于 2019-12-31 10:51
  
跨平台迁移,数据量大的话,停机时间太长了。

如果要用到Oracle的RAC环境,一般个人不建议使用虚拟化平台。
陈璨 发表于 2019-12-23 15:48
  
好顶赞,功力深厚
心灵鸡汤 发表于 2019-12-23 16:20
  
这个必须赞,在我眼里相当强大了
厌児 发表于 2019-12-23 18:12
  
厉害了,又学到了新技能!向楼主学习!
kevinking 发表于 2019-12-24 08:49
  
这个必须打赏
不懂就问 发表于 2019-12-24 09:12
  
这是我在社区看到的最有技术含量的帖子
司马缸砸了光 发表于 2019-12-24 09:26
  
小白表示看不懂
新手780102 发表于 2019-12-24 09:34
  
楼主真细心
新手548437 发表于 2019-12-24 09:46
  
感谢分享。
新手031815 发表于 2019-12-24 09:50
  
三人行必有我师焉呐
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
技术笔记
每周精选
干货满满
技术咨询
信服课堂视频
标准化排查
产品连连看
新版本体验
自助服务平台操作指引
安装部署配置
秒懂零信任
功能体验
GIF动图学习
玩转零信任
2023技术争霸赛专题
通用技术
技术晨报
社区帮助指南
安全攻防
每日一记
深信服技术支持平台
天逸直播
华北区交付直播
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
上网策略
测试报告
日志审计
问题分析处理
流量管理
运维工具
云计算知识
用户认证
原创分享
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
答题榜单公布
纪元平台
卧龙计划
华北区拉练
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV

本版版主

217
272
151

发帖

粉丝

关注

本版达人

皮皮虾·真

本周建议达人

郑州网络

本周分享达人

二进制网络

本周提问达人