介绍迁移的简单过程。步骤如下: 1、划分asm disk,并检查或更改udev配置文件,使得新存储的asm disk对asm实例可识别。 2、备份OCR、Voting disk、ASM disk header和数据库; 3、创建新的Diskgroup; 4、迁移OCR和Vote Diks到新磁盘组(ASM diskgroup); 5、迁移ASM Spfile到新的硬盘组(ASM Diskgroup); 6、迁移数据库相关文件至新磁盘组(ASM Diskgroup); 7、在线修改数据库参数文件(归档路径、闪回等); 8、删除旧磁盘组 9、观察期; 10、执行数据库备份。
一、添加ASM磁盘组
查年当前ASM磁盘信息
[root@testdb1 ~]# su - grid
[root@node1 ~]# su - grid
node1-> sqlplus / as sysasm
SQL> select instance_name from v$instance;
SQL> col name for a10
SQL> set linesize 150
SQL> select name,allocation_unit_size,state,total_mb,free_mb usable_file_mb from gv$asm_diskgroup;
利用asmca命令创建diskgroup
磁盘组的状态在grid账号下,使用crsctl status res -t命令可查看
node1-> crsctl status res -t
二、迁移OCR和Vote Disk到新的磁盘组(ASM Diskgroup)
[root@node1 ~]# su - grid
node1-> ocrcheck
添加新的磁盘组,并进行迁移替换
[root@node1 ~]# cd /u01/app/11.2.0/grid/bin
[root@node1 bin]# pwd
/u01/app/11.2.0/grid/bin
[root@node1 bin]# ./ocrconfig -add +OCR_N
[root@node1 bin]# ./ocrcheck
然后迁移votedisk
[root@node1 bin]#./crsctl replace votedisk +OCR_N
[root@node1 bin]# ./ocrcheck
删除+OCR_VOTE中的ocr:
[root@node1 bin]# ./ocrconfig -delete +OCR
[root@node1 bin]# ./ocrcheck
查看votedisk的信息:
[root@node1 bin]# ./crsctl query css votedisk
查看diskgroup的信息:
[root@node1 ~]# su - grid
node1-> sqlplus / as sysasm
SQL> col name for a10
SQL> set linesize 150
SQL> select group_number,name,state,type from v$asm_diskgroup;
此时spfile存放在+OCR中,需要重建spfile:
SQL> create pfile='/tmp/asmpfile.ora' from spfile;
SQL> create spfile='+OCR_N' from pfile='/tmp/asmpfile.ora';
然后使得root用户重启crs即可(两边顺序重启)
srvctl stop database -d devdb
./crsctl stop crs
重新启动集群和数据库
./crsctl start crs
删除磁盘组OCR:
在节点2卸载OCR磁盘组
alter diskgroup OCR dismount;
在节点1删除OCR磁盘组
drop diskgroup OCR including contents;
磁盘删除后,在ASM磁盘的运行状态中就看不到OCR磁盘组了。
node1-> crsctl status res -t
可再停止数据库,停止RAC集群,再重新启动集群和数据库测试一下。
######尽量不用强制删除磁盘组命令
强制删除磁盘组命令,如果上面的命令执行成功,此命令可不用
SQL> drop diskgroup OCRVOTE FORCE including contents;
查看Votedisk信息,迁移至新的磁盘组
[root@node1 bin]# su - grid
node1-> crsctl query css votedisk
查看磁盘组中的磁盘
node1-> sqlplus / as sysasm
SQL> select instance_name from v$instance;
SQL> col name for a10
SQL> set linesize 150
SQL> select group_number,disk_number,name,path,total_mb,free_mb from v$asm_disk;
查看磁盘组
SQL> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;
三、Moving database related files to new ASM diskgroup
控制文件迁移
SQL> create pfile='/tmp/asmpfile.ora' from spfile;
SQL> alter system set control_files='+DATA_N' scope=spfile sid='*';
关闭所有节点数据库
srvctl stop database -d devdb
启动节点1的数据库到nomount状态
srvctl start instance -d devdb -i devdb1 -o nomount;
查看状态
srvctl status instance -d devdb -i devdb1
使用rman迁移
node1-> rman target /
RMAN> restore controlfile from '+DATA/devdb/controlfile/current.268.1069858805';
进入sqlplus / as sysdba启动数据库
SQL> alter database mount;
SQL> alter database open;
SQL> col name for a40
SQL> col value for a60
SQL> set linesize 150
SQL> show parameter control;
四、Moving Spfile to new ASM diskgroup
查看参数文件
SQL> col name for a40
SQL> col value for a60
SQL> set linesize 150
SQL> show parameter spfile;
SQL> create pfile='/tmp/db.ora' from spfile;
SQL> create spfile='+DATA_N' from pfile='/tmp/db.ora';
SQL> show parameter spfile;
进入grid账号,使用asmcmd进入磁盘查询
[root@node1 bin]# su - grid
node1-> asmcmd
ASMCMD> pwd
ASMCMD> ls
ASMCMD> mkalias +data_n/devdb/parameterfile/spfile.256.1069859357 spfiledevdb.ora
ASMCMD> ls -l
在节点1的grid账号下执行:
node1-> srvctl config database -d devdb
在节点1的Oracle账号下执行:
[root@node1 bin]# su - oracle
node1-> srvctl config database -d devdb
Modify the pfiles that give reference to the SPFile in $ORACLE_HOME/dbs
节点1修改前:
[oracle@testdb1 dbs]$ vi inittestdb1.ora
SPFILE='+DATA/devdb/spfiledevdb.ora'
节点1修改后:
[oracle@testdb1 dbs]$ vi inittestdb1.ora
SPFILE='+DATA_N/devdb/parameterfile/spfiledevdb.ora'
节点2修改前:
[oracle@testdb2 dbs]$ vi inittestdb2.ora
SPFILE='+DATA/devdb/spfiledevdb.ora'
节点2 修改后:
[oracle@testdb2 dbs]$ vi inittestdb2.ora
SPFILE='+DATA_N/devdb/parameterfile/spfiledevdb.ora'
在节点1上修改RAC的spfile路径,节点2不用再修改
在 11GR2 RAC中修改DATABASE spfile文件的位置不是原来的
$ORACLE_HOME/dbs/init<ORACLE_SID>.ora文件了,如果我们手动修改了这个文件,当使用
sqlplus手动启动数据库的时候仍会生效,但是如果我们使用srvctl或者是crsctl工具来启动数据时,就不会生效了。
因为spfile文件的路径已经与集群结束在一起了。当
$ORACLE_HOME/dbs/init<ORACLE_SID>.ora中的内容与我们srvctl看到的内容不一致的时候,使用
srvctl工具启动数据库时,会自己修改$ORACLE_HOME/dbs/init<ORACLE_SID>.ora文件中的内容与其一致的。
在$ORACLE_HOME/dbs/init<ORACLE_SID>.ora文件第一行后可以看到。
node1-> srvctl modify database -d devdb -p +DATA_N/devdb/parameterfile/spfiledevdb.or
node1-> srvctl config database -d devdb
启动数据库:
在节点1重新启动数据库,节点2不用再操作
[oracle@devdb1 dbs]$ srvctl stop database -d devdb
[oracle@devdb1 dbs]$ srvctl start database -d devdb
[oracle@devdb1 dbs]$ exit
查看RAC和数据库的启动状态
node2-> crsctl status res -t
五、Moving data files to new ASM diskgroup
在节点1上执行
[root@node1 ~]# su - oracle
node1-> sqlplus / as sysdba
SQL> select 'backup as copy datafile '|| file#||' format ''+DATA_N'';' from v$datafile;
查看数据库是否在归档模式
SQL> select log_mode from v$database;
更改为归档模式
node1-> srvctl stop database -d devdb
node1-> srvctl start database -d devdb -o mount
node1-> sqlplus / as sysdba
SQL> alter database archivelog;
SQL> archive log list;
在节点1和节点2上找开各实例数据库至open;
节点1:
SQL> alter database open;
节点2:
SQL> alter database open;
退出,在oracle账号运行rman;
RMAN> run {
backup as copy datafile 1 format '+DATA_N';
backup as copy datafile 2 format '+DATA_N';
backup as copy datafile 3 format '+DATA_N';
backup as copy datafile 4 format '+DATA_N';
backup as copy datafile 5 format '+DATA_N';
backup as copy datafile 6 format '+DATA_N';
}
停止数据库
srvctl stop database -d devdb
启动节点1数据库至mount状态
srvctl start instance -d devdb -i devdb1 -o mount
执行select语句
node1-> sqlplus / as sysdba
SQL> select 'switch datafile '|| file#||' to copy;' from v$datafile;
SQL> select 'recover datafile '|| file# ||';' from v$datafile;
进入rman执行操作
RMAN> switch datafile xxx to copy;
RMAN> report schema;
RMAN> recover datafile xxx;
重新启动数据库
在节点1启动数据库
node1-> sqlplus / as sysdba
SQL> alter database open;
在节点2启动数据库
[root@node2 bin]# su - oracle
node2-> sqlplus / as sysdba
SQL> startup
到此后执行一个数据全备,
备份数据的步骤:
1.使用RMAN连接目标库
2.确认数据库是mount或者open阶段
3.使用backup database命令备份数据库。
在备份之前应该确认configuration中的默认值,然后根据实际情况添加参数,如果channel,format,plus archivelog等等。
[oracle@devdb1 ~]$ vi full_backup.sql
oracle@devdb1 ~]$ cat full_backup.sql
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/home/oracle/rman_full_%T_%u';
release channel c1;
release channel c2;
}
在rman下执行
RMAN> @/home/oracle/full_backup.sql
RMAN> run{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '+DATA/rman_full_%T_%u';
release channel c1;
release channel c2;
}
在rman下删除原来磁盘空间的数据。
[oracle@testdb1 ~]$ rman target /
RMAN> delete datafilecopy all;
七、 Moving temp files to new ASM diskgroup
[root@node2 oracle]# su - oracle
node2-> sqlplus / as sysdba
SQL> select file_name from dba_temp_files;
SQL> alter tablespace temp add tempfile '+data_n(tempfile)';
SQL> select file_name from dba_temp_files;
SQL> alter tablespace temp drop tempfile '+DATA/devdb/tempfile/temp.267.1047113145';
SQL> select file_name from dba_temp_files;
八、Moving online redo log files to new ASM Diiskgroup
SQL> select group#,member from v$logfile;
SQL> alter database add logfile member '+DATA_N' to group 1;
SQL> alter database add logfile member '+DATA_N' to group 2;
SQL> alter database add logfile member '+DATA_N' to group 3;
SQL> alter database add logfile member '+DATA_N' to group 4;
删除原日志成员,(注:切换为非当前日志进行删除)
SQL> col MEMBER for a100;
SQL> select group#,member from v$logfile;
删除日志报错
SQL> alter database drop logfile member '+DATA/testdb/onlinelog/group_1.257.1000856432
alter database drop logfile member '+DATA/testdb/onlinelog/group_1.257.1000856437'
*
ERROR at line 1:
ORA-01609: log 1 is the current log for thread 1 - cannot drop members
ORA-00312: online log 1 thread 1: '+DATA/testdb/onlinelog/group_1.257.1000856437'
ORA-00312: online log 1 thread 1: '+DATA_N/testdb/onlinelog/group_1.269.1037721485'
使用以命令切换日志,然后再执行删除,如果还报错,以下命令多执行几次。
SQL> alter system switch logfile;
SQL> alter database drop logfile member '+DATA/testdb/onlinelog/group_1.257.10008564364
SQL> alter database drop logfile member '+DATA/testdb/onlinelog/group_2.258.10008564310
SQL> alter database drop logfile member '+DATA/testdb/onlinelog/group_3.265.10008582214
SQL> alter database drop logfile member '+DATA/testdb/onlinelog/group_4.266.10008582218
SQL> alter system checkpoint;
SQL> select group#,member from v$logfile order by 1;
修改闪回区,财政的Oracle RAC没有配置闪回区
SQL> show parameter recover;
SQL>alter system set db_recovery_file_dest='+DATA_N';
SQL> show parameter db_create_file_dest;
SQL> alter system set db_create_file_dest='+DATA_N';
SQL> show parameter db_create_file_dest;
修改归档日志路径:
SQL> select max(sequence#),thread# from v$archived_log group by thread#;
SQL> select name from v$archived_log where (sequence#=316 and thread#=1) or (sequence#=266 and thread#=2);
SQL> show parameter log_archive_dest_1
SQL> alter system set log_archive_dest_1='LOCATION=+FLASH_N';
SQL> show parameter log_archive_dest_1
执行数据库物理全备,参照下面命令执行
1.查看所有数据文件
SQL> col file_name for a50;
set linesize 300
col STATUS for a15
col TABLESPACE_NAME for a15
col file_id for 9999999
SQL> select * from dba_data_files;
2.查看日志文件
col MEMBER for a70
SQL> select * from v$logfile;
3.查看控制文件
SQL> col name for a80;
SQL> select * From v$controlfile;
--数据库物理全备份,即把上面查出来的数据文件,日志文件,控制文件用操作系统的复制命令,粘贴到备份目录下即可
--拷贝前,先停止数据库,登录sqlplus
shutdown immediate
拷贝完成之后,启动数据库
startup
进入数据库删除重要数据,模拟出故障的情况。
truncate table employee;
--关闭数据库,进行恢复
shutdown immediate
把备份的文件拷贝到原来目录
再启动
startup
再登录验证数据是否存在。
九、Dropping old diskgroups
[root@testdb1 bin]# su - grid
[grid@testdb1 ~]$ sqlplus / as sysasm
节点2需要执行dismount;
SQL> alter diskgroup arch dismount;
SQL> alter diskgroup data dismount;
在节点1执行删除操作
SQL> drop diskgroup arch force including contents;
SQL> drop diskgroup data force including contents;
Remove the disks from OCR
[root@testdb1 bin]# su - oracle
[oracle@testdb1 ~]$ srvctl stop database -d devdb
[oracle@testdb1 ~]$ srvctl modify database -d devdb-a "DATA_N,ARCH_N"
[oracle@testdb1 ~]$ srvctl remove diskgroup -g DATA
[oracle@testdb1 ~]$ srvctl remove diskgroup -g ARCH
[oracle@testdb1 ~]$ srvctl start database -d devdb
至此,完成存储的迁移,新的磁盘组己经替换旧的磁盘组。