天天看点

dataguard备库的数据文件的迁移

关于移动数据库文件,之前写了一篇博文,http://blog.itpub.net/23718752/viewspace-1127910/

但是在备库中还是有一些的差别。最近因为对备库做了一些规划,新增加了几个分区,想把数据库的一部分文件放到SSD上。所以这个时候在现有的备库基础上需要移动备库的数据库文件。这里就不局限于数据文件了,不过目前的测试情况来说,还是数据文件是重点,还是主要以数据文件为例。

在备库中目前尝试了两种方式,可以采用rename datafile的方式或者使用rman的方式,对于日志文件还是直接重建会比较方便。

采用rename datafile的方式。

首先在备库取消日志应用

SQL> recover managed standby database cancel;

Media recovery complete.

操作系统级移动数据文件。

SQL> host mv /home/U01/app/oracle/oradata/test04/testdata01.dbf /home/U01/testdata01.dbf

使用rename datafile来移动数据文件,其实就是建立一个映射关系。

SQL> alter database rename file '/home/U01/app/oracle/oradata/test04/testdata01.dbf'  to '/home/U01/testdata01.dbf';

Database altered.

修改完毕后,就可以修改备库文件管理模式为auto了。

SQL> alter system set standby_file_management=auto;

System altered.

修改完成之后,查看数据文件的情况,发现数据字典层面已经改过来了。

SQL> select name from v$datafile;

NAME

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

/home/U01/app/oracle/oradata/test04/system01.dbf

/home/U01/app/oracle/oradata/test04/sysaux01.dbf

/home/U01/app/oracle/oradata/test04/undotbs01.dbf

/home/U01/app/oracle/oradata/test04/users01.dbf

/home/U01/testdata01.dbf

/home/U01/app/oracle/oradata/test04/testidx01.dbf

6 rows selected.

把备库启动到open,即read only状态

SQL> alter database open;

11g的备库还是启用ADG。

SQL> recover managed standby database disconnect from session using current logfile;

然后再次查看数据文件的细节。

SQL> col file_name format a50

SQL> select file_name,status,online_status from dba_data_files;

FILE_NAME                                          STATUS             ONLINE_STATUS

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

/home/U01/app/oracle/oradata/test04/users01.dbf    AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/undotbs01.dbf  AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/sysaux01.dbf   AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/system01.dbf   AVAILABLE          SYSTEM

/home/U01/testdata01.dbf                           AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/testidx01.dbf  AVAILABLE          ONLINE

由此可以看出文件迁移已经成功。

另外一种是使用rman的方式,但是原理还是相通的。

如果在主库中移动数据文件,可以采用如下的方式。

rman target /

COPY DATAFILE 5 to '/DATA/app/testdata01.dbf';

sql 'alter database datafile 5 offline';

switch datafile 5 to copy;

recover datafile 5;

sql 'alter database datafile 5 online';

在备库中不能这么使用,还是有一些不同之处,首先查看数据文件的情况。

FILE_NAME                                                       FILE_ID

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

/home/U01/app/oracle/oradata/test04/users01.dbf                       4

/home/U01/app/oracle/oradata/test04/undotbs01.dbf                     3

/home/U01/app/oracle/oradata/test04/sysaux01.dbf                      2

/home/U01/app/oracle/oradata/test04/system01.dbf                      1

/home/U01/testdata01.dbf                                              5

/home/U01/app/oracle/oradata/test04/testidx01.dbf                     6

然后在mount状态下,这个时候备库文件管理模式为auto或者manual就没有直接的影响了。

SQL> show parameter standby

NAME                                 TYPE                   VALUE

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

standby_archive_dest                 string                 ?/dbs/arch

standby_file_management              string                 AUTO

还是手工声明取消日志应用

然后开始rman中的数据文件迁移,把5号数据文件迁移到某个指定的路径下。

RMAN> COPY DATAFILE 5 to '/home/U01/app/oracle/oradata/test04/testdata01.dbf';

Starting backup at 2016-02-26 16:19:24

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=102 device type=DISK

channel ORA_DISK_1: starting datafile copy

input datafile file number=00005 name=/home/U01/testdata01.dbf

output file name=/home/U01/app/oracle/oradata/test04/testdata01.dbf tag=TAG20160226T161925 RECID=14 STAMP=904839566

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 2016-02-26 16:19:26

上面的日志其实在搭建dataguard的时候会看到,是不是很熟悉。然后声明一个切换结束。

RMAN> switch datafile 5 to copy;

datafile 5 switched to datafile copy "/home/U01/app/oracle/oradata/test04/testdata01.dbf"

然后声明数据文件为Online状态。

>sql 'alter database datafile 5 online';  --不运行实际上也会是Online

移动完成之后,开始查看迁移的情况,发现已经没有问题了。

FILE_NAME                                               BYTES ONLINE_STATUS

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

/home/U01/app/oracle/oradata/test04/users01.dbf      10485760 ONLINE

/home/U01/app/oracle/oradata/test04/undotbs01.dbf    73400320 ONLINE

/home/U01/app/oracle/oradata/test04/sysaux01.dbf    796917760 ONLINE

/home/U01/app/oracle/oradata/test04/system01.dbf    786432000 SYSTEM

/home/U01/app/oracle/oradata/test04/testdata01.dbf  209715200 ONLINE

/home/U01/app/oracle/oradata/test04/testidx01.dbf   104857600 ONLINE

所以综上的感觉来看,rman的方式还是比较推荐,至少操作方便快捷,而且dataguard的原生支持就是如此,而且限制也少。