关于移动数据库文件,之前写了一篇博文,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的原生支持就是如此,而且限制也少。