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';

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐