سلام به همه دوستان

گاهی شده که ما دیتابیس هایی داریم روی فایل سیستم و شده اون مسیر (mount point) پر بشه و بخواهیم اون دیتابیس رو به asm انتقال بدیم

روش های مختلفی برای  انتقال پایگاه داده از فایل سیستم  به ASM وجود دارد.میتونیم از RMAN Image copy  و بعدش switch to database copy کنیم یا بکاپ رو برگردونیم روی asm ،به هر حال روش rman تا قبل از 12C وجود داشتن ،من در این اینجا روش انتقال آنلاین دیتابیس به ASM  رو توضیح میدم

من در اینجا یک دیتابیس 12 non cdb دارم 

RMAN> report schema;
using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name ORCLDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    1216     SYSTEM               YES     /oradata2/ORCLDB/datafile/o1_mf_system_g7dr13np_.dbf
2    25668    MGMT_TABLESPACE      NO      /oradata2/ORCLDB/datafile/o1_mf_mgmt_tab_g7drww9w_.dbf
3    3495     SYSAUX               NO      /oradata2/ORCLDB/datafile/o1_mf_sysaux_g7dqsbbm_.dbf
4    420      UNDOTBS1             YES     /oradata2/ORCLDB/datafile/o1_mf_undotbs1_g7dr4jms_.dbf
5    2580     MGMT_ECM_DEPOT_TS    NO      +DATA/ORCLDB/DATAFILE/mgmt_ecm_depot_ts.258.1001414099
6    12       USERS                NO      +DATA/ORCLDB/DATAFILE/users.257.1001413955
7    5005     MGMT_AD4J_TS         NO      /oradata2/ORCLDB/datafile/o1_mf_mgmt_ad4_g7dr5z2z_.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
2    400      TEMP2                32767       /oradata2/ORCLDB/datafile/o1_mf_temp2_g7dvsvrm_.tmp
خب حالا پارامتر زیر رو چک میکنیم(استفاده از OMF)
SQL> show parameter db_create_file_dest
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      /oradata2

خب حالا مسیر دیتافایل های فعلیمون رو بررسی میکنیم
SQL> select FILE_ID,FILE_NAME,TABLESPACE_NAME from dba_data_files;
   FILE_ID FILE_NAME                                                    TABLESPACE_NAME
---------- ------------------------------------------------------------ ------------------------------
         3 /oradata2/ORCLDB/datafile/o1_mf_sysaux_g7dqsbbm_.dbf       SYSAUX
         7 /oradata2/ORCLDB/datafile/o1_mf_mgmt_ad4_g7dr5z2z_.dbf     MGMT_AD4J_TS
         4 /oradata2/ORCLDB/datafile/o1_mf_undotbs1_g7dr4jms_.dbf     UNDOTBS1
         1 /oradata2/ORCLDB/datafile/o1_mf_system_g7dr13np_.dbf       SYSTEM
         2 /oradata2/ORCLDB/datafile/o1_mf_mgmt_tab_g7drww9w_.dbf     MGMT_TABLESPACE
         5 /oradata2/ORCLDB/datafile/o1_mf_mgmt_ecm_g7drljd0_.dbf     MGMT_ECM_DEPOT_TS
         6 /oradata2/ORCLDB/datafile/o1_mf_users_g7dqq482_.dbf        USERS
7 rows selected.
 خب برای شروع کار مسیر db_Create_file_dest  رو به diskgroup که ساختیم برای انتقال تغییر میدیم

SQL> alter system set db_create_file_dest='+DATA';

اواکل 12 به علت ایجاد feature ILM زیر ساختی رو درست کرده که ما همه چیز به صورت انلاین میشه تغییر داد(مثل انتقال دیتافایل ها،پارتشین کردن جدول و...)
خب حالا فقط کافیه ما دستور Move رو بزنیم

SQL> alter database move datafile 6 to '+DATA';
Database altered.
SQL> alter database move datafile 5 to '+DATA';
Database altered.
SQL> alter database move datafile 2 to '+DATA';
Database altered.
SQL> alter database move datafile 1 to '+DATA';
Database altered.
SQL> alter database move datafile 4 to '+DATA';
Database altered.
SQL> alter database move datafile 7 to '+DATA';
Database altered.
SQL> alter database move datafile 3 to '+DATA';
Database altered.
همینطور که میبینیم دیتابیس در حال سرویس دهی می باشد و ما بدون downtime  دیتافایل ها  را به asm منتقل کردیم


RMAN> report schema;
Report of database schema for database with db_unique_name ORCLDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    1216     SYSTEM               YES     +DATA/ORCLDB/DATAFILE/system.260.1001416205
2    25668    MGMT_TABLESPACE      NO      +DATA/ORCLDB/DATAFILE/mgmt_tablespace.259.1001414365
3    3495     SYSAUX               NO      +DATA/ORCLDB/DATAFILE/sysaux.263.1001416707
4    420      UNDOTBS1             YES     +DATA/ORCLDB/DATAFILE/undotbs1.261.1001416317
5    2580     MGMT_ECM_DEPOT_TS    NO      +DATA/ORCLDB/DATAFILE/mgmt_ecm_depot_ts.258.1001414099
6    12       USERS                NO      +DATA/ORCLDB/DATAFILE/users.257.1001413955
7    5005     MGMT_AD4J_TS         NO      +DATA/ORCLDB/DATAFILE/mgmt_ad4j_ts.262.1001416383
List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
2    400      TEMP2                32767       /oradata2/ORCLDB/datafile/o1_mf_temp2_g7dvsvrm_.tmp

خب باید توجه داشته باشیم که temp tablespace ما هنوز در filesystem  می باشد.

میتونیم از حالا یه temp جدید ایجاد کنیم و اون رو default کنیم و سپس بعد temp قبلی رو پاک کنیم(البته پاک کردن temp قبلی رو احتیاط کنید )

SQL>  alter database default temporary tablespace TEMP;
Database altered.
SQL> drop tablespace TEMP2 including contents and datafiles;
Tablespace dropped.
MAN>  report schema;
Report of database schema for database with db_unique_name ORCLDB
List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    1216     SYSTEM               YES     +DATA/ORCLDB/DATAFILE/system.260.1001416205
2    25668    MGMT_TABLESPACE      NO      +DATA/ORCLDB/DATAFILE/mgmt_tablespace.259.1001414365
3    3495     SYSAUX               NO      +DATA/ORCLDB/DATAFILE/sysaux.263.1001416707
4    420      UNDOTBS1             YES     +DATA/ORCLDB/DATAFILE/undotbs1.261.1001416317
5    2580     MGMT_ECM_DEPOT_TS    NO      +DATA/ORCLDB/DATAFILE/mgmt_ecm_depot_ts.258.1001414099
6    12       USERS                NO      +DATA/ORCLDB/DATAFILE/users.257.1001413955
7    5005     MGMT_AD4J_TS         NO      +DATA/ORCLDB/DATAFILE/mgmt_ad4j_ts.262.1001416383
List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    100      TEMP2                 32767       +DATA/ORCLDB/TEMPFILE/temp2.264.1001417145


خب همینطور که میبینید تمام datafile و tempfile ها در asm قرار دارند هنوز کار ما تموم نشده ما قراره کل دیتابیس رو به asm ببریم یعنی spfile,controlfile,online redolog ها رو هم باید به asm ببریم
خب ببینیم وضعیت log file ها رو با هم :
SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/oradata/ORCLDB/onlinelog/o1_mf_3_dpv66sy8_.log
/oradata/ORCLDB/onlinelog/o1_mf_2_dpv66gk4_.log
/oradata/ORCLDB/onlinelog/o1_mf_1_dpv6623d_.log

3 rows selected.
SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE
همینطور که میبینید logfile ها در filesystem  قرار داده  برای این انتقال گروه های قبلی رو drop میکنیم و گروه های جدید را در asm می سازیم
SQL> alter database drop logfile group 2;
SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         3 INACTIVE
خب حالا گروه 2 رو ایجاد میکنیم
SQL>  alter database add logfile group 2 '+DATA';

Database altered.
SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 UNUSED
         3 INACTIVE
SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/oradata/ORCLDB/onlinelog/o1_mf_3_dpv66sy8_.log
+DATA/ORCLDB/ONLINELOG/group_2.265.1001420229
/oradata/ORCLDB/onlinelog/o1_mf_1_dpv6623d_.log

به همین ترتیب برای گروه های دیگه هم این کار رو میکنیم
SQL> alter database drop logfile group 3;

Database altered.SQL> alter database add logfile group 3 '+DATA';

Database altered.

SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 UNUSED
         3 UNUSED
SQL> alter system switch logfile;

System altered.

SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 ACTIVE
         2 CURRENT
         3 UNUSED
SQL> alter system  checkpoint global;

System altered.

SQL> select group#, status from v$log;

    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 CURRENT
         3 UNUSED
همینطور که در زیر مشاهده میکنید 
SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
+DATA/ORCLDB/ONLINELOG/group_3.266.1001420299
+DATA/ORCLDB/ONLINELOG/group_1.267.1001420987
+DATA/ORCLDB/ONLINELOG/group_2.265.1001420229
خب حالا باید ببنیم که controlfile کجا قرار داره 
SQL> show parameter control_files

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      /oradata/ORCLDB/controlfile/
                                                 o1_mf_dpv65znc_.ctl
خب اینجا دیکه باید یه downtime خیلی کم بگیریم تا دیتابیس رو shutdown میکنیم  و کنترل فایل رو تغییر بدیم
RMAN> startup nomount;
Total System Global Area 5368709120 bytes
Fixed Size                  6081440 bytes
Variable Size            1426064480 bytes
Database Buffers         3909091328 bytes
Redo Buffers               27471872 bytes
												 
RMAN> restore controlfile to '+DATA' from '/oradata/ORCLDB/controlfile/o1_mf_dpv65znc_.ctl';

Starting restore at 28-FEB-19
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=392 device type=DISK

channel ORA_DISK_1: copied control file copy
Finished restore at 28-FEB-19
[root@cloudcontrol ~]# su - grid
Last login: Thu Feb 28 11:43:49 IRST 2019 on pts/2
[grid@cloudcontrol ~]$ asmcmd -p
ASMCMD [+] > find --type CONTROLFILE +DATA *
+DATA/ORCLDB/CONTROLFILE/current.270.1001421287
SQL> show parameter control_file

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /oradata/ORCLDB/controlfile/
                                                 o1_mf_dpv65znc_.ctl, /oradata/
                                                 fast_recovery_area/ORCLDB/co
                                                 ntrolfile/o1_mf_dpv65zpl_.ctl
SQL> alter system set control_files='+DATA/ORCLDB/CONTROLFILE/current.270.1001421287' scope=spfile;

System altered.

SQL> shut immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
								
خب حالا spfile رو انتقال میدیم
[oracle@cloudcontrol ~]$ srvctl start database -d  ORCLDB -o mount;
								
RMAN> run{
2> backup as backupset spfile;
3> restore spfile to '+DATA/ORCLDB/spfileORCLDB.ora';
4> }

Starting backup at 28-FEB-19
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=587 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=665 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 28-FEB-19
channel ORA_DISK_1: finished piece 1 at 28-FEB-19
piece handle=+DATA/ORCLDB/BACKUPSET/2019_02_28/nnsnf0_tag20190228t124730_0.271.1001422051 tag=TAG20190228T124730 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 28-FEB-19

Starting Control File and SPFILE Autobackup at 28-FEB-19
piece handle=+DATA/ORCLDB/AUTOBACKUP/2019_02_28/s_1001421172.272.1001422053 comment=NONE
Finished Control File and SPFILE Autobackup at 28-FEB-19

Starting restore at 28-FEB-19
using channel ORA_DISK_1
using channel ORA_DISK_2

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: restoring SPFILE
output file name=+DATA/ORCLDB/spfileORCLDB.ora
channel ORA_DISK_1: reading from backup piece +DATA/ORCLDB/AUTOBACKUP/2019_02_28/s_1001421172.272.1001422053
channel ORA_DISK_1: piece handle=+DATA/ORCLDB/AUTOBACKUP/2019_02_28/s_1001421172.272.1001422053 tag=TAG20190228T124732
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 28-FEB-19

و در اخر چون spfile رو داخل diskgroup بردیم بهتره که OLR رو هم modify کنیم

[oracle@cloudcontrol ~]$ srvctl modify database -d ORCLDB -spfile '+DATA/ORCLDB/spfileORCLDB.ora'
[oracle@cloudcontrol ~]$ srvctl config database -d ORCLDB
Database unique name: ORCLDB
Database name:
Oracle home: /u01/app/oracle/product/12.1.0/db
Oracle user: oracle
Spfile: +DATA/ORCLDB/spfileORCLDB.ora
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA
Services:
OSDBA group:
OSOPER group:
Database instance: ORCLDB

خب حالا start میکنیم دیتابیس رو و چک نهایی ور انجام میدیم

[oracle@cloudcontrol ~]$ srvctl stop database -d ORCLDB
[oracle@cloudcontrol ~]$ ^stop^start
srvctl start database -d ORCLDB
												 
SQL> set lines 200
SQL> set pages 999
SQL> select name from v$datafile union all
select name from v$tempfile union all
select member from v$logfile union all
select name from v$controlfile;  2    3    4

NAME
------------------------------------------------------------------------------------------
+DATA/ORCLDB/DATAFILE/system.260.1001416205
+DATA/ORCLDB/DATAFILE/mgmt_tablespace.259.1001414365
+DATA/ORCLDB/DATAFILE/sysaux.263.1001416707
+DATA/ORCLDB/DATAFILE/undotbs1.261.1001416317
+DATA/ORCLDB/DATAFILE/mgmt_ecm_depot_ts.258.1001414099
+DATA/ORCLDB/DATAFILE/users.257.1001413955
+DATA/ORCLDB/DATAFILE/mgmt_ad4j_ts.262.1001416383
+DATA/ORCLDB/TEMPFILE/temp.264.1001417145
+DATA/ORCLDB/ONLINELOG/group_3.266.1001420299
+DATA/ORCLDB/ONLINELOG/group_1.267.1001420987
+DATA/ORCLDB/ONLINELOG/group_2.265.1001420229
+DATA/ORCLDB/ONLINELOG/group_4.268.1001421011
+DATA/ORCLDB/ONLINELOG/group_4.269.1001421015
+DATA/ORCLDB/CONTROLFILE/current.270.1001421287
موفق  و پیروز باشید