前几天部门同事在做项目的时候,客户要求将单实例+ASM的数据库迁移至RAC+ASM,事后,这位大神整理了一些思路和操作细节发表在了公司的公众号上,我看到以后手痒,所以打算自己做个实验,写一个完整的全步骤,以此来提升自己的技能、总结迁移过程中的思路,同时向该大神致敬!
我的虚拟机环境配置如下:
单实例+ASM:
IP地址:192.168.29.60 内存1g 主机名mtxdb
RAC+ASM
IP地址:192.168.29.61 内存1g 主机名qianyi1 实例名mtxdb1
IP地址:192.168.29.62 内存1g 主机名qianyi2 实例名mtxdb2
共享存储是我在虚拟机中加的6块(每块大小3个G)共享磁盘,没分区,直接通过raw命令做的裸设备,然后绑定UDEV,具体配置如下:
ll /dev/raw*
total 0
crw-rw---- 1 grid asmadmin 162, 1 Jun 12 21:38 raw1
crw-rw---- 1 grid asmadmin 162, 2 Jun 12 21:38 raw2
crw-rw---- 1 grid asmadmin 162, 3 Jun 12 22:06 raw3
crw-rw---- 1 grid asmadmin 162, 4 Jun 12 21:38 raw4
crw-rw---- 1 grid asmadmin 162, 5 Jun 12 21:38 raw5
crw-rw---- 1 grid asmadmin 162, 6 Jun 12 21:38 raw6
more /etc/udev/rules.d/60-raw.rules
ACTION=="add", KERNEL=="/dev/sdb", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VBd7206812-68689e75", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="/dev/sdc", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VBde4d5bfc-6d91bbfd", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="/dev/sdd", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB1f49a410-5771ec25", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="/dev/sde", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB37be5bc0-b9a407ef", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="/dev/sdf", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB61fe4de3-5a9178bf", RUN+="/bin/raw /dev/raw/raw5 %N"
ACTION=="add", KERNEL=="/dev/sdg", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB363c90c6-23361f67", RUN+="/bin/raw /dev/raw/raw6 %N"
KERNEL=="raw[1-6]", OWNER=="grid", GROUP="asmadmin", MODE="660"
单实例+ASM使用了raw1和raw2作为数据盘,RAC使用了raw3作为OCR和votedisk
本实验主要注重迁移的过程和思路,所以本次环境的搭建过程省略。
我现在单实例的数据库已经处于open状态,RAC端只装好了GI软件,下面开始进入迁移阶段。
1.注意修改RAC端共享存储的属主和权限(gird:asmadmin,660)
2.收集源端磁盘组的信息:
SQL> set lines 200
SQL> col name for a10
SQL> col path for a15
SQL> col failgroup for a10
SQL> select name,total_mb,free_mb,group_number,disk_number,path,failgroup,mount_status,header_status,name
2 from v$asm_disk order by failgroup;
NAME TOTAL_MB FREE_MB GROUP_NUMBER DISK_NUMBER PATH FAILGROUP MOUNT_STAT HEADER_STA NAME
---------- ---------- ---------- ------------ ----------- --------------- ---------- ---------- ---------- ----------
DATA_0000 3072 2253 1 0 /dev/raw/raw1 DATA_0000 CACHED MEMBER DATA_0000
DATA_0001 3072 2255 1 1 /dev/raw/raw2 DATA_0001 CACHED MEMBER DATA_0001
0 0 0 1 /dev/raw/raw5 CLOSED FORMER
0 0 0 2 /dev/raw/raw4 CLOSED FORMER
0 0 0 0 /dev/raw/raw6 CLOSED FORMER
0 0 0 3 /dev/raw/raw3 CLOSED MEMBER
3.备份磁盘头信息
[grid@mtxdb ~]$ kfed read /dev/raw/raw1 text=raw1.txt
[grid@mtxdb ~]$ kfed read /dev/raw/raw2 text=raw2.txt
4.单实例端关闭数据库和GI
[oracle@mtxdb ~]$ srvctl stop database -d mtxdb
[root@mtxdb ~]# /u01/app/grid/product/11.2.0/grid/bin/crsctl stop has -f
CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on 'mtxdb'
CRS-2673: Attempting to stop 'ora.DATA.dg' on 'mtxdb'
CRS-2673: Attempting to stop 'ora.LISTENER.lsnr' on 'mtxdb'
CRS-2677: Stop of 'ora.DATA.dg' on 'mtxdb' succeeded
CRS-2673: Attempting to stop 'ora.asm' on 'mtxdb'
CRS-2677: Stop of 'ora.LISTENER.lsnr' on 'mtxdb' succeeded
CRS-2677: Stop of 'ora.asm' on 'mtxdb' succeeded
CRS-2673: Attempting to stop 'ora.cssd' on 'mtxdb'
CRS-2677: Stop of 'ora.cssd' on 'mtxdb' succeeded
CRS-2673: Attempting to stop 'ora.evmd' on 'mtxdb'
CRS-2677: Stop of 'ora.evmd' on 'mtxdb' succeeded
CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'mtxdb' has completed
CRS-4133: Oracle High Availability Services has been stopped.
5.RAC端使用asmca命令挂载磁盘组asmca命令自动扫描相关磁盘并将可用磁盘组列出,点击mount all之后会挂载盘组(相关盘组资源会自动加载进集群资源)
6.安装数据库软件(仅仅只是安装)在database路径下直接运行./runInstaller,过程略
7.设置Oracle参数文件
源端创建pfile,并将pfile和密码文件scp到目标端
[oracle@mtxdb dbs]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Wed Jun 13 00:41:48 2018
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to an idle instance.
SQL> create pfile='/home/oracle/initmtxdb.ora' from spfile;
File created.
[oracle@mtxdb ~]$ scp initmtxdb.ora 192.168.29.61:/u01/app/oracle/product/11.2.0/db/dbs/spfilemtxdb1.ora
[oracle@mtxdb ~]$ scp initmtxdb.ora 192.168.29.62:/u01/app/oracle/product/11.2.0/db/dbs/spfilemtxdb2.ora
[oracle@mtxdb dbs]$ scp orapwmtxdb 192.168.29.61:/u01/app/oracle/product/11.2.0/db/dbs/orapwmtxdb1
oracle@192.168.29.61's password:
orapwmtxdb 100% 1536 1.5KB/s 00:00
[oracle@mtxdb dbs]$ scp orapwmtxdb 192.168.29.62:/u01/app/oracle/product/11.2.0/db/dbs/orapwmtxdb2
oracle@192.168.29.62's password:
orapwmtxdb 100% 1536 1.5KB/s 00:00
8.目标端修改pfile内的相应参数,增加的参数如下(注意,db_name不能修改,因为数据库名是不变的,这始终是一套数据库):
我只改了目标端其中一个节点上的参数文件,在RAC中,SPFILE是放在ASM磁盘组里的,两个节点共享一个参数文件
*.cluster_database=true
*.REMOTE_LISTENER='qianyi-scan:1521'
mtxdb1.instance_name=mtxdb1
mtxdb2.instance_name=mtxdb2
mtxdb1.instance_number=1
mtxdb2.instance_number=2
mtxdb1.undo_tablespace='UNDOTBS1'
mtxdb2.undo_tablespace='UNDOTBS2'
mtxdb1.thread=1
mtxdb2.thread=2
9.创建spfile,并将spfile文件存放到ASM中,同时配置两个节点的pfile文件
SQL> create spfile='+DATA/mtxdb/spfilemtxdb.ora' from pfile;
File created.
SQL> exit
[oracle@qianyi1 dbs]$ vi initmtxdb1.ora
spfile='+DATA/mtxdb/spfilemtxdb.ora'
10.在两台目标端创建所需要的目录
mkdir -p /u01/app/oracle/admin/mtxdb/adump
11.把数据库和实例注册到集群环境中
[oracle@qianyi1 dbs]$ srvctl add database -d mtxdb -o /u01/app/oracle/product/11.2.0/db
[oracle@qianyi1 dbs]$ srvctl add instance -d mtxdb -i mtxdb1 -n qianyi1
[oracle@qianyi1 dbs]$ srvctl add instance -d mtxdb -i mtxdb2 -n qianyi2
[oracle@qianyi1 dbs]$ srvctl config database -d mtxdb
Database unique name: mtxdb
Database name:
Oracle home: /u01/app/oracle/product/11.2.0/db
Oracle user: oracle
Spfile:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: mtxdb
Database instances: mtxdb1,mtxdb2
Disk Groups:
Mount point paths:
Services:
Type: RAC
Database is administrator managed
12.修改Oracle权限(两个节点都要执行)
[grid@qianyi1 ~]$ cd $ORACLE_HOME/bin
setasmgidwrap -o /u01/app/oracle/product/11.2.0/db/bin/oracle
13.启动Oracle实例并打开数据库
[oracle@qianyi1 dbs]$ srvctl start instance -d mtxdb -i mtxdb1
14.增加实例2的redolog以及undotbs2表空间
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
3 ONLINE +DATA/mtxdb/onlinelog/group_3.263.978538691 NO
2 ONLINE +DATA/mtxdb/onlinelog/group_2.262.978538689 NO
1 ONLINE +DATA/mtxdb/onlinelog/group_1.261.978538687 NO
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 4 52428800 512 1 NO INACTIVE 949926 11-JUN-18 963133 11-JUN-18
2 1 5 52428800 512 1 NO INACTIVE 963133 11-JUN-18 974146 12-JUN-18
3 1 6 52428800 512 1 NO CURRENT 974146 12-JUN-18 2.8147E+14
SQL> alter database add logfile thread 2 group 4 '+DATA' size 50m reuse;
Database altered.
SQL> alter database add logfile thread 2 group 5 '+DATA' size 50m reuse;
Database altered.
SQL> alter database add logfile thread 2 group 6 '+DATA' size 50m reuse;
Database altered.
SQL> create undo tablespace UNDOTBS2 datafile '+DATA' size 1G;
Tablespace created.
15.启动集群线程2
SQL> alter database enable public thread 2;
Database altered.
SQL> select thread#,status,enabled from v$thread;
THREAD# STATUS ENABLED
---------- ------ --------
1 OPEN PUBLIC
2 CLOSED PUBLIC
注意:如果thread2为private,可以采用下面的方法修改
关闭instance mtxdb2,重启至nomount状态。在现有一个instanceORCL1上操作:
alter database disable thread 2;
alter database enable public thread 2;
再开启mtxdb2
16.创建集群相关视图
SQL> @$ORACLE_HOME/rdbms/admin/catclust.sql
Package created.
Package body created.
PL/SQL procedure successfully completed.
View created.
Synonym created.
Grant succeeded.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
View created.
Grant succeeded.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
Synonym created.
View created.
Grant succeeded.
Synonym created.
View created.
Grant succeeded.
Synonym created.
PL/SQL procedure successfully completed.
17.启动实例2并验证
srvctl start instance -d mtxdb -i mtxdb2
SQL> select instance_name,status from gv$instance;
INSTANCE_NAME STATUS
---------------- ------------
mtxdb1 OPEN
mtxdb2 OPEN