Oracle 使用RMAN COPY 移动 整个数据库 位置 示例

一.数据迁移说明

在DBA的工作中会遇到数据迁移的情况,比如将本地磁盘迁移到ASM,亦或者需要更换存储设备,那么我就需要迁移整个数据库的存储位置。

如果只是移动表空间或者数据文件,我们可以将表空间或者数据文件offline 之后,移动位置,在用alter database rename 和alter tablespace rename 来将位置的变化写入控制文件即可。

(1)按数据文件来:

1.先将相应的数据文件 offline

ALTER DATABASE DATAFILE ‘D:/ORACLE/ORADATA/DBA/TEST01.DBF‘ OFFLINE;

2.把数据文件 copy 到新位置

3. alter database rename file ‘D:/ORACLE/ORADATA/DBA/TEST01.DBF‘ to ‘D:/TEST01.DBF‘;

4. 介质恢复(offline 数据文件必须要介质恢复)

recover datafile ‘D:/TEST01.DBF‘

5. 将相应的数据文件 online

SQL>ALTER DATABASE DATAFILE ‘D:/TEST01.DBF‘ ONLINE;

 

(2)按表空间来:

1.先将相应的表空间 offline

SQL>alter tablespace test offline;

2.把数据文件 copy 到新位置

3. alter tablespace TEST  rename datafile ‘D:/TEST01.DBF‘ to ‘D:/ORACLE/ORADATA/DBA/TEST01.DBF‘

4. 将表空间 online

SQL>alter tablespace test online;

ALTERDATABASE 与 ALTERTABLESPACE OFFLINE的区别

http://blog.csdn.net/tianlesoftware/article/details/4898800

在这里我们演示一下使用RMAN copy迁移整个数据库的操作。 这个操作数据库必须在mount 状态下进行。

二.在Mount 状态下转移整个数据库

如果只是移动数据文件,操作还是比较简单的,步骤和第一节里讲的类似,仅仅是数据库变成了mount状态,我们不需要去offline表空间或者数据文件而已。

如果是整库的转移,我们还需要考虑如下文件位置转移: 数据文件,undo ,Temp,Redo 和控制文件。

1. 移动数据文件位置

1.查看datafile 位置:

SQL> set lin 120

SQL>col file_name for a70

SQL>select file_name from dba_data_files

2 union all

3 select file_name from dba_temp_files;

FILE_NAME

----------------------------------------------------------------------

/u01/app/oracle/oradata/dave/users01.dbf

/u01/app/oracle/oradata/dave/undotbs01.dbf

/u01/app/oracle/oradata/dave/sysaux01.dbf

/u01/app/oracle/oradata/dave/system01.dbf

/u01/app/oracle/oradata/dave/example01.dbf

/u01/app/oracle/oradata/dave/temp01.dbf

6 rows selected.

2.创建一个新目录,用来存放数据文件:

[[email protected] oradata]$ pwd

/u01/app/oracle/oradata

[[email protected] oradata]$ mkdir -p/u01/app/oracle/oradata/anqing

[[email protected] oradata]$ ls

anqing dave

3.编写RMAN 脚本:Rcopy.sh:

这里的copy可以直接敲命令,如果数据文件很多的话,还是建议用脚本,后台来跑。因为这样不会因为连接中断而出现问题,操作也会更安全一些。

#!/bin/ksh

export LANG=en_US

RMAN_LOG_FILE=${0}.out

ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

export ORACLE_HOME

RMAN=$ORACLE_HOME/bin/rman

export RMAN

ORACLE_SID=dave

export ORACLE_SID

ORACLE_USER=oracle

export ORACLE_USER

echo "ORACLE_SID:$ORACLE_SID">>$RMAN_LOG_FILE

echo"ORACLE_HOME:$ORACLE_HOME">>$RMAN_LOG_FILE

echo"ORACLE_USER:$ORACLE_USER">>$RMAN_LOG_FILE

echo"==========================">>$RMAN_LOG_FILE

chmod 666 $RMAN_LOG_FILE

$RMAN nocatalog TARGET / msglog$RMAN_LOG_FILE append <<EOF

run

{

allocate channel c1 type disk;

allocate channel c2 type disk;

copy datafile‘/u01/app/oracle/oradata/dave/users01.dbf‘ to ‘/u01/app/oracle/oradata/anqing/users01.dbf‘;

copy datafile‘/u01/app/oracle/oradata/dave/undotbs01.dbf‘ to‘/u01/app/oracle/oradata/anqing/undotbs01.dbf‘;

copy datafile‘/u01/app/oracle/oradata/dave/sysaux01.dbf‘ to‘/u01/app/oracle/oradata/anqing/sysaux01.dbf‘;

copy datafile ‘/u01/app/oracle/oradata/dave/system01.dbf‘to ‘/u01/app/oracle/oradata/anqing/system01.dbf‘;

copy datafile‘/u01/app/oracle/oradata/dave/example01.dbf‘ to‘/u01/app/oracle/oradata/anqing/example01.dbf‘;

copy datafile ‘/u01/app/oracle/oradata/dave/temp01.dbf‘ to ‘/u01/app/oracle/oradata/anqing/temp01.dbf‘;

/u01/app/oracle/oradata/dave/users01.dbf

release channel c2;

release channel c1;

}

EOF

echo >> $RMAN_LOG_FILE

exit

--赋执行权限:

[[email protected] u01]$ chmod 755 rcopy.sh

4.将DB 启动到mount 状态:

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area  818401280 bytes

Fixed Size                  2232800 bytes

Variable Size             490737184 bytes

Database Buffers          322961408 bytes

Redo Buffers                2469888 bytes

Database mounted.

5.执行rman copy 脚本:

[[email protected] u01]$ nohup sh /u01/rcopy.sh>rcopy.out 2>&1 &

[1] 5249

[[email protected] u01]$ jobs

[1]+ Running                 nohup sh/u01/rcopy.sh > rcopy.out 2>&1 &

[[email protected] u01]$ jobs

[1]+ Done                    nohup sh/u01/rcopy.sh > rcopy.out 2>&1

--确认拷贝:

[[email protected] anqing]# ls -lh

total 1.7G

-rw-r----- 1 oracle oinstall 347M Sep 1201:27 example01.dbf

-rw-r----- 1 oracle oinstall 571M Sep 12 01:25sysaux01.dbf

-rw-r----- 1 oracle oinstall 721M Sep 1201:26 system01.dbf

-rw-r----- 1 oracle oinstall  96M Sep 12 01:24 undotbs01.dbf

--注意,这里的temp数据文件并没有copy成功,这个后面在说明.

6. rename 数据文件

还是使用后台操作,脚本rename.sh如下:

#!/bin/ksh

sqlplus / as sysdba<< EOF

alter database rename file‘/u01/app/oracle/oradata/dave/users01.dbf‘ to ‘/u01/app/oracle/oradata/anqing/users01.dbf‘;

alter database rename file‘/u01/app/oracle/oradata/dave/undotbs01.dbf‘ to‘/u01/app/oracle/oradata/anqing/undotbs01.dbf‘;

alter database rename file‘/u01/app/oracle/oradata/dave/sysaux01.dbf‘ to‘/u01/app/oracle/oradata/anqing/sysaux01.dbf‘;

alter database rename file‘/u01/app/oracle/oradata/dave/system01.dbf‘ to‘/u01/app/oracle/oradata/anqing/system01.dbf‘;

alter database rename file‘/u01/app/oracle/oradata/dave/example01.dbf‘ to‘/u01/app/oracle/oradata/anqing/example01.dbf‘;

exit

EOF

--给执行权限:

[[email protected] u01]$ chmod 755 rename.sh

[[email protected] u01]$ nohup sh rename.sh >rename.out 2>&1 &

7. open 数据库验证

SQL> set lin 120

SQL> col file_name for a70

SQL> select file_name fromdba_data_files

2  union all

3  select file_name fromdba_temp_files;

FILE_NAME

----------------------------------------------------------------------

/u01/app/oracle/oradata/anqing/users01.dbf

/u01/app/oracle/oradata/anqing/undotbs01.dbf

/u01/app/oracle/oradata/anqing/sysaux01.dbf

/u01/app/oracle/oradata/anqing/system01.dbf

/u01/app/oracle/oradata/anqing/example01.dbf

/u01/app/oracle/oradata/dave/temp01.dbf

6 rows selected.

注意这里的temp 表空间,还在原来位置。下面我们来处理temp datafile。

8. 对Temp datafile 处理

我们在第五步copy了temp file,但是实际上并没有copy成功。 RMAN copy 的错误如下:

Starting backup at 12-SEP-12

released channel: c1

released channel: c2

RMAN-00571:===========================================================

RMAN-00569: =============== ERROR MESSAGESTACK FOLLOWS ===============

RMAN-00571:===========================================================

RMAN-03002: failure of backup command at09/12/2012 01:27:20

RMAN-20201: datafile not found in therecovery catalog

RMAN-06010: error while looking updatafile: /u01/app/oracle/oradata/dave/temp01.dbf

RMAN 在备份的时候也不会备份备份locally managed 的tempfiles。原因如下:

1. Locally managed tempfiles are always setto NOLOGGING mode. So thus will have no undo.

2. Extents are managed by bitmap in each datafile to keep track of free or usedstatus of blocks in that datafile.

3. The data dictionary does not manage the tablespace.

4. Rollback information is not generated because there is no update on the datadictionary.

5. Media recovery does not recognize tempfiles.

所以我们这里在copy 数据文件时,不需要copy 临时表空间。只需要在copy 结束后给临时表空间添加一个数据文件,然后把原来目录下的临时文件drop 掉即可。这个是必须的操作,步骤如下:

--这个操作必须在dbopen 状态下执行:

SQL> alter tablespace temp add tempfile‘/u01/app/oracle/oradata/anqing/temp01.dbf‘ size 500M autoextend off;

Tablespace altered.

SQL> alter tablespace temp drop tempfile‘/u01/app/oracle/oradata/dave/temp01.dbf‘;

Tablespace altered.

SQL>

在次验证:

SQL> set lin 120

SQL> col file_name for a70

SQL> select file_name fromdba_data_files

2  union all

3  select file_name fromdba_temp_files;

FILE_NAME

----------------------------------------------------------------------

/u01/app/oracle/oradata/anqing/users01.dbf

/u01/app/oracle/oradata/anqing/undotbs01.dbf

/u01/app/oracle/oradata/anqing/sysaux01.dbf

/u01/app/oracle/oradata/anqing/system01.dbf

/u01/app/oracle/oradata/anqing/example01.dbf

/u01/app/oracle/oradata/anqing/temp01.dbf

6 rows selected.

这次数据文件全部转移成功,只要不进错目录,我们就可以大胆的rm掉之前的数据文件了。

Oracle 控制文件

http://blog.csdn.net/tianlesoftware/article/details/4974440

Oracle Temp 临时表空间

http://blog.csdn.net/tianlesoftware/article/details/4697417

9. 处理Redo log file:

1.      查看Redo 信息:

SQL> set lin 120

SQL> col member for a60

SQL> select group#,type, member fromv$logfile;

GROUP# TYPE    MEMBER

---------- -------------------------------------------------------------------

3 ONLINE /u01/app/oracle/oradata/dave/redo03.log

2 ONLINE  /u01/app/oracle/oradata/dave/redo02.log

1 ONLINE /u01/app/oracle/oradata/dave/redo01.log

SQL> selectgroup#,thread#,archived,status, bytes/1024/1024 from v$log;

GROUP#    THREAD# ARC STATUS           BYTES/1024/1024

---------- ---------- --- -------------------------------

1          1 NO  CURRENT                       50

2          1 NO  INACTIVE                      50

3          1 NO  INACTIVE                      50

SQL> select b.group# , b.status ,a.member from v$logfile a , v$log b where a.group# = b.group# order by 1;

GROUP# STATUS           MEMBER

---------- ----------------------------------------------------------------------------

1 CURRENT         /u01/app/oracle/oradata/dave/redo01.log

2 INACTIVE        /u01/app/oracle/oradata/dave/redo02.log

3 INACTIVE        /u01/app/oracle/oradata/dave/redo03.log

我们这里的处理方法很简单,给每个group 添加一个redo logfile,然后把旧目录下的logfile drop掉即可。 当然也可以添加几个新组,在把旧组drop掉。

注意的是,我们只能drop inactive 和unused 状态的log file,其他状态不能drop。

操作如下:

--先给每组加个成员:

SQL> alter database add logfile member‘/u01/app/oracle/oradata/anqing/redo01.log‘ to group 1;

Database altered.

SQL> alter database add logfile member‘/u01/app/oracle/oradata/anqing/redo02.log‘ to group 2;

Database altered.

SQL> alter database add logfile member‘/u01/app/oracle/oradata/anqing/redo03.log‘ to group 3;

Database altered.

--验证:

SQL> select b.group# , b.status ,a.member from v$logfile a , v$log b where a.group# = b.group# order by 1;

GROUP#STATUS           MEMBER

---------- ----------------------------------------------------------------------------

1 CURRENT         /u01/app/oracle/oradata/dave/redo01.log

1 CURRENT         /u01/app/oracle/oradata/anqing/redo01.log

2 INACTIVE        /u01/app/oracle/oradata/anqing/redo02.log

2 INACTIVE        /u01/app/oracle/oradata/dave/redo02.log

3 INACTIVE        /u01/app/oracle/oradata/anqing/redo03.log

3 INACTIVE        /u01/app/oracle/oradata/dave/redo03.log

6 rows selected.

2.      Drop 旧目录的log file:

这里group 1是ACTIVE,我们不能drop,所以我们先drop 2和3,然后switch logfile,在drop group 1。

SQL> ALTER DATABASE DROP LOGFILE MEMBER ‘/u01/app/oracle/oradata/dave/redo03.log‘;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE MEMBER‘/u01/app/oracle/oradata/dave/redo02.log‘;

Database altered.

SQL> ALTER DATABASE DROP LOGFILE MEMBER‘/u01/app/oracle/oradata/dave/redo01.log‘;

ALTER DATABASE DROP LOGFILE MEMBER‘/u01/app/oracle/oradata/dave/redo01.log‘

*

ERROR at line 1:

ORA-01609: log 1 is the current log forthread 1 - cannot drop members

ORA-00312: online log 1 thread 1:‘/u01/app/oracle/oradata/dave/redo01.log‘

ORA-00312: online log 1 thread 1:‘/u01/app/oracle/oradata/anqing/redo01.log‘

SQL> alter system switch logfile;

System altered.

SQL> ALTER DATABASE DROP LOGFILE MEMBER‘/u01/app/oracle/oradata/dave/redo01.log‘;

Database altered.

--验证:

SQL> select b.group# , b.status , a.memberfrom v$logfile a , v$log b where a.group# = b.group# order by 1;

GROUP# STATUS           MEMBER

---------- ----------------------------------------------------------------------------

1 ACTIVE          /u01/app/oracle/oradata/anqing/redo01.log

2 CURRENT         /u01/app/oracle/oradata/anqing/redo02.log

3 INACTIVE        /u01/app/oracle/oradata/anqing/redo03.log

到这里,redo log 也ok了。还差最后一个,控制文件。

10. 处理控制文件

控制文件的处理很简单,将库shutdown,然后把控制文件copy 到新位置,修改一下pfile参数就ok了。

这里要注意控制文件存放位置问题:

*.control_files=‘/u01/app/oracle/oradata/dave/control01.ctl‘,‘/u01/app/oracle/fast_recovery_area/dave/control02.ctl‘

这里是Oracle 11g的配置,这里的控制文件只有2个,其中一个在FRA目录下。 而在Oracle 10g中,会有三个控制文件,他们都在一个目录下面。

SQL> create pfile from spfile;

File created.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

[[email protected] dave]$ ls

control01.ctl  redo01.log redo03.log    system01.dbf   users01.dbf

example01.dbf  redo02.log sysaux01.dbf  undotbs01.dbf

[[email protected] dave]$ cp control01.ctl../anqing

[[email protected] dave]$ cd ..

[[email protected] oradata]$ cd anqing

[[email protected] anqing]$ ls

control01.ctl  redo01.log redo03.log    system01.dbf  undotbs01.dbf

example01.dbf  redo02.log sysaux01.dbf  temp01.dbf    users01.dbf

SQL> create spfile frompfile=‘/u01/app/oracle/product/11.2.0/db_1/dbs/initdave.ora‘;

File created.

SQL> startup

ORACLE instance started.

Total System Global Area  818401280 bytes

Fixed Size                  2232800 bytes

Variable Size             490737184 bytes

Database Buffers          322961408 bytes

Redo Buffers                2469888 bytes

Database mounted.

Database opened.

SQL> show parameter control_files

NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

control_files                        string      /u01/app/oracle/oradata/anqing

/control01.ctl, /u01/app/oracl

e/fast_recovery_area/dave/cont

rol02.ctl

至此,整个使用RMAN copy 转移整个数据库操作结束。 现在我们可以大胆的rm 掉之前的目录了。

[[email protected] oradata]$ pwd

/u01/app/oracle/oradata

[[email protected] oradata]$ ls

anqing dave

[[email protected] oradata]$ rm -rf dave

[[email protected] oradata]$ ls

anqing

转:http://www.cnblogs.com/tianlesoftware/archive/2012/03/07/3609339.html

时间: 2024-08-28 22:17:32

Oracle 使用RMAN COPY 移动 整个数据库 位置 示例的相关文章

使用RMAN工具克隆生产数据库

一.概述 复制数据库即使用RMAN工具的DUPLICATE命令从源数据库拷贝所有或者一部分的数据到目标数据库.复制数据库技术在多种场景都是特别有用的,如创建standby数据库,创建用于不同目的地测试环境,数据库迁移等. 使用DUPLICATE命令复制数据库能自动配置与源数据库不同的DBID,确保目标数据库和源数据库能一起存放在相同的恢复目录数据库中. RMAN支持两种复制类型:活动数据库复制和基本备份的复制.RMAN能在源数据库和恢复目录数据库存在或者不存在的情况下执行基于备份的复制. 活动数

基于RMAN的异机数据库克隆(rman duplicate)

对于基于生产环境下的数据库的版本升级或者测试新的应用程序的性能及其影响,备份恢复等等,我们可以采取从生产环境以克隆的方式将其克隆到本地而不影响生产数据库的正常使用.实现这个功能我们可以借助rman duplicate方式以及其简单的方式来完成.duplicate方式不同于OS级别的备份,它会为辅助数据库(克隆出来的数据库)生成一个新的dbid,而能够同时将目标数据库(原数据库)与辅助数据库注册到同一个恢复目录.本文描述了使用rman duplicate实现异机数据库克隆. 1.RMAN支持的du

Oracle之RMAN备份及还原

RMAN可以进行增量备份:数据库,表空间,数据文件 只有使用过的block可以被备份成backup set 表空间与数据文件对应关系:dba_data_files / v$datafile_header 在noarchivelog模式下,可以使用RMAN备份read-only和offline的表空间 ORACLE RMAN停机备份: 备份 RMAN连接上ORACLE,WINDOWS下在命令模式下 RMAN TARGET / 连接本地数据库用的是本地认证模式.RMAN连接数据库必须在dedicat

window Oracle 10g RMAN异机异目录恢复

1.实验环境简介                                  1.1  SOA原数据库                                                                                                                                                           数据库名        COMSOA 实例名          COMSOA DB

Oracle 10g RMAN 跨平台迁移

RMAN异构平台迁移 1.实验环境简介 1.1  SOA生产系统 数据库名    comSOA 实例名      Comsoa DBID        4133565260 数据库版本 Windows 32bit 10.2.R2 数据文件目录 E:\ORASOA\ORADATA\COMSOAPfile  Initcomsoa.ora 1.2  待恢SOA系统 数据库名    comSOA 实例名      Comsoa DBID        4133565260 数据库版本 Linux 64i

通过RMAN 异机克隆数据库

使用RMAN进行复制时,RMAN会连接目标数据库和辅助实例,如果使用了catalog备份的还会连接恢复目录.RMAN连接了目标数据库才能够访问其控制文件中记录的备份的详细信息,连接辅助实例才能够在辅助实例上分配一个或多个通道进程,9i开始会自动创建通道: 要连接辅助实例就先要启动辅助实例,就需要一个pfile参数文件,由目标数据库creata pfile from spfile得来,由于没有控制文件,所以只能启动到nomount阶段,RMAN会生成到这个辅助实例的sysdba连接.连接了目标库和

使用rman异机复制数据库

源端数据库:192.168.1.210 sid:orcl hostname:Nagiostest ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/11.2 目标数据库:192.168.1.211 sid:orcl hostname:OEL6 ORACLE_BASE=/u01/app/oracle ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 这里是相同实例名的复制,如果实例

rman管理3 对数据库进行备份

RMAN备份类: 1)backupset:只备份datafile里已经使用过的块( segment HWM以下).可以实现增量备份(可以备份到disk和tape).如果只启用一个channel,默认会把所有备份的datafile放入到一个backupset里,并且生成一个备份片(backup piece,在OS下看到的备份文件)恢复时速度慢,需要从备份集里先释放数据文件 backup piece :由backupset 生成的备份文件,保存在os下 2) copy(immage 镜像):实际上和

将oracle冷备份恢复到另外一个数据库实例中

因更换服务器需要将Oracle数据库转移到另外台Oracle中.说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不一样.特别借签了Afshen兄弟发的实践将oracle冷备份恢复到另外一个数据库实例中操作文章.但是对于新手来说没有详细说明,且我的操作有点点差异.另外我是新手,只知道工作完成,但是不知道是否此操作是否对于数据库使用存在何影响,还需要后期开发使用在知道,希望能给大家提供对比作为操作中的参考.(因时间仓