دیتابیس اوراکل

۵ مطلب در مهر ۱۳۹۷ ثبت شده است

یک سری جداول وجود دارند که لازم است پارتیشن های آنها به صورت دوره ای پاک شوند. مثلا یک policy میگذاریم که اگر از ایجاد هر پارتیشن 4 ماه گذشته باشد، آن پارتیشن drop شود. با استفاده از مراحل زیر میتوان این کار را انجام داد:


1- یک جدول بنام list_drop_part ایجاد میکنیم و لیست جداولی که قرار است پارتیشن های آنها drop شود و همچنین policy که برای drop شدن پارتیشن ها وجود دارد را به آن جدول اضافه میکنیم.

create table c##usr1.list_drop_part

( tab_own  varchar2(128 byte),

 tab_name varchar2(128 byte),

 interval number) ;


نکته1) برای هر جدول جدید، اگر لازم است پارتیشن های آن drop شود باید نام آن به list_drop_part اضافه شود.


2- یک جدول با نام result_drop_part ایجاد میکنیم که اطلاعات پارتیشن های drop شده در آن ریخته میشود.


create table c##usr1.result_drop_part

( tab_own    varchar2(128 byte),

  tab_name   varchar2(128 byte),

  part_name  varchar2(128 byte),

  high_value date,

  exec_date  date);



3- با استفاده از پکیج زیر میتوانیم پارتیشن های جداولی را که به list_drop_part اضافه شده اند ، بر اساس policyهای معین شده حذف نماییم.

drop_partition_pkg


نکته2) برای اجرای پکیج بالا باید grantهای زیر به کاربر c##usr1 داده شود.

grant drop any table to c##usr1 container=all;

grant select on dba_tab_partitions to c##usr1 container=all;


    4- میتوانیم یک job ایجاد کنیم که به صورت دوره ای اجرا شود. این job برای پاک کردن پارتیشن ها لازم است یکی از پروسیجرهای drop_partition_pkg را به صورت زیر فراخوانی کند.


execute c##usr1.drop_partition_pkg.drop_spec_part_prc;


  • راهله شاکری

بعضی وقتها شرایطی پیش میاد که میخواهیم فقط یک یا چند PDB خاص را با استفاده از بکاپی که از آنها داریم بازیابی کنیم. مثلا PDB حذف شده است یا اینکه PDB1 وجود دارد و میخواهیم بکاپی از PDB1 را که مربوط به گذشته است ، با یک نام دیگر بازیابی و اطلاعاتی را از آن بدست آوریم.


1- در ابتدا باید یک auxiliary instance ایجاد کنیم. که این کار را میتوانیم روی همان سرور یا سرور دیگری انجام دهیم.

--Create password file for auxiliary instance

$ cd $ORACLE_HOME/dbs

$ orapwd file=orapwtest password=m#12345678 entries=5

 

--Create init file for auxiliary instance

$ vi inittest.ora


نکته 1) برای ایجاد کردن init file میتوانید از روی spfile دیتابیس source یک  pfile ایجاد کنید و بعد از ایجاد تغییرات لازم از آن به عنوان init file برای  auxiliary instance استفاده کنید.

 

2- در مرحله بعدی باید auxiliary instance را nomount کنید.


$ export ORACLE_SID=TEST 

$ echo $ORACLE_SID

$ sqlplus / as sysdba

SQL> startup nomount pfile=/u01/app/oracle/product/12.2.0/db_1/dbs/inittest.ora;

 

3- در این مرحله با استفاده از دستور RMAN duplicate میتوانیم PDB مورد نظر را بازیابی نماییم.


$ rman auxiliary sys/m#12345678

RMAN> duplicate database to 'TEST' pluggable database PDB1

2> UNTIL TIME "TO_DATE ('15-10-2018 04:40:00','dd-mm-yyyy hh24:mi:ss')"

3> backup location '/home/oracle/back/';


نکته 2) باید بکاپ تمام  archiveهایی که میخواهیم recover کنیم در مسیر بکاپ ها موجود باشد.

 

4-  بعد میتوانیم با استفاده از دستورات زیر PDB1 را از root container auxiliary instance جدا کنیم و به root container که میخواهیم متصل نماییم.


--auxiliary instance

SQL> alter pluggable database PDB1 close immediate;

SQL> alter pluggable database PDB1 unplug into '/home/oracle/pdb1.pdb';

 

--target database

SQL> create pluggable database PDB1 as clone using '/home/oracle/pdb1.pdb';

SQL> alter pluggable database PDB1 open;



Attachments

RMAN Log Output from the DUPLICATE Process

  • راهله شاکری

در موارد مختلفی شاید نیاز داشته باشیم که یک PDB را از یک root container جدا و آن را به یک root container دیگر متصل کنیم.


  • راهله شاکری
timezone یک agent بر اساس timezone سیستم عامل ست میشود، اگر timezone یک سیستم عامل را تغییر دهید برای تغییر agent timezone میتوانید بر اساس روش زیر عمل کنید:
emctl stop agent
emctl resetTZ agent

وقتی این دستور را اجرا میکنید خروجی آن به شکل زیر است :
Oracle Enterprise Manager Cloud Control 13c Release 2  
Copyright (c) 1996, 2016 Oracle Corporation.  All rights reserved.
Updating /u01/app/oracle/product/13.2.0/agent/agent_inst/sysman/config/emd.properties...
Successfully updated /u01/app/oracle/product/13.2.0/agent/agent_inst/sysman/config/emd.properties.
Login as the em repository user and run the  script:
exec mgmt_target.set_agent_tzrgn('tstdb-tst-loc-loc:3872','GMT')
and commit the changes
This can be done for example by logging into sqlplus and doing
SQL> exec mgmt_target.set_agent_tzrgn('tstdb-tst-loc-loc:3872','GMT')
SQL> commit

بعد باید به sysman متصل شوید و دستوراتی را که در بالا به آن اشاره شده است اجرا کنید:
sqlplus sysman/pass
SQL> exec mgmt_target.set_agent_tzrgn('tstdb-tst-loc-loc:3872','GMT');
SQL> commit;

برای اینکه از تغییر timezone مطمئن شوید ، میتوانید کوئری زیر را اجرا کنید:
SQL> select target_name, timezone_region from sysman.mgmt_targets where TARGET_NAME='tstdb-tst-loc-loc';

بعد از انجام این مراحل مجددا agent را start کنید.
emctl start agent


  • راهله شاکری
موقع mount کردن دیتابیس با خطای زیر مواجه شدم :

: Errors in file /u01/app/oracle/diag/rdbms/migdb/migdb/trace/migdb_rvwr_24962.trc
ORA-00600: internal error code, arguments: [krfrFix-2], [0], [2], [], [], [], [], [], [], [], [], []
2018-09-29T06:09:18.809390+00:00
.WARNING: Cannot open the flashback thread for this instance due to the above error

که توی documentها نوشته شده بود دیتابیس را به حالت mount ببرید و flashabck را off کنید، بعد دیتابیس را open کنید. ولی چون دیتابیس ما کلا موقع mount شدن با خطای بالا روبرو میشد. من راه حل زیر را انجام دادم:

;SQL> alter system reset db_recovery_file_dest
;SQL> alter database mount
;SQL> alter database flashback off
;'SQL> alter system set db_recovery_file_dest='/shst/rdb-tst
;SQL> alter database open
;SQL> alter database flashback on



  • راهله شاکری