ORACLE数据库迁移全流程
Oracle迁移操作
迁移场景
为什么迁移?
故障类:服务器损坏 存储损坏 机房搬迁等等 硬件的故障,提升 导致的数据库的转移操作
性能提升类:整个硬件环境进行提升 新买的服务器 或者新买的存储设备等等 整体的迁移思路与故障类一致
业务需求类:需要搭建一套测试环境/开发环境/应急环境 为灾备软件做数据初始化等等
迁移是Oracle数据库运维中 一个很重大的项目 实现一个迁移项目 通常耗时比较久
迁移前的准备:讨论迁移方式 预计的停机时间 如果迁移失败 如何回退 以及应用如何关闭 一般来说用时2~3天
迁移中的操作:根据准备的方式 进行具体操作 一般来说1个晚上左右
迁移后的验证:验证数据的转移情况和数据库运行稳定性 一般来说1个晚上左右
redo current active inactive unused
迁移会出现的类别
1.换主机 不换存储
迁移目的:cpu 内存 cpu性能差 sql语句的解析速度 内存小 buffer cache空间不足 数据频繁换入内存换出内存 物理读增多 逻辑读少
再结合监控 相关的操作系统命令
什么变:数据库的软件 网络 数据库依赖的各项文件(参数文件 归档文件 /etc/oratab 设计目录) 备份脚本
什么不变:所有数据文件
迁移的方式:1.新的服务器部署好各项内容
2.旧的服务器数据库关闭
3.将存储挂载在新的服务器
4.新的服务器上开启数据库
5.调整参数适应新的服务器
停机时间:比较短 只有一个数据库的启停时间+存储挂载
回退策略:服务器与存储都没有改动 所以可以进行回退
2.换存储 不换主机
迁移目的:I/O性能不足
什么变:数据文件改变
什么不变:操作系统的各项文件不变
迁移的方式:RMAN 导入导出
使用rman 1.先备份 把备份放在操作系统中
2.将新存储挂上服务器 关闭数据库
3.将备份恢复到新存储中
4.再开启数据库
停机时间:数据库数据量很大 restore database的时间会很长
回退策略:因为不删除旧存储的内容 所以可以回退
导入导出
1.先导出全库
2.关闭数据库
3.删除数据库
4.dbca重新创建名字一样的数据库 但是数据文件都使用新存储的
5.根据原有的数据库 在新数据库中创建一样的表空间和数据文件
6.进行全库导入
停机时间:比使用rman物理恢复要长
回退:因为删除了旧的数据库 所以不能回退
几乎不会使用导入导出实现
如果是ASM环境 可以利用重平衡方式实现
重平衡方式 只能在ASM环境中实现
不需要停机 不论是加盘 还是删盘 都应该在业务不繁忙的时候执行
3.换主机 换存储
迁移目的: 性能提升 服务器故障 业务需求
什么变:都变
什么不变:
迁移的方式:
RMAN :物理迁移 迁移速度快 可以利用归档追数据 原数据库可以不停机 不能选择迁移的对象 不支持夸版本 夸操作系统
导入导出:逻辑迁移 可以选择对象 支持夸版本 夸操作系统 如果要保证数据一致 必须停应用
最好的迁移方式:一定是能够少停机 可回退
利用RMAN实现不换主机 换存储的迁移
实验一:文件系统迁移到ASM
1、首先打开归档,确认归档路径
2、查询下数据库文件结构
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD4/PROD4/system01.dbf
/u01/app/oracle/oradata/PROD4/PROD4/sysaux01.dbf
/u01/app/oracle/oradata/PROD4/PROD4/undotbs01.dbf
/u01/app/oracle/oradata/PROD4/PROD4/users01.dbf
/u01/app/oracle/oradata/PROD4/PROD4/example01.dbf
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD4/PROD4/control01.ctl
/u01/app/oracle/oradata/PROD4/PROD4/control02.ctl
/u01/app/oracle/oradata/PROD4/PROD4/control03.ctl
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD4/PROD4/redo03.log
/u01/app/oracle/oradata/PROD4/PROD4/redo02.log
/u01/app/oracle/oradata/PROD4/PROD4/redo01.log
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD4/PROD4/temp01.dbf
3、全库做备份:open状态就可以
rman target /
RMAN> BACKUP as copy database format '+DATA';
RMAN> EXIT
4、 查看asm磁盘组中备份的控制文件的路径
RMAN> list copy of controlfile;
List of Control File Copies
===========================
Key S Completion Time Ckp SCN Ckp Time
------- - --------------- ---------- ---------------
5 A 17-MAY-16 871730 17-MAY-16
Name: +DATA/prod4/controlfile/backup.260.912089587
Tag: TAG20160517T141203
5、修改spfile文件中控制文件的路径信息
sqlplus / as sysdba
SQL> alter system set control_files='+DATA/prod4/controlfile/backup.260.91208958' scope=spfile;
SQL>shutdown immediate
SQL> startup mount;
rman target /
RMAN> catalog start with '+data';
RMAN> switch database to copy;
RMAN> recover database;
RMAN> alter database open resetlogs;
指定resetlogs,会执行下列操作:
1)将当前的在线重做日志文件归档,然后清空其内容并将日志文件序列号重置为1
2)重置控制文件中关于在线重做日志文件的元数据
3)更新数据文件和在线重做日志文件的resetlogs scn等信息
6、创建新的临时表空间文件,并删除旧的
SQL> alter tablespace temp add tempfile '+DATA' size 200M;
SQL> alter tablespace temp drop tempfile '/u01/app/oracle/oradata/PROD4/PROD4/temp01.dbf';
7、把redo添加新的成员,删除老的成员,查看原来有多少组,就添加多少成员
select member from v$logfile;
alter database add logfile member '+data' to group 1;
alter database add logfile member '+data' to group 2;
alter database add logfile member '+data' to group 3;
select group#,status,member from v$logfile;
初始化新加的logfile
SQL> alter system switch logfile;--最少执行三遍
select group#,status,member from v$logfile;--查询下日志成员状态
删除旧的logfile member(如果无法删除,说明该文件还在使用,我们可以进行手工切换之后,再删除)
SQL> select group#,members,status from v$log;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 2 CURRENT
2 2 INACTIVE
3 2 INACTIVE
SQL> alter system switch logfile;
alter database drop logfile member '/u01/app/oracle/oradata/PROD4/PROD4/redo03.log';
alter database drop logfile member '/u01/app/oracle/oradata/PROD4/PROD4/redo02.log';
alter database drop logfile member '/u01/app/oracle/oradata/PROD4/PROD4/redo01.log';
停机时间:在于数据文件恢复需要多长时间
回退策略:数据文件 控制文件 无改变 但是日志文件需要重新处理
#####################################################################################################################
实验二:旧存储创建DATA磁盘组----->新存储创建的DATA2磁盘组
因为主机不换,只换存储,为了减少停机时间,我们需要在同一台主机上重新创建一个新的实例来迁移数据
1、以copy的方式全库做备份:open状态就可以
rman target /
RMAN> BACKUP as copy database format '+DATA2';
RMAN> EXIT
2、创建一个pfile文件
sqlplus / as sysdba
SQL>create pfile from spfile;
cd $ORACLE_HOME/dbs
[oracle@edsir1p8-P4 dbs]$ mv initPROD4.ora initP4.ora
export ORACLE_SID=P4
sqlplus / as sysdba
SQL>STARTUP NOMOUNT;
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
P4 STARTED
3、 查看asm磁盘组中备份的控制文件的路径
RMAN> list backup of controlfile;
specification does not match any backup in the repository
RMAN> list copy of controlfile;
List of Control File Copies
===========================
Key S Completion Time Ckp SCN Ckp Time
------- - --------------- ---------- ---------------
5 A 17-MAY-16 871730 17-MAY-16
Name: +DATA2/prod4/controlfile/backup.260.912089587
Tag: TAG20160517T141203
4、修改spfile文件中控制文件的路径信息
sqlplus / as sysdba
SQL> alter system set control_files='+DATA2/prod4/controlfile/backup.260.91208958' scope=spfile;
SQL>STARTUP FORCE MOUNT; --报错,因为非rac环境,dbs目录下的lkPROD4 MOUNT锁文件会阻止两个实例同时 mount 在同一数据库上
我们修改下dbs下的锁文件然后再次mount P4数据库实例:
[oracle@edsir1p8-P4 dbs]$ mv lkPROD4 lkPROD4.BAK
sql>alter database mount;
5、使用rman工具进行转换迁移
rman target /
RMAN> catalog start with '+data2';
RMAN> switch database to copy;
RMAN> recover database; ---实际生产上我们可能要多次recover database;
验证下数据文件的路径是否指向新的磁盘组:
sql>select name from v$datafile
6、为验证生产库PROD4不停机的过程中,产生的增量数据不丢失,我们创建一个测试表:
sql>create table test as select dba_objects;
sql>insert into test select * from test;
sql>commit;
sql>alter system archive log current;--可多执行几遍,然后查下当行日志号
sql>archive log list;
7、rman登录到P4实例再执行recover database;
rman> recover database; --观察是否已经把刚生产的归档文件追完,如果是,那就赶紧把生产上的应用停下来。
8、停止应用后,生产数据库PROD4的数据不再发生变化,我们切几次日志,将当前redo中最新的数据生产归档,
再去P4实例做recover database;
9、在P4实例上以read only模式打开,较验P4数据库实例和PROD4数据库实例数据是否一至
sql>alter database open read only;
sql>select count(*) from test;
sql>select count(*) from test@PROD4;
10、验证迁移后的数据和迁移前数据是一致的,重启P4数据库实例,以open resetlogs 模式打开,原来的PROD4实例可以关闭
sql>startup force mount;
11、在mount状态修改日志文件位置后再OPEN:
alter database rename file '+DATA/prod4/onlinelog/group_1.264.1006321823' to '+data2/prod4/onlinelog/group_1';
alter database rename file '+DATA/prod4/onlinelog/group_2.265.1006321823' to '+data2/prod4/onlinelog/group_2';
alter database rename file '+DATA/prod4/onlinelog/group_3.266.1006321827' to '+data2/prod4/onlinelog/group_3';
+DATA/prod4/onlinelog/group_1.264.1006321823
+DATA/prod4/onlinelog/group_2.265.1006321823
+DATA/prod4/onlinelog/group_3.266.1006321827
alter database open restlogs;
8、修改临时表空间数据文件的位置:
select name from v$tempfile;
alter tablespace temp add tempfile '+data2' size 100m;
alter tablespace temp drop tempfile '+DATA/prod4/tempfile/temp.266.978502175';
11、把P4实例的spfile文件名字改回原来数据库PROD4的spfile文件名。
这样再正常启动PROD4库自动会读取迁移后控制文件 和数据文件以及日志文件。
停机时间:因为使用了伪实例 在数据库运行过程中 可以对新目录中的数据文件进行恢复 所以 本操作停机时间为 原数据库关闭 新数据库开启
回退策略:数据文件 控制文件 日志文件 都保留了 如果需要回退 修改参数文件所使用的控制文件即可
#########################################################
实验三:
使用备份集迁移到不同磁盘组(DATA2---->data3):应用场景:把生产环境的备份集恢复的测试环境,
但是测试环境的asm磁盘组的名称不同
1、在生产库上做一份全备:(所有数据文件,控制文件、归档文件)
2、把生产库的spfile文件传输到测试库
cp spfilePR0D4.ora spfileTEST.ora
3、export ORACLE_SID=TEST
sqlplus / as sysdba
sql>startup nomount;
4、恢复控制文件
rman target /
rman>restore controlfile to '+data3' from '/home/oracle/bak/prod4_ctl.bak';
5、修改参数文件
SQL>ALTER SYSTEM SET CONTROL_FILES='+DATA3/prod4/datafile/controlfile/control01_234234324234' scope=spfile;
rm -rf lkPROD4
SQl>STARTUP FORCE MOUNT;
6、恢复数据文件到不同磁盘组下:
run{
set newname for datafile '+DATA2/prod4/datafile/system.256.1006322573' to '+data3';
set newname for datafile '+DATA2/prod4/datafile/sysaux.257.1006322619' to '+data3';
set newname for datafile '+DATA2/prod4/datafile/undotbs1.259.1006322659' to '+data3';
set newname for datafile '+DATA2/prod4/datafile/users.261.1006322669' to '+data3';
set newname for datafile '+DATA2/prod4/datafile/example.258.1006322655' to '+data3';
restore database;
switch datafile all;
}
recover database;
}
7、在mount状态修改日志文件位置后再OPEN:
alter database rename file '+DATA2/prod4/onlinelog/group_1' to '+data3/prod4/onlinelog/group_1';
alter database rename file '+DATA2/prod4/onlinelog/group_2' to '+data3/prod4/onlinelog/group_2';
alter database rename file '+DATA2/prod4/onlinelog/group_3' to '+data3/prod4/onlinelog/group_3';
alter database open restlogs;
8、修改临时表空间数据文件的位置:
select name from v$tempfile;
alter tablespace temp add tempfile '+data3' size 100m;
atler tablesapce temp drop tempfile '+DATA2/datafile/tempfile234234323';
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)