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

دیتابیس اوراکل
طبقه بندی موضوعی

۴ مطلب در تیر ۱۴۰۱ ثبت شده است

پاک کردن یک یا چند ستون از جدول

اگر بخواهیم یک یا چند ستون را از یک جدول حذف کنیم، میتوانیم با دستور alter table drop column این کار را انجام دهیم که به صورت فیزیکالی جدول را حذف میکند ولی اگر سایز جدول زیاد باشد، این کار خیلی طول میکشد و ممکن است روی دیتابیس لود هم بگذارد.

یک راه حل دیگر این است که با دستور زیر ستون را از جدول حذف کنیم:

alter table R.TAB1 set unused column DATE1;

 

با این کار ستون به صورت logical از جدول حذف میشود و برای کاربرها قابل مشاهده نخواهد بود. بعدا اگر فرصت مناسبی پیش آمد، میتوان با دستور زیر ستون را به صورت فیزیکالی هم از جدول حذف کرد:

alter table R.TAB1 drop unused columns checkpoint 500;

 

برای جداول بزرگ برای اینکه حجم undo segmentها را کم کنیم، با استفاده از عبارت CHECKPOINT میتوانیم مشخص کنیم، بعد از این تعداد سطر، یک checkpoint انجام شود.

با استفاده از ویوی زیر میتوانیم به ازای هر جدول تعداد ستونهایی که unused شده اند را مشاهده کنیم:

select * from DBA_UNUSED_COL_TABS;

COUNT

TABLE_NAME

OWNER

2

TAB1

R

1

TAB_LOG

H

 

 

 

 

 

 

 

 

برای آزاد کردن فضا بعد از پاک کردن ستون میتوانیم از دستور زیر استفاده کنیم:

alter table R.TAB1 move online;

 

 

RMAN-03009, ORA-19566: exceeded limit of 0 corrupt blocks for file

Error:

RMAN-03009: failure of backup command on DISK02 channel at 06/15/2022 01:44:04
ORA-19566: exceeded limit of 0 corrupt blocks for file +DATA/DB1/DATAFILE/tab_index.260.1104075295

 

Solution (Resizing the datafile to Smaller size):

SQL> alter database datafile '+DATA/DB1/DATAFILE/tab_index.260.1104075295' resize 946368M;

 

RMAN-06613: Connect identifier for DB_UNIQUE_NAME not configured

موقع بکاپ گرفتن از دیتابیس گارد خطای زیر را در RMAN گرفتیم:

ORA-20079: full resync from primary database is not done

 

doing automatic resync from primary

resyncing from database with DB_UNIQUE_NAME PRIMARY

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03015: error occurred in stored script bk_primary

RMAN-03002: failure of sql command at 06/28/2022 20:00:05

RMAN-03014: implicit resync of recovery catalog failed

RMAN-03009: failure of partial resync command on default channel at 06/28/2022 20:00:05

RMAN-06613: Connect identifier for DB_UNIQUE_NAME STANDBY not configured

 

برای حل این خطا در دیتابیس primary باید دستور زیر اجرا شود:

[oracle@PRIMARY ~]$ rman target / catalog user@CATALOG

RMAN> configure db_unique_name 'STANDBY' connect identifier 'STANDBY';

 

starting full resync of recovery catalog

full resync complete

new RMAN configuration parameters:

CONFIGURE DB_UNIQUE_NAME 'STANDBY' CONNECT IDENTIFIER  'STANDBY';

new RMAN configuration parameters are successfully stored

starting full resync of recovery catalog

full resync complete

 

و همچنین در دیتابیس استندبای دستور زیر اجرا شد:

[oracle@STANDBY ~]$ rman target / catalog user@CATALOG

RMAN> resync catalog;

 

starting partial resync of recovery catalog

partial resync complete

 

 

reliable message wait event

در دیتابیسی با ورژن 11.2.0.4 لود از نوع other داشتیم، که با کلیک روی آن مشخص شد wait event مربوط به آن از نوع reliable message است:

در AWR Report هم به صورت زیر مشخص است:

 

در داکیومنت Document 1951729.1 گفته شده است اگر این event را مشاهده کردید، ابتدا کوئری زیر را اجرا کنید:

SELECT CHANNEL, SUM (wait_count) sum_wait_count

  FROM GV$CHANNEL_WAITS

 GROUP BY CHANNEL

 ORDER BY SUM (wait_count) desc;

 

 

همانطور که در نتیجه کوئری بالا مشخص است، بیشترین مقدار کوئری بالا مربوط به Result Cache Channel است، که طبق داکیومنت، این یک باگ است که 3 راه حل دارد:

1. آپگرید به ورژن بالاتر

2. Apply کردن patch 18416368 (در صورتی که برای platform و version شما در دسترس باشد)

3. disable کردن Result Cache به صورت زیر:

SQL> alter system set result_cache_max_size=0;

 

در دیتابیس ما result cache فعال بود ولی استفاده ای از آن نمیشد، اگر میخواستیم با استفاده از روش سوم result cache را disable کنیم، برای اعمال آن نیاز بود که instance ریستارت شود و چون نمیخواستیم این اتفاق بیفتد به صورت زیر result cache را disable کردیم (در RAC این دستور باید در همه نودها اجرا شود):

BEGIN

   DBMS_RESULT_CACHE.BYPASS(TRUE);

   DBMS_RESULT_CACHE.FLUSH;

END;  

 

با استفاده از فانکشن زیر میتوانیم وضعیت result cache را در دیتابیس مشاهده کنیم:

select DBMS_RESULT_CACHE.STATUS from dual;

 

STATUS

BYPASS