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

اوراکل دیتاگارد

۰۶
ارديبهشت

Oracle Data Guard


· Oracle Data Guard Overview

Oracle Data Guard یکی از optionهای Oracle Database Enterprise Edition است که نیاز به نصب و لایسنس جداگانه ندارد. (برای اولین بار در اوراکل 9i معرفی شد ).


پیکربندی دیتاگارد در واقع شامل  دو بخش کلی میشود :

1- دیتابیس production یا primary : دیتابیسی که بوسیله بیشتر اپلیکیشن ها قابل دسترسی است . دیتابیس اصلی میتواند RAC باشد یا Single Instance .

2- دیتابیس یا دیتابیس های استندبای : در واقع یک کپی از دیتابیس اصلی است. همانند دیتابیس اصلی ، دیتابیس استندبای هم میتواند RAC باشد یا Single Instance . با استفاده از بکاپ دیتابیس اصلی شما میتوانید تا حداکثر 30 دیتابیس استندبای ( در 11gr2 ) ایجاد کنید.

دیتابیس ها در پیکربندی Data Guard  با استفاده از Oracle Net به هم متصل میشوند . هیچ محدودیتی از این جهت که دیتابیس ها کجا میتوانند باشند وجود ندارد، مثلا شما میتوانید یک استندبای را روی همان سیستمی کانفیگ کنید که دیتابیس اصلی قرار دارد و استندبای دیگر را روی سیستمی که از لحاظ جغرافیایی در فاصله ای دورتر از دیتابیس اصلی قرار دارد.

 

  • راهله شاکری

یکی از مواردی که همواره در پایگاه داده ها مطرح است پرشدن یک ستون با استفاده از اعداد پشت سر هم است . در این خصوص راه کارهای زیادی در پایگاه داده اوراکل وجود دارد که یکی از آنها استفاده از sequence می باشد، در نسخه های قبل از 12C برای پر کردن ستون ها به وسیله sequence یا باید موقع وارد کردن رکورد از nextval استفاده کرد و یا با استفاده از trigger اینکار را انجام داد. در نسخه 12C این امکان وجود دارد که از sequence وتابع nextval در قسمت default ستون استفاده شود.


;create sequence test_seq


create table my_tab

(

, id number default test_seq.nextval

  (name varchar2(20

;(


;('insert into my_tab (name) values('aaaa

;commit


;select * from my_tab

                ID   NAME

---------- --

        1aaaa


  • راهله شاکری

HugePage

۳۰
آذر

وقتی که یک پروسس میخواهد از memory استفاده کند ، CPU  یک تکه از RAM را به آن اختصاص میدهد. در واقع CPU به اندازه یک  4k bytes ) chunk ) حافظه را به CPU اختصاص میدهد. هر یک از اون chunkها یک page نامیده میشوند.

از اونجایی که آدرس فضایی که به یک پروسس اختصاص داده میشود ( همان pageها )  به صورت virtual است ، CPU و OS مجبور هستند که به خاطر بسپارند که هر page به چه process اختصاص دارد و  در کجا ذخیره شده است.

اگر تعداد pageها زیاد باشد ، این موضوع زمان زیادی میبرد و همچنین فضای زیادی اشغال میشود.

فرض کنید یک پروسس به 1G از ram نیاز دارد. اگر این 1G را بر اون 4K تقسیم کنیم ، باید در page table به اندازه  262144  ، entry وارد شود (1GB/4K) . اگر فرض کنید هر entry در Page Table  حدود 8bytes فضا مصرف میکند کل فضایی که فقط برایی ذخیره آدرس فیزیکی مصرف شده است  (2MB(262144*8 است. که وقتی تعداد پروسس ها زیاد شود هم فضای زیادی اشغال میشود هم جستجو در این page table سخت تر میشود.

 

در حال حاضر در معماری CPUهای جدید ، Pageها میتوانند اندازه بزرگتری داشته باشند.

نکته 1 ) اگر hardware شما پشتیبانی کند سایز Huge Page حداکثر میتواند 1G باشد.

  • راهله شاکری

‫‫‫‫‫‫‫‫‫‫‫‫temporary tablespace ها شامل داده های ناپایدار هستند ، داده هایی که طول عمر آنها تنها محدود به طول عمر یک session میشود.                                                                                              

به طور مثال اگر ما یک sort داشته باشیم که در حافظه (RAM) جا نشود ، اوراکل برای انجام آن sort  از فضای temporary tablespace (که روی دیسک قرار دارد) استفاده میکند.  درواقع از فضای temporary tablespace  برای ذخیره کردن موارد زیر استفاده میشود :

         Intermediate sort results -

         Temporary tables and temporary indexes -

         Temporary LOBs -

         Temporary B-trees -

 

  • راهله شاکری

در نسخه 12CR1  یک پارامتر جدیدی بنام LOGTIME  به DataPump اضافه شده است، که باعث میشود پیغام هایی که در طول عملیات export و import می آیند به همراه یک timestamp نمایش داده شوند.                   

کاربرد :

شما میتوانید با استفاده از این timestamp متوجه شوید که زمان سپری شده بین فازهای مختلف عملیات DataPump چقدر است . چنین اطلاعاتی میتواند در تشخیص مشکلات مربوط به Performance و همچنین تخمین زمان عملیات های مشابه در آینده مفید واقع شود.


مقادیری که میتوان به این پارامتر اختصاص داد به شرح زیر میباشد :

-          NONE : در طول عملیات export/import یا در logfile هیچ timestamp نمایش داده نشود ( که به صورت پیش فرض این گزینه فعال میباشد)

-          timestamp : STATUS فقط در هنگام اجرای عملیات export/import نمایش داده شود.

-          timestamp : LOGFILE فقط در logfile نمایش داده شود.

-          ALL : هم در logfile ، هم هنگام اجرای عملیات export/import نمایش داده شود.   

 

مثال :

expdp  scott/tiger  directory=DATA_PUMP_DIR  dumpfile=SCOTT.dmp  logfile=SCOTT.log  LOGTIME=ALL

 

قسمتی از خروجی دستور بالا به صورت زیر است :

16-JUL-16 11:18:47.254: Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/******** directory=DATA_PUMP_DIR dumpfile=SCOTT.dmp logfile=SCOTT.log LOGTIME=ALL

16-JUL-16 11:18:48.321: Estimate in progress using BLOCKS method...

16-JUL-16 11:18:53.041: Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA….

 

 

n        منابع 


1-https://docs.oracle.com/database/121/SUTIL/GUID-56B6B4EA-5A2B-45B8-9B41-8966378C2C3D.htm#SUTIL4281

2-https://oracle-base.com/articles/12c/data-pump-enhancements-12cr1

 

 

  • راهله شاکری

در دیتابیس اوراکل ، شما ممکن است هنگام اجرای (DataPump job (expdp or impdp  با خطاهای زیر مواجه شوید:


ORA-31634: job already exists

ORA-31664: unable to construct unique job name when defaulted

 

این خطا به دلایل زیر رخ میدهد :

-  در دستور  expdp/impdp از یک JOB_NAME مشخص استفاده نکرده باشید و datapump مجبور شود که از یک نام پیش فرض استفاده کند و آن نام به هر دلیلی از قبل وجود داشته باشد. 

-  یا اینکه چند datapump job را با هم به صورت همزمان اجرا کرده باشید و تعداد آن jobها بیشتر از 99 تا باشد ، در چنین حالتی datapump نمیتواند یک job جدید ایجاد کند.


در چنین حالتی برای رفع این مشکل یا باید از یک JOB_NAME مشخص در دستور expdp/impdp استفاده کنید:

expdp system/system SCHEMA=scott DIRECTORY=data_pump_dir DUMPFILE=exp_scott.dmp JOB_NAME=exp_jo

 

و یا اینکه JOBهای قبلی را که وضعبت آنها NOT RUNNING است و اصطلاحا به آنها orphaned datapump jobs گفته میشود را حذف نمایید، که برای اینکار باید مراحل زیر را طی کنید:

1)       شناسایی datapump jobهای موجود در دیتابیس که وضعیت آنها NOT RUNNING است.

 select owner_name, job_name, operation, job_mode, state,     attached_sessions

  from dba_datapump_jobs

 'where owner_name = '&SCHEMA

    'and state = 'NOT RUNNING

  ;order by 1, 2

بجای &SCHEMA باید نام اسکیمایی که expdp/impdp با آن انجام میشود نوشته شود.

 

2)       شناسایی جداول اصلی مرتبط  با آن jobها

  select o.status, o.object_id, o.object_type, o.owner||'.'||object_name "OWNER.OBJECT",o.created,j.state

   from dba_objects o, dba_datapump_jobs j

 where o.owner=j.owner_name

    and o.object_name=j.job_name

    'and o.owner='&SCHEMA

    'and j.state='NOT RUNNING

  ;order by 4,2

 

3)       پاک کردن جداولی که در مرحله 2 تولید شده اند. 

;<drop table <tablename

 

n        منابع 


1- http://oracledba-duniya.blogspot.com/2013/05/resolving-ora-31634-job-already.html 

2- Running DataPump Jobs Results In ORA-31634 ORA-31664 (Doc ID 138416)

  • راهله شاکری

تا قبل از اوراکل 12C ، ماکزیمم سایزی که برای data typeهای VARCHAR2, NVARCHAR2 ,RAW میشد در نظر گرفت به صورت زیر بود:


 VARCHAR2 : 4000 bytes -   

NVARCHAR2 : 4000 bytes -   

RAW : 2000 bytes -   


از اوراکل 12C ، ماکزیمم مقادیر این پارامترها به صورت زیر تغییر پیدا کرده است :


   - VARCHAR2 : 32767 bytes

   - NVARCHAR2 : 32767 bytes

   - RAW : 32767 bytes


برای اینکه بتوانید از مقادیر جدید این پارامترها در اوراکل 12C  استفاده کنید باید مقدار پارامتر  MAX_STRING_SIZE  را از STANDARD  به  EXTENDED  تغییر دهید .


   CONN / AS SYSDBA

   SHUTDOWN IMMEDIATE;

   STARTUP UPGRADE;

   ALTER SYSTEM SET max_string_size=extended;

   @?/rdbms/admin/utl32k.sql

   SHUTDOWN IMMEDIATE;

   ;STARTUP   

   

نکته 1)  شما نمیتوانید مجددا مقدار پارامتر MAX_STRING_SIZE را از EXTENDED  به STANDARD  تغییر دهید.

نکته 2)  در صورت تغییر سایز DataTypeها نمی توانید مجددا سایز رو به مقدار قبلی تغییر بدهید.

  • راهله شاکری