开发者社区> 持续高温> 正文

无外网Oracle数据库迁移

简介:         数据库迁移有多种方法可以实现,在有网络的情况下可以通过工具实现数据库迁移,简单稳定高效,而且停机时间可以控制在很短的时间甚至不需要停机。但是当没有外网的情况下就方式就比较少了,下面介绍通过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;

至此数据库迁移完毕!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle迁移到MySQL性能下降的注意点
背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障。在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的版本是MySQL5.1,这个版本对子查询的优化较差,导致了很多从Oracle迁移到MySQL的系统出现过性能问题,所以后面的开发规范中规定前台交易系统不要有复杂的表join。
5488 0
Oracle数据库上云利器 阿里云发布数据库迁移服务ADAM
业内首个覆盖数据全生命周期的应用与数据库迁移工具Advanced Database & Application Migration(以下简称ADAM),使得企业能够将Oracle等数据库无缝迁移上云,在云上数据库MySQL、PPAS、AnalyticDB等开展业务。
3591 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29133 0
程序从MYSQL迁移ORACLE注意事项之一
1. 自动增长的数据类型处理   MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。
593 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20693 0
Oracle迁移PPAS:中文表名的处理
Oracle迁移到RDS for PPAS(PostgreSQL)时我们会用到很多不同的工具,在中国有些用户会用 中文 作为表名,甚至字段名。迁移可能会出现ERROR: zero-length delimited identifier at or near """"的错误。针对于此,做了以下DEM.
4446 0
+关注
持续高温
你所追求的,总有一天会拥抱你!
28
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载