artarad-Database-12c

امکان جابجایی برخط (online) دیتا فایل ها در پایگاه داده اوراکل ۱۲c

تا قبل از پایگاه داده اوراکل ۱۲c، جابجایی دیتا فایل ها همیشه به صورت offline انجام می شد، البته برای کم کردن زمان قطعی برای انجام این عملیات در نسخ گذشته روش هایی وجود دارد، اما نه به این صورت که زمان قطعی کامل از بین برود.
در نسخه ۱۲c دستور جدیدی به دسته دستورات alter database اضافه گردیده که امکان جابجایی دیتا فایل ها به صورت آنلاین را به راهبران پایگاه داده می دهد. در ادامه به توضیح این دستور و برخی نمونه های عملیاتی می پردازیم.

متن دستور و توضیحات آن:
متن دستور انجام عملیات جابجایی در ادامه آورده شده است.

ALTER DATABASE MOVE DATAFILE ( ‘filename’ | ‘ASM_filename’ | file_number ) [ TO ( ‘filename’ | ‘ASM_filename’ ) ] [ REUSE ] [ KEEP ];

در دستور فوق فایل مبدا را می توان با شماره و یا نام فایل مشخص کرد اما فایل مقصد حتما باید با نام فایل مشخص گردد.
کلمه کلیدی REUSE ساخت فایل در مبدا را اجباری می کند حتی اگر فایل با همان نام در مقصد وجود داشته باشد.
کلمه کلیدی keep فایل مبدا را در مسیر اولیه خود نگه می دارد و عملا کپی از آن را به مسیر مقصد منتقل می کند.
اگر فایل مبدا از نوع OMF باشد، کلمه کلیدی KEEP را نمی توان استفاده کرد. اگر فایل مقصد قرار باشد از نوع OMF باشد، دستور TO حذف می گردد و فایل در مقصد با نام از نوع OMF در مسیری که با پارامتر DB_CREATE_FILE_DEST مشخص گردیده، ایجاد می گردد.
لازم به توضیح می باشد که شماره فایل ها می توان از ویو های V$DATAFILE و یا DBA_DATA_FILES استخراج کرد مانند دستورات زیر :

SQL> CONN / AS SYSDBA

SQL> SET LINESIZE 100

SQL> COLUMN name FORMAT A70

SQL> SELECT file#, name FROM v$datafile WHERE con_id = 1 ORDER BY file#;

FILE# NAME

———- ———————————————————————-

۱ /u01/app/oracle/oradata/cdb1/system01.dbf

۳ /u01/app/oracle/oradata/cdb1/sysaux01.dbf

۴ /u01/app/oracle/oradata/cdb1/undotbs01.dbf

۶ /u01/app/oracle/oradata/cdb1/users01.dbf

SQL>

SQL> COLUMN file_name FORMAT A70

SELECT file_id, file_name FROM dba_data_files ORDER BY file_id;

FILE_ID FILE_NAME

———- ———————————————————————-

۱ /u01/app/oracle/oradata/cdb1/system01.dbf

۳ /u01/app/oracle/oradata/cdb1/sysaux01.dbf

۴ /u01/app/oracle/oradata/cdb1/undotbs01.dbf

۶ /u01/app/oracle/oradata/cdb1/users01.dbf

SQL>

نمونه های اجرایی:
در ادامه نمونه ای از جابجایی را با دستور فوق مشاهده می نماید که هر دو فایل مبدا و مقصد با نام مشخص گردیده اند.

SQL> ALTER DATABASE MOVE DATAFILE ‘/u01/app/oracle/oradata/cdb1/system01.dbf’ TO ‘/tmp/system01.dbf’;

Database altered.

SQL>

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id = 1;

FILE_ID FILE_NAME

———- ———————————————————————-

۱ /tmp/system01.dbf

SQL>

SQL> HOST ls -al /u01/app/oracle/oradata/cdb1/system01.dbf

ls: cannot access /u01/app/oracle/oradata/cdb1/system01.dbf: No such file or directory

SQL> HOST ls -al /tmp/system01.dbf

-rw-r—–. 1 oracle oinstall 838868992 Oct 8 22:48 /tmp/system01.dbf

SQL>

در ادامه نمونه ای مشاهده خواهید کرد که فایل مبدا با شماره مشخص گردیده و از کلمه کلیدی KEEP نیز استفاده شده است.

SQL> ALTER DATABASE MOVE DATAFILE 1 TO ‘/u01/app/oracle/oradata/cdb1/system01.dbf’ KEEP;

Database altered.

SQL>

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id = 1;

FILE_ID FILE_NAME

———- ———————————————————————-

۱ /u01/app/oracle/oradata/cdb1/system01.dbf

SQL>

SQL> HOST ls -al /u01/app/oracle/oradata/cdb1/system01.dbf

-rw-r—–. 1 oracle oinstall 838868992 Oct 8 22:48 /u01/app/oracle/oradata/cdb1/system01.dbf

SQL> HOST ls -al /tmp/system01.dbf

-rw-r—–. 1 oracle oinstall 838868992 Oct 8 22:49 /tmp/system01.dbf

SQL>

نمونه زیر با استفاده از OMF می باشد

SQL> ALTER SYSTEM SET db_create_file_dest=’/u01/app/oracle/oradata/cdb1′;

System altered.

SQL> ALTER DATABASE MOVE DATAFILE ‘/u01/app/oracle/oradata/cdb1/system01.dbf’;

Database altered.

SQL>

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id = 1;

FILE_ID FILE_NAME

———- ———————————————————————-

۱ /u01/app/oracle/oradata/cdb1/CDB1/datafile/o1_mf_system_958zo3ll_.dbf

SQL>

در نمونه آخر این بخش، سعی می شود فایل مبدا که از نوع OMF می باشد و با شماره مشخص گردیده با کلمه کلیدی KEEP جابجا گردد. به نادیده گرفته شدن KEEP در این روش دقت کنید.

SQL> ALTER DATABASE MOVE DATAFILE 1 To ‘/u01/app/oracle/oradata/cdb1/system01.dbf’ KEEP;

Database altered.

SQL> 

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id = 1;

FILE_ID FILE_NAME

———- ———————————————————————-

۱ /u01/app/oracle/oradata/cdb1/system01.dbf

SQL>

SQL> host ls -al /u01/app/oracle/oradata/cdb1/CDB1/datafile/o1_mf_system_958zo3ll_.dbf

ls: cannot access /u01/app/oracle/oradata/cdb1/CDB1/datafile/o1_mf_system_958zo3ll_.dbf: No such file or directory

SQL>

جابجایی در Pluggable Database)PDB)
Container Database نمی تونه فایل هایی که متعلق به PDB ها می باشد را جابجا کند. در ادامه فایل هایی که متعلق به PDB و CDB می باشد را مشاهده می نمایید.

SQL> SELECT file#, name FROM v$datafile ORDER BY file#;

FILE# NAME

———- ———————————————————————-

۱ /u01/app/oracle/oradata/cdb1/system01.dbf

۳ /u01/app/oracle/oradata/cdb1/sysaux01.dbf

۴ /u01/app/oracle/oradata/cdb1/undotbs01.dbf

۵ /u01/app/oracle/oradata/cdb1/pdbseed/system01.dbf

۶ /u01/app/oracle/oradata/cdb1/users01.dbf

۷ /u01/app/oracle/oradata/cdb1/pdbseed/sysaux01.dbf

۸ /u01/app/oracle/oradata/cdb1/pdb1/system01.dbf

۹ /u01/app/oracle/oradata/cdb1/pdb1/sysaux01.dbf

۱۰ /u01/app/oracle/oradata/cdb1/pdb1/pdb1_users01.dbf

۲۹ /u01/app/oracle/oradata/pdb2/system01.dbf

۳۰ /u01/app/oracle/oradata/pdb2/sysaux01.dbf

۳۱ /u01/app/oracle/oradata/pdb2/pdb2_users01.dbf

SQL>

حالا اگر بخواهیم یکی از دیتافایل ها متعلق به PDB را در سطح CDB جابجا کنیم با خطای زیر مواجه خواهیم شد:

SQL> ALTER DATABASE MOVE DATAFILE ‘/u01/app/oracle/oradata/pdb2/system01.dbf’ TO ‘/tmp/system01.dbf’ REUSE;

ALTER DATABASE MOVE DATAFILE ‘/u01/app/oracle/oradata/pdb2/system01.dbf’ TO ‘/tmp/system01.dbf’ REUSE

*

ERROR at line 1:

ORA-01516: nonexistent log file, data file, or temporary file “29”

SQL>

حال اگر به PDB متصل شویم در آن سطح می توان عملیات فوق را انجام داد :

SQL> ALTER SESSION SET container=pdb2;

Session altered.

SQL> ALTER DATABASE MOVE DATAFILE ‘/u01/app/oracle/oradata/pdb2/system01.dbf’ TO ‘/tmp/system01.dbf’ REUSE;

Database altered.

SQL>

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id = 29;

FILE_ID FILE_NAME

———- ———————————————————————-

۲۹ /tmp/system01.dbf

SQL>

SQL> ALTER DATABASE MOVE DATAFILE 29 TO ‘/u01/app/oracle/oradata/pdb2/system01.dbf’ REUSE;

Database altered.

SQL>

SQL> SELECT file_id, file_name FROM dba_data_files WHERE file_id = 29;

FILE_ID FILE_NAME

———- ———————————————————————-

۲۹ /u01/app/oracle/oradata/pdb2/system01.dbf

SQL>ALTER SESSION SET container=cdb1;

SQL> ALTER SESSION SET container=CDB$ROOT;

Session altered.

SQL>

نکته: جای تعجب نیست که این دستور در خصوص TEMP DATAFILE ها کار نمی کند.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *