袋鼠云技术团队 + 关注
手机版

无外网Oracle数据库迁移

  1. 云栖社区>
  2. 袋鼠云技术团队>
  3. 博客>
  4. 正文

无外网Oracle数据库迁移

持续高温 发布时间:2018-09-15 18:48:59 浏览550 评论0

摘要:         数据库迁移有多种方法可以实现,在有网络的情况下可以通过工具实现数据库迁移,简单稳定高效,而且停机时间可以控制在很短的时间甚至不需要停机。但是当没有外网的情况下就方式就比较少了,下面介绍通过Rman备份恢复的方式来迁移Oracle数据库,将停机时间最小化。

        数据库迁移有多种方法可以实现,在有网络的情况下可以通过工具实现数据库迁移,简单稳定高效,而且停机时间可以控制在很短的时间甚至不需要停机。但是当没有外网的情况下就方式就比较少了,下面介绍通过Rman备份恢复的方式来迁移Oracle数据库,将停机时间最小化。

一、收集源库信息

1、查看当前数据库的实际大小

select sum(a.bytes - b.bytes)/1024/ 1024 "sum_used MB"
   from (select tablespace_name, sum(bytes) bytes  
               from dba_data_files  
                  group by tablespace_name) a,  
           (select tablespace_name, sum(bytes) bytes  
               from dba_free_space  
                  group by tablespace_name) b  
  where a.tablespace_name = b.tablespace_name;

2、查看数据库安装目录

  ①通过.bash_profile查看ORACLE_SID、ORACLE_HOME、ORACLE_BASE的路径
  ②查看源数据库的审计文件目录
        show parameter audit
  ③查看控制文件的路径和数量、数据文件的路径
        控制文件:show parameter control
        数据文件:select name from v$datafile;
  ④查看是否开启闪回区,如果开启查看对应路径和大小
        show parameter recover
  ⑤查看归档文件路径
        show parameter log_archive_dest
  ⑥查看数据库服务器内存,目标实例配置要大于等于这个配置,否则在还原参数文件时可能会出现SGA不够的情况
        查看服务器内存:grep MemTotal /proc/meminfo
        查看SGA大小:show parameter sga

二、准备目标服务器环境

        根据上面源库的信息安装Oracle软件(不需要dbca创建数据库),需要注意的是要提前创建审计目录,在创建的时候要和源库查询出来的目录一致,同时归档日志目录、数据文件目录、闪回区的目录也一并创建完成。

三、迁移数据库

        在环境全部准备完成后,开始准备迁移数据库。迁移的策略为:迁移开始--全备--传输--恢复--增量备份--传输--增量恢复--增量归档恢复--关闭数据库--拷贝redolog--完全恢复--迁移结束。

1、源库进行0级全量备份

[oracle@vbox66 ~]$ rman target /

恢复管理器: Release 11.2.0.4.0 - Production on 星期六 9月 15 15:54:15 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

已连接到目标数据库: VBOX66DB (DBID=3269052407)

RMAN> run {
2>     allocate channel c1 device type disk;
3>     allocate channel c2 device type disk;
4>     allocate channel c3 device type disk;
5>     backup incremental level 0 database format '/u01/backup/all_db_%U.bak';
6>       }

具体选择channel可以根据数据库表空间的大小和数量,此时查看下当前数据库的日志信息,以便之后拷贝增量日志。

2、通过中间介质传输到目标服务器进行恢复

①这里我通过scp来代替中间介质传输

目标库
  scp 192.168.3.66:/u01/backup/* ./

②全备文件传输完成后首先还原参数文件

a、首先创建一个哑参,目标数据库启动到nomount状态,登录Rman恢复源库spfile

cd $ORACLE_HOME
cd dbs
vi ceshi.ora
db_name='aaa'
sqlplus / as sysdba
startup nomount pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/ceshi.ora'

b、从全备文件中还原参数文件

RMAN> restore spfile to '/u01/app/oracle/product/11.2.0/db_1/dbs/spfilevbox66in.ora' from '/u01/backup/all_db_1rtd6bac_1_1.bak';

启动 restore 于 2018-09-15 17:44:06
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=19 设备类型=DISK

通道 ORA_DISK_1: 正在从 AUTOBACKUP /u01/backup/all_db_1rtd6bac_1_1.bak 还原 spfile
通道 ORA_DISK_1: 从 AUTOBACKUP 还原 SPFILE 已完成
完成 restore 于 2018-09-15 17:44:08

RMAN> 

spfile在那个备份集中可以在源库Rman中执行list backup进行查看

③、目标实例在还原完参数文件之后还原控制文件

a、在还原控制文件之间先将以ceshi.ora参数文件启动的实例关闭,以还原的参数文件启动到nomount进行还原控制文件


shutdown immediate;
exit;
sqlplus / as sysdba
startup nomount;

b、还原控制文件


RMAN> restore controlfile from '/u01/backup/all_db_1qtd6b8b_1_1.bak';

启动 restore 于 2018-09-15 17:51:15
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=19 设备类型=DISK

通道 ORA_DISK_1: 正在还原控制文件
通道 ORA_DISK_1: 还原完成, 用时: 00:00:03
输出文件名=/u01/app/oracle/oradata/vbox66db/control01.ctl
输出文件名=/u01/app/oracle/oradata/vbox66db/control02.ctl
完成 restore 于 2018-09-15 17:51:19

RMAN> 

④、控制文件还原完成之后开始还原全备数据文件

a、控制文件还原完成将数据库启动到mount状态

SYS@vbox66in>alter database mount;

b、还原数据文件


先将备份集注册到控制文件中
RMAN> catalog start with '/u01/backup';

使用目标数据库控制文件替代恢复目录
搜索与样式 /u01/backup 匹配的所有文件

数据库未知文件的列表
=====================================
文件名: /u01/backup/all_db_1rtd6bac_1_1.bak
文件名: /u01/backup/all_db_1qtd6b8b_1_1.bak
文件名: /u01/backup/all_db_1otd6b7h_1_1.bak
文件名: /u01/backup/all_db_1ntd6b7g_1_1.bak

是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes
正在编制文件目录...
目录编制完毕

已列入目录的文件的列表
=======================
文件名: /u01/backup/all_db_1rtd6bac_1_1.bak
文件名: /u01/backup/all_db_1qtd6b8b_1_1.bak
文件名: /u01/backup/all_db_1otd6b7h_1_1.bak
文件名: /u01/backup/all_db_1ntd6b7g_1_1.bak

开始还原数据文件:


RMAN> restore database;

启动 restore 于 2018-09-15 17:57:01
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=17 设备类型=DISK

通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00006 还原到 /u01/app/oracle/oradata/vbox66db/testdb01.dbf
通道 ORA_DISK_1: 将数据文件 00007 还原到 /u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf
通道 ORA_DISK_1: 将数据文件 00008 还原到 /u01/app/oracle/oradata/vbox66db/oggtbs.dbf
通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/all_db_1ptd6b7h_1_1.bak
通道 ORA_DISK_1: 段句柄 = /u01/backup/all_db_1ptd6b7h_1_1.bak 标记 = TAG20180915T155528
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:00:35
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00001 还原到 /u01/app/oracle/oradata/vbox66db/system01.dbf
通道 ORA_DISK_1: 将数据文件 00004 还原到 /u01/app/oracle/oradata/vbox66db/users01.dbf
通道 ORA_DISK_1: 将数据文件 00009 还原到 /u01/app/oracle/oradata/vbox66db/migtbs.dbf
通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/all_db_1otd6b7h_1_1.bak
通道 ORA_DISK_1: 段句柄 = /u01/backup/all_db_1otd6b7h_1_1.bak 标记 = TAG20180915T155528
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:01:15
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00002 还原到 /u01/app/oracle/oradata/vbox66db/sysaux01.dbf
通道 ORA_DISK_1: 将数据文件 00003 还原到 /u01/app/oracle/oradata/vbox66db/undotbs01.dbf
通道 ORA_DISK_1: 将数据文件 00005 还原到 /u01/app/oracle/oradata/vbox66db/test01.dbf
通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/all_db_1ntd6b7g_1_1.bak
通道 ORA_DISK_1: 段句柄 = /u01/backup/all_db_1ntd6b7g_1_1.bak 标记 = TAG20180915T155528
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:01:45
完成 restore 于 2018-09-15 18:00:37

RMAN> 

3、对源库进行1级增量备份

①此次为模拟,在全备之后在源库进行操作模拟正常数据库工作

SYS@vbox66in>create table scott.gaowen(id int,name varchar(30));
SYS@vbox66in>insert into scott.gaowen values(1,'aaa');
SYS@vbox66in>insert into scott.gaowen values(2,'bbb');
SYS@vbox66in>insert into scott.gaowen values(3,'ccc');
SYS@vbox66in>commit;
SYS@vbox66in>alter system archive log current;
系统已更改。
SYS@vbox66in>alter system archive log current;
系统已更改。
SYS@vbox66in>alter system archive log current;
系统已更改。
SYS@vbox66in>

②进行1级增量备份

RMAN> backup incremental level 1 database format '/u01/backup/incr_db_%U.bak';

启动 backup 于 15-9月 -18
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动增量级别 1 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00002 名称=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/vbox66db/system01.dbf
输入数据文件: 文件号=00008 名称=/u01/app/oracle/oradata/vbox66db/oggtbs.dbf
输入数据文件: 文件号=00006 名称=/u01/app/oracle/oradata/vbox66db/testdb01.dbf
输入数据文件: 文件号=00007 名称=/u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf
输入数据文件: 文件号=00009 名称=/u01/app/oracle/oradata/vbox66db/migtbs.dbf
输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/vbox66db/users01.dbf
输入数据文件: 文件号=00005 名称=/u01/app/oracle/oradata/vbox66db/test01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 15-9月 -18
通道 ORA_DISK_1: 已完成段 1 于 15-9月 -18
段句柄=/u01/backup/incr_db_1std6jag_1_1.bak 标记=TAG20180915T181335 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:35
通道 ORA_DISK_1: 正在启动增量级别 1 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 15-9月 -18
通道 ORA_DISK_1: 已完成段 1 于 15-9月 -18
段句柄=/u01/backup/incr_db_1ttd6jdf_1_1.bak 标记=TAG20180915T181335 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 15-9月 -18
RMAN> 

4、通过中间介质将增量备份传输到目标实例进行恢复

①这里通过scp来模拟代替中间介质传输

scp 192.168.3.66:/u01/backup/inc* ./

②还原增量备份

a、先将备份集注册到控制文件中

RMAN> catalog start with '/u01/backup';

搜索与样式 /u01/backup 匹配的所有文件

数据库未知文件的列表
=====================================
文件名: /u01/backup/incr_db_1std6jag_1_1.bak
文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes
正在编制文件目录...
目录编制完毕

已列入目录的文件的列表
=======================
文件名: /u01/backup/incr_db_1std6jag_1_1.bak
文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

RMAN> 

b、恢复增量备份

RMAN> catalog start with '/u01/backup';

搜索与样式 /u01/backup 匹配的所有文件

数据库未知文件的列表
=====================================
文件名: /u01/backup/incr_db_1std6jag_1_1.bak
文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes
正在编制文件目录...
目录编制完毕

已列入目录的文件的列表
=======================
文件名: /u01/backup/incr_db_1std6jag_1_1.bak
文件名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

RMAN> recover database;

启动 recover 于 2018-09-15 18:22:01
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始还原增量数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
数据文件 00001 的还原目标: /u01/app/oracle/oradata/vbox66db/system01.dbf
数据文件 00002 的还原目标: /u01/app/oracle/oradata/vbox66db/sysaux01.dbf
数据文件 00003 的还原目标: /u01/app/oracle/oradata/vbox66db/undotbs01.dbf
数据文件 00004 的还原目标: /u01/app/oracle/oradata/vbox66db/users01.dbf
数据文件 00005 的还原目标: /u01/app/oracle/oradata/vbox66db/test01.dbf
数据文件 00006 的还原目标: /u01/app/oracle/oradata/vbox66db/testdb01.dbf
数据文件 00007 的还原目标: /u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf
数据文件 00008 的还原目标: /u01/app/oracle/oradata/vbox66db/oggtbs.dbf
数据文件 00009 的还原目标: /u01/app/oracle/oradata/vbox66db/migtbs.dbf
通道 ORA_DISK_1: 正在读取备份片段 /u01/backup/incr_db_1std6jag_1_1.bak
通道 ORA_DISK_1: 段句柄 = /u01/backup/incr_db_1std6jag_1_1.bak 标记 = TAG20180915T181335
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:00:15

正在开始介质的恢复

无法找到归档日志
归档日志线程=1 序列=56
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 09/15/2018 18:22:19 上) 失败
RMAN-06054: 介质恢复正在请求未知的线程 1 序列 56 的归档日志以及起始 SCN 2027595

RMAN> 

        从恢复的信息中我们可以看到数据没有完全恢复,需要增量归档日志文件。接下来需要将全备之后生成的增量日志传输到目标实例

5、传输源库增量日志到目标实例进行数据恢复

①从增量恢复信息中我们可以看到需要56号归档日志,那么就需要将56号之后的归档日志传输到目标实例,我这里通过scp代替中间介质

scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_56_974146828.dbf ./
scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_57_974146828.dbf ./
scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_58_974146828.dbf ./

②进行增量日志恢复

RMAN> recover database;

启动 recover 于 2018-09-15 18:33:38
使用通道 ORA_DISK_1

正在开始介质的恢复

归档日志文件名=/u01/app/oracle/oradata/arch/1_56_974146828.dbf 线程=1 序列=56
归档日志文件名=/u01/app/oracle/oradata/arch/1_57_974146828.dbf 线程=1 序列=57
归档日志文件名=/u01/app/oracle/oradata/arch/1_58_974146828.dbf 线程=1 序列=58
无法找到归档日志
归档日志线程=1 序列=59
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 09/15/2018 18:33:39 上) 失败
RMAN-06054: 介质恢复正在请求未知的线程 1 序列 59 的归档日志以及起始 SCN 2040040

RMAN> 

从增量日志恢复信息中可以看到还需要59号日志文件,如果此时59号文件就是当前redo log文件的话就关闭源实例数据库,将redo file文件拷贝到目标实例进行恢复,如果不是那就重复上诉步骤直到是redo file文件为止,这样就可以最小化停机时间。

③由于这里是模拟,59号文件就是当前redo file,现在关闭远视力数据库进行拷贝redo file文件到目标实例

a、源实例关闭数据库

shutdown immediate;

b、将当前redo file传输到目标实例

scp 192.168.3.66:/u01/app/oracle/oradata/vbox66db/redo* ./

6、当redo file拷贝完成后进行最后的恢复数据库

①进行恢复数据库

RMAN> recover database;

启动 recover 于 2018-09-15 18:42:00
使用通道 ORA_DISK_1

正在开始介质的恢复

线程 1 序列 59 的归档日志已作为文件 /u01/app/oracle/oradata/vbox66db/redo02.log 存在于磁盘上
归档日志文件名=/u01/app/oracle/oradata/vbox66db/redo02.log 线程=1 序列=59
介质恢复完成, 用时: 00:00:00
完成 recover 于 2018-09-15 18:42:01

RMAN> 

②以resetlogs方式打开数据库


SYS@vbox66in>alter database open resetlogs;

数据库已更改。

SYS@vbox66in>

③查看之前创建的表数据

SYS@vbox66in>select * from scott.gaowen;

    ID NAME
---------- ------------------------------
     1 aaa
     2 bbb
     3 ccc

SYS@vbox66in>

7、重建临时表空间

由于备份恢复时不备份临时表空间,所以还原之后临时表空间文件就没有,需要重建。

SYS@vbox66in>create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/vbox66db/temp02.dbf' size 10M autoextend on;
SYS@vbox66in>alter database default temporary tablespace temp2;
SYS@vbox66in>drop tablespace temp including contents and datafiles;
SYS@vbox66in>create temporary tablespace temp tempfile '/u01/app/oracle/oradata/vbox66db/temp01.dbf' size 10M autoextend on;
SYS@vbox66in>alter database default temporary tablespace temp;
SYS@vbox66in>drop tablespace temp2 including contents and datafiles;

至此数据库迁移完毕!

【云栖快讯】云栖专辑 | 阿里开发者们的第19个感悟:Simple is better.  详情请点击

网友评论