تجربیات کاری چند دوست

در این وبلاگ تجربیاتی که در حین کار بدست آورده ایم را به اشتراک خواهیم گذاشت

تجربیات کاری چند دوست

در این وبلاگ تجربیاتی که در حین کار بدست آورده ایم را به اشتراک خواهیم گذاشت

تجربیات کاری چند دوست
آخرین نظرات
  • ۱۶ مرداد ۹۸، ۰۱:۰۰ - علی جهان نما
    عالی بود

ممکن است گاهی متوجه عملیات مرتب سازی (SORT) در دستورات خود نشوید.SORT معمولا در موارد زیر استفاده می شود:

  •       CREATE INDEX
  •       GROUP BY
  •       ORDER BY
  •       INTERSECT
  •       MINUS
  •       UNION
  •       DISTINCT
  •       Unindexed table joins
  •       Some correlated subqueries
 
ههدف شما می بایست همیشه کاهش یا حذف SORT در دستور SQL  باشد.استفاده از SORT در لایه application اتفاق می افتدبنابراین برنامه نویس باید به گونه ای دستورSQL  خود را بنویسد که از SORTهای ناخواسته جلوگیری شود.نکاتی در ذیل مطرح می شود که باید در کد ملاحظه کرد:

1-  از distinct اجتناب کنید مگر اینکه واقعا نیاز باشد.

2-  از UNION ALL به جای UNION استفاده شود مگر اینکه نیاز باشد رکوردهای مشابه حذف گردند.

3- سعی کنید از HASH JOIN بجای SORT_MERGE_JOIN استفاده شود.ضمنا استفاده از HINTها باعث می شود OPTIMIZER از INDEX HINT های مناسب استفاده کند تا از SORTها جلوگیری شود.مثلا cost based optimizer  از عملیات SORT اجتناب می کند وقتیکه FIRST_ROWS hint استفاده شود.

4-  از مناسبترین ایندکسها در کد خود استفاده کنید.

چنانچه در مانیتورینگ با مشکلاتی ناشی از SORT مواجه شدید افزایش مقدار پارامتر SORT_AREA_SIZE متناظر با میزان کل فضای حافظه قابل ملاحظه است.


  • حسین مومنی

برای بازگردانی اطلاعات در فرآیند ریکاوری Rman پس از دستور restore database  می توانیم از دستور Recover database until available redo استفاده کنیم که از ویژگیهای اوراکل نسخه 12 می باشد.در نسخه های قبل، پس از دستور recover database ممکن بود به دلیل مواجه شدن با مشکل، ریکاوری ناتمام بماند و مجبور بودیم به محیط sqlplus سوئیچ کرده و برای اتمام فرآیند از دستور recover database using backup controlfile until cancel استفاده کنیم ویا متناظر با archivefile دچار مشکل از عبارت until time و یا until sequence استفاده کنیم.اما در نسخه 12cR2 پس از اجرای دستور Recover database until available redo فرآیند ریکاوری بطور اتوماتیک تا آخرین log موجود انجام می شود و از بروز خطاهای RMAN-06053: unable to perform media recovery because of missing log و(بطور مثال) RMAN-06025: no backup of archived log for thread 1 with sequence 1 and starting SCN of 543788891 found to restore جلوگیری می شود.

  • حسین مومنی

Cache Fusion

مکانیزمی در رک که بلاکها  از حافظه یک instance به حافظه instance دیگری کپی می شود. هنگامیکه یک user process بدنبال بلاکهایی برای انجام عملیات مورد درخواست کاربر می باشد ممکن است بلاکهای مورد نیاز در حافظه ی نود دیگری موجود باشد که در این مکانیزم با دسترسی به buffer cache نود دیگر  پاسخگویی به فرآیند موجود تسریع می گردد.ضمنا در این مکانیزم از تداخل فرآیندهای مربوط به کاربران و دستورات sql جلوگیری می شود.


 (Global Cache Service (GCS

پروسسی که cache fusion را پیاده سازی می کند و مسئول انتقال بلاکها مابین instanceها می باشد.


 Voting disk

یک فایل است که اطلاعاتی را مورد node ها ارائه می کند.Oracle Clusterware برای اینکه مشخص کند کدام instanceها اعضای یک cluster  هستند از voting disk  استفاده می کند.Voting disk باید در shared disk ها قرار داشته باشند و توصیه می شود حداقل سه voting disk در پیکره بندی رک وجود داشته باشد.

 

(Oracle Cluster Registry (OCR

برای نگهداری و مدیریت اطلاعات در مورد کامپوننتهایی که oracle clusterware را کنترل می کنند ( مانند دیتابیسهای موجود در رک ، listener ها، VIPها، سرویسها و applicationها ) از OCR استفاده می شود.OCR می بایست در shared disk قرار داشته باشد تا توسط همه node ها در کلاستر قابل دسترسی باشد.

 

(Cluster Ready Services (CRS

CRS برنامه اصلی برای مدیریت رک جهت افزایش دسترسی به دیتابیس در کلاستر می باشد.هر چیزی که پردازه CRS مدیریت می کند بعنوان cluster resource شناخته می شود که می تواند یک دیتابیس،instance،service،listener،virtual IP address یا یک application process باشد.CRS موارد مذکور را  بر اساس اطلاعات پیکره بندیشان که در OCR ذخیره شده است ، مدیریت می کند.


(Cluster Synchronization Services (CSS

پیکره بندی کلاستر را با کنترل نودهایی که عضو کلاستر هستند مدیریت می کند و به دیگر node ها اتصال و قطعی nodeهای دیگر را اعلان می کند.

 

(Event Management (EVM

یک background process است که eventهای ایجاد شده توسط oracle clusterware را منتشر می کند.

 

(Global Dynamic Performance views (GV$

ویوهایی که اطلاعاتی را در خصوص instance های موجود در رک ارائه می کنند.


(Grid Naming Service (GNS

سرویسی برای mapping نام host ها به IP در DNS zone


(Transparent Application Failover (TAF

یکی از ویژگیهای موجود در رک  است که چنانچه اتصال مابین client applicationها  و دیتابیس قطع شود بطور خودکار reconnect انجام می گردد.

  • حسین مومنی

در اوراکل 12c امکان ثبت رویدادنگاری از دستورات DDL وجود دارد ، البته این امکان در 11g نیز وجود داشت ولی در نسخه جدید رویدادنگاری ها جدای از alert log دخیره میشوند . با این امکان میتوان متوجه شد که چه تغییراتی توسط چه کسی و در چه زمانی بر روی پایگاه داده اعمال شده است . بزای فعالسازی این امکان باید پارامتر ENABLE_DDL_LOGGING را فعال کنیم ، این پارامتر میتواند در سطح دیتابیس یا سشن فعال شود . پس از فعال شدن این پارامتر تمام دستورات DDL در قالب یک فایل XML و یک لاگ فایل در مسیر  ORACLE_BASE/diag/rdbms/DBNAME/log|ddl$  ذخیره خواهند شد. یک فایل XML شامل اطلاعاتی نظیر دستور DDL ، آدرس IP ، زمان اجرا و ... میباشد .

دستور فعال سازی DDL logging : 

ALTER SYSTEM|SESSION SET ENABLE_DDL_LOGGING=TRUE;

در صورت فعال سازی دستورات زیر رویدادنگاری خواهند شد :

CREATE|ALTER|DROP|TRUNCATE TABLE
DROP USER
CREATE|ALTER|DROP PACKAGE|FUNCTION|VIEW|SYNONYM|SEQUENC

بیشتر بخوانید :

enable_ddl_logging Tips in Oracle 11g


  • صادق جوانمرد

تا پیش از اوراکل 12 چنانچه بخواهید برای ستونی از یک جدول Defaul Value تعیین کنید، باید یک Trigger و Sequence ایجاد شود؛ تا هنگام Insert در جدول مورد نظر، Trigger  اجرا شود و با اضافه شدن  Sequnce،  مقدار آن در ستون مورد نظر قرار گیرد، مانند مثال زیر :

CREATE TABLE Person (
ID NUMBER(10) NOT NULL,
… );

ALTER TABLE departments ADD (
CONSTRAINT person_pk PRIMARY KEY (ID));

CREATE SEQUENCE person_seq START WITH 1;

CREATE OR REPLACE TRIGGER person_trgr
BEFORE INSERT ON Person
FOR EACH ROW

BEGIN
SELECT person_seq.NEXTVAL
INTO :new.id
FROM dual;
END;

ولی در اوراکل 12C نیازی به ساختن Trigger نیست و میتوان تنها با استفاده از Sequence برای ستون مورد نظر Default Value تعیین کرد. به عنوان مثال :

CREATE SEQUENCE person_seq;

CREATE TABLE Person (
ID NUMBER(10) DEFUALT person_seq.NEXTVAL,
… );

  • محمد جعفری

در نسخه های پیشین شما تحت هیچ شرایطی امکان تعریف چند ایندکس روی یک ستون یا یک مجموعه از ستونهای مشترک را نداشتید . اوراکل 12c R1 این امکان را به شرط متفاوت بودن نوع ایندکس ها فراهم کرده است . البته همچنان اوراکل فقط از یک ایندکس که اصطلاها به آن فعال یا آشکار -active/visible- گفته میشود استفاده خواهد کرد . در صورتی که بخواهید ایندکس های پنهان نیز به کار گرفته شوند باید مقدار پارامتر OPTIMIZER_USE_INVISIBLE_INDEXES را برابر true قرار دهید .

مثالی از ساخت ایندکس ها :

create index idx_person_1 on person(national_code,gender);
create bitmap index idx_peson_2 on person(national_code,gender) invisible;

بیشتر بخوانید :

Multiple Indexes on the Same Set of Columns in Oracle Database 12c Release 1


  • صادق جوانمرد

با استفاده از دستور زیر میتوان درصد پیشرفت RMAN در هر کانال را مشاهده نمود.


Select opname ,(sofar/totalwork)*100 as percent from v$session_longops where opname like '%RMAN%' and opname not like '%aggr%';

  • حامد اسماعیلی

تعداد  Redolog های تولید شده به تفکیک ساعت


select to_char(first_time,'YYYY-MM-DD') day,

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'00',1,0)),'9999') "00",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'01',1,0)),'9999') "01",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'02',1,0)),'9999') "02",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'03',1,0)),'9999') "03",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'04',1,0)),'9999') "04",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'05',1,0)),'9999') "05",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'06',1,0)),'9999') "06",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'07',1,0)),'9999') "07",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'08',1,0)),'9999') "08",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'09',1,0)),'9999') "09",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'10',1,0)),'9999') "10",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'11',1,0)),'9999') "11",

to_char(sum(decode(substr(to_char(first_time,'HH24'),1,2),'12',1,0)),'9999') "12",

  • بهزاد حیدرزاده

Blockers_Tree

۰۴
بهمن

با استفاده از اسکریپت زیر می توان blocker و session هایی که lock شده اند را پیدا و سپس blocker  اصلی را kill  کرد.


REM Blocking Tree IN Database

WITH sessions AS

     (SELECT /*+materialize*/

             sid, blocking_session, row_wait_obj#, sql_id

        FROM v$session)

  SELECT LPAD(' ', LEVEL ) || sid sid, object_name,

         substr(sql_text,1,40) sql_text

    FROM v$session

    LEFT OUTER JOIN dba_objects

         ON (object_id = row_wait_obj#)

    LEFT OUTER JOIN v$sql

         USING (sql_id)

   WHERE sid IN (SELECT blocking_session FROM v$session)

      OR blocking_session IS NOT NULL

   CONNECT BY PRIOR sid = blocking_session

   START WITH blocking_session IS NULL;

  • بهزاد حیدرزاده

برای چک کردن corruption  در datafileها ،archivefileها ، controlfileها و spfile  می توانید از Rman استفاده نمایید.ضمنا می توانید مشخص کنید که یک backupset قابل restore می باشد یا خیر.دستور RMAN VALIDATE برای چک کردن موارد ذکر شده کاربرد دارد.

VALIDATE

BACKUP…VALIDATE

RESTORE…VALIDATE

طریقه استفاده از دستور به صورت زیر است:

Rman>validate database;

و برای اعتبارسنجی controlfile:

RMAN>validate current controlfile;

برای چک کردن آرشیو فایلها:

RMAN>validate archivelog all;

بصورت ترکیبی هم در دستور می توان چک کردن آیتمهای مختلف را بیان کرد:

RMAN>validate check logical database include current controlfile plus archivelog

  • حسین مومنی