Oracle Instance

می 15, 2008

Oracle Instance به مجموعه Background Processهای اوراکل و حافظه SGA اتلاق می گردد. هر Oracle Instance باید در نهایت یک و تنها یک دیتابیس را اصطلاحاً mount و سپس Open نماید. به عبارت دیگر Instance زمانی به طور کامل بالا می آید که یک دیتابیس را mount و سپس Open کرده باشد. از طرفی هیچ Instanceی نمی تواند بیش از یک دیتابیس را Open کند.

در پیکربندی RAC (یا به طور کاملتر Real Application Clusters) وجود چند Instance به ازای یک دیتابیس مجاز است. در این پیکربندی معمولاً چند Instance روی چند سیستم جداگانه بالا می آیند و همزمان به یک دیتابیس متصل می شوند که باعث افزونگی، تقسیم لود کاری و کاهش تاخیر دسترسی خواهد شد. پیکربندی RAC فعلاً از حوزه بحث ما خارج است.

بالا آوردن و پائین بردن Instance توسط Database Administrator یا به اختصار DBA انجام می گیرد. کاربران با Privilege کاربری SYSDBA و SYSOPER می توانند این قبیل عملیات را انجام دهند. نامهای کاربری و کلمات عبور کاربران در اوراکل همچون دیگر اطلاعات در data fileهای دیتابیس نگهداری می شوند اما اوراکل چگونه می تواند برای مثال در زمان بالا آوردن دیتابیس برای احراز هویت DBA به دیتابیسی که هنوز بالا نیامده رجوع کند. پاسخ این سوال آنستکه SYSDBA و SYSOPER و کلمه عبور مربوطه در Password Fileها نگهداری می شوند و نه مانند دیگر نامهای کاربری در data fileها. بنابراین Instance می تواند قبل از mount کردن دیتابیس و Open کردن آن کاربر SYSDBA و یا SYSOPER را احراز هویت کند. برای بالا آوردن Instance ابتدا باید با عنوان SYSDBA به سیستم Login کنیم:

sqlplus “sys/syspassword as SYSDBA”

کلمه عبور syspassword همان کلمه عبوریست که برنامه نصاب اوراکل در هنگام نصب می پرسد. در صورتیکه با نام کاربری که جزو گروه dba باشد وارد سیستم شده باشید، نیازی به وارد کردن نام کاربری و کلمه عبور نیست:

sqlplus “/ as SYSDBA”

پس از وارد شدن با عنوان sysdba می توانیم Instance را با وارد کردن دستور startup بالا بیاوریم. مراحل بالا آمدن Instance به ترتیب ذیل است:

  • خواندن فایل Initialization Parameter File (موسوم به Init ORA چرا که معمولاً نام این فایل init.ora است)
  • Mount کردن دیتابیس
  • باز کردن (یا Open کردن) دیتابیس

 

1- خواندن فایل Initialization Parameter File

اولین کاری که بعد از وارد کردن دستور startup انجام می شود، خواندن فایل Initialization Parameter File است که مسیر آن را می توان به عنوان آرگومان به اوراکل داد. در لینوکس، به صورت پیش فرض، این فایل را می توان از مسیر ORACLE_HOME/dbs و در ویندوز از مسیر ORACLE_HOME\database و با نام init${ORACLE_SID}.ora یافت.

فایل Initialization Parameter File یک فایل متنی است (قابل ویرایش با vi یا notepad) که شامل یک سری مقادیر اولیه برای پارامترهای اساسی اوراکل است، که مسیر فایلها، مقدار حافظه و … را برای Instance اوراکل مشخص می کنند:

DB_BLOCK_SIZE=4096  #this is a comment
DB_CASHE_SIZE=512M
DB_FILES=500
DB_NAME=’MY_ORA_DB’

از نسخه 9i به بعد، به جای فایل Initialization Parameter File از فایل Server Parameter File که حالت باینری دارد، نیز می توان استفاده کرد. فایل Server Parameter File یا به اختصار SPFile از همان فایل Initialization Parameter File ساخته می شود1. تغییر پارامترها در Initialization Parameter توسط هر ادیتور متنی امکانپذیر است اما ویرایش SPFile توسط ادیتور متنی ممکن نیست. اغلب پارامترها را می توان پس از بالا آمدن سیستم توسط دستور ALTER SYSTEM تغییر داد. در صورتی که از Initialization Parameter File استفاده می کنید، این تغییرات تا زمان پائین آوردن Instance معتبر هستند و در داخل Initialization Parameter File منعکس نمی شوند ولی اگر از SPFile استفاده می کنید، با استفاده از آرگومان SCOPE می توان تغییرات در SPFILE منعکس نمود. برای مثال دستور زیر پارامتر JOB_QUEUE_PROCESSES را تنها روی Instance تغییر می دهد:

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=50 COMMENT=’Change on Nov 29th – Ref 12345′ SCOPE=MEMORY;

اما دستور زیر پارامتر را روی Instance در حال اجرا تغییر نمی دهد و آن را تنها روی SPFile دیسک تغییر می دهد. بدیهی است که این تغییرات در بالا آمدن بعدی Instance اعمال می شوند.

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=50 COMMENT=’Change on Nov 29th – Ref 12345′ SCOPE=SPFILE;

دستور زیر تغییرات روی پارامتر مذبور را هم روی Instance در حال اجرا و هم روی SPFile اعمال می کند

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=50 COMMENT=’Change on Nov 29th – Ref 12345′ SCOPE=BOTH;

در اوراکل 9i به بعد فایل SPFILE بر فایل Initialization Parameter File مقدم است. یعنی اگر برای مثال ORACLE_SID برابر test باشد و در مسیر ORACLE_HOME\dbs دو فایل با نامهای inittest.ora و spfiletest.ora وجود داشته باشند، فایل spfiletest.ora دارای اولیت بیشتری است. در واقع ترتیب جستجوی Parameter File پس از وارد کردن دستور startup به صورت زیر است:

  • جستجوی فایل با نام spfile$ORACLE_SID.ora را در مسیر ORACLE_HOME/dbs
  • جستجوی فایل با نام spfile.ora در همان مسیر
  • جستجوی فایل با نام init$ORACLE_SID.ora در همان مسیر

در صورتی که مایل باشیم می توان نام و مسیر Parameter File را به عنوان آرگومان دستور startup به آن اعلام کرد:

startup PFILE=’/app/oracle/product/9.2.0/dbs/some_pfile.ora’

نکته جالب آنکه معادل startup SPFILE=path این دستور وجود ندارد. برای بالا آوردن instance با یک SPFILE که نام آن به صورت spfile$ORACLE_SIDE نیست یا در مسیر پیش فرض قرار ندارد، باید به این صورت عمل کنیم که یک فایل متنی Parameter File می سازیم که تنها دارای یک خط است و در این خط عبارت زیر را وارد می کنیم:

SPFILE = some path to spfile

حال اگر مسیر فایل PFile فوق را به عنوان آرگومان PFILE دستور startup وارد کنیم، اوراکل به سراغ SPFile خواهد رفت.

 

2- Mount کردن دیتابیس

قدم دوم یعنی Mount کردن دیتابیس، به این ترتیب انجام می شود که Instance از روی پارامتر CONTROL_FILES که از فایل Init Ora خوانده است، Control Fileهای دیتابیس را شناسائی کرده و آنها را باز می کند. Control Fileهای دیتابیس اطلاعات متادیتا مربوط به دیتابیس همچون نام و مسیر دیتا فایلها، کاراکتر سِت دیتابیس و … را در خود نگهداری می کنند. Instance از روی Control Fileهای دیتابیس، نام و مسیر Data Fileها و Redo Log Fileها را می خواند. در این مرحله دیتابیس آماده باز شدن است. توجه کنید که در این مرحله اوراکل نام و مسیر Data Fileها را می داند اما هنوز به سراغ آنها نرفته است. بنابراین اگر مشکلی برای فایلهای Data اتفاق افتاده باشد، اوراکل در این مرحله متوجه آن نمی شود. گاهی لازم است Instance بدون mount کردن دیتابیس بالا بیاید (برای مثال زمانی که بخواهیم یک دیتابیس را از ابتدا ایجاد کنیم). برای این منظور پارامتر nomount را می توان به عنوان آرگومان به دستور startup داد که به Instance دستور می دهد به سراغ مرحله mount و باز کردن دیتابیس نرود:

STARTUP NOMOUNT

توجه کنید که در این حالت Instance کاملاً در حافظه بارگزاری می شود و پروسس ها نیز بالا می آیند (این مساله از طریق دستور ipcs و ps -aef | grep oracle قابل تحقیق است) اما instance به سراغ فایلهای دیتابیس نمی رود. به طریق مشابه دستور STARTUP MOUNT به Instance دستور می دهد که پروسه بالا آمدن را پس از mount کردن دیتابیس متوقف کند و به سراغ باز کردن دیتابیس نرود. نکته ای که باید به آن دقت شود آنستکه دستور startup تنها یکبار وارد می شود، لذا پس از بارگذاری Instance به صورت nomount دیگر نمی توان از همان دستور startup برای mount کردن دیتابیس و یا باز کردن آن استفاده کرد و باید از دستور alter database mount و alter database open برای mount کردن دیتابیس و سپس باز کردن آن استفاده کرد.

 

3- باز کردن دیتابیس

مرحله پایانی باز کردن دیتابیس mount شده است. پس از باز کردن دیتابیس که به معنی خواندن و آزمایش کردن فایلهای Data است، کاربران می توانند به دیتابیس وصل شده و بر روی دیتا کار کنند. اگر Instance در هنگام باز کردن دیتابیس متوجه نبود یکی از فایها شود، رویه باز کردن دیتابیس با یک پیغام خطا خاتمه می یابد و این فایل باید توسط یک پروسه Backup Recovery برگردانده شود. در صورتی که Instance در حین باز کردن database متوجه شود که دیتابیس آخرین باری که بالا بوده Normal Shutdown نشده است (برای مثال به علت قطعی برق)، یک پروسه Instance Recovery به طور اتوماتیک اجرا خواهد شد. پروسه Instance Recovery توسط یکی از Background Processهای Instance به نام SMON اجرا می گردد و ممکن است حتی چند ساعت به طول انجامد. در طول این مدت دیتابیس برای کاربران قابل دسترسی نیست.

پس از بالا آمدن Instance آماده سرویس دهی به کاربران است. کاربران برای سرویس گرفتن از Instance، نخست باید به آن متصل شوند. اوراکل برای هر Session یک Server Process اختصاص می دهد. این Server Process وظیفه ارتباط بین کاربر و Oracle Instance را برعهده دارد. Server Process دستورات SQL را از کاربر گرفته و خود آنرا اجرا می کند. در این مدل که به آن Dedicated Server Model می گوییم به ازای هر کاربر یک Server Process بر روی سرور بالا می آید. مدل دیگر آنستکه یک Server Process بین چند کاربر به طور مشترک مورد استفاده قرار گیرد که به آن Shared Server Model گویند.

Oracle Instance مرکب از یک ساختار حافظه مشترک موسوم به SGA یا به طور کاملتر System Global Area و یک سری Background Process. حافظه SGA خود به چندین بخش کوچکتر تقسیم می شود:

  • Shared Pool که خود شامل Library Cache و Data Dictionary Cache است.
  • Database Buffer
  • Redo Log Buffer
  • Large Pool که وجود آن اختیاری و تصمیم گیری آن با DBA است.
  • Java Pool که وجود آن نیز اختیاری بوده و تصمیم گیری آن با DBA است.

Background Processها نیز دو دسته هستند:

  • آن دسته از Background Processهای که وجودشان اجباری بوده و در هر ، صورت به همراه Instance بالا آورده می شوند که شامل SMON، RMON، DBWR، LGWR و CKPT می باشند.
  • آن دسته از Background Processها که وجودشان در صورت استفاده از برخی قابلیتهای دیتابیس مورد نیاز است، همچون ARC یا Archiver که در صورت بردن دیتابیس به مود آرشیو، بالا خواهند آمد و به صورت پیش فرض اجرا نمی شوند.

Drawing2

 

1- با استفاده از دستور CREATE SPFILE=some_path FROM PFILE=some_path. برعکس این کار نیز ممکن است. یعنی ایجاد Initialization Parameter File از روی SPFile با دستور CREATE PFILE FROM SPFILE. مثال:

SQL> create pfile=’/app/oracle/product/9.2.0/dbs/pfiletest.ora’ from spfile=’/app/oracle/product/9.2.0/dbs/spfiletest.ora’

Leave a Reply