SCN در اوراکل چیست

SCN یا System Change Number عددی همواره افزایشی که دقیقا لحظه ای را در پایگاه داده مشخص می کند. در زمان Recovery پایگاه داده بسیار لازم می باشد. در واقع SCN عددی است که توسط DBMS اوراکل، برای ثبت تغییرات در پایگاه داده، ایجاد می شود. هرگاه در پایگاه داده تغییراتی (توسط SQL) ایجاد شود، مقدار SCN افزایش پیدا می کند. فراگیری اینکه SCN چگونه کار می کند، شما را در یادگیری چگونگی Recovery کمک خواهد کرد. برای بدست آوردن SCN فعلی پایگاه داده می توانید از پروسیجر dbms_flashback بصورت زیر استفاده کنید :

;select dbms_flashback.get_system_change_number from dual

GET_SYSTEM_CHANGE_NUMBER
————————

4116553

به محض اینکه تراکنشی در پایگاه داده Commit (نهایی) می شود، فرایند پس زمینه  LGWR : log writer process رکورد ها را از Redo log buffers که فضایی از SGA می باشد، در فایل های Online Redo Log بر روی دیسک می نویسد. (توجه داشته باشید در پایگاه داده ها، پیش از اینکه یک داده تغییر یافته بر روی مقدارش قبلی نوشته شود، ابتدا برای اهداف Recovery، نسخه ای تغییرات در پایگاه داده Log می شود). فرایند LGWR همچنین SCN تراکنش را در Online Redo Log می نویسد.

یکی دیگر از کاربرد های SCN، برای تعیین اینکه آیا پایگاه داده در زمان آغاز به کار کردن (Start شدن)، در حالتی سازگار وجود دارد یا نه؟ فرایند SCN در زمان Start شدن پایگاه داده، سرایند (Header) تمامی datafile ها را بررسی می کند، در صورتی همه چیز درست می باشد، اگر تمامی SCN های تمامی datafile header ها با SCN درون Control File مطابقت داشته باشند. اگر عدم مطابقت وجود داشته باشد، یعنی اینکه پایگاه داده در حالت ناسازگار وجود دارد. (SMON فرایند پس زمینه ایی است که،SCN تمامی datafile ها را در زمان Start شدن پایگاه داده بررسی می کند،اگر تمامی SCN های تمامی datafile header ها با SCN درون Control File مطابقت داشته باشند. اگر عدم مطابقت وجود داشته باشد، یعنی اینکه پایگاه داده در حالت ناسازگار وجود دارد.)

یک نقطه بررسی یا Checkpoint زمانی اتفاق می افتد، که تمامی تغییرات بافر پایگاه داده توسط فرایند پس زمینه DBWR بر روی datafile ها نوشته می شوند. فرایند CKPT، فایل های datafile و Control File را با SCN در زمانی که Checkpoint اتفاق افتاده و فرایند DBWR بر روی بلاک ها، می نویسد، بروز رسانی می کند.

با استفاده از تابع SCN_TO_TIMESTAMP می توانید SCN را با مقدار timestamp بدست آورید. برای اینکار نخست باید SCN فعلی را بدست آورید.

;select dbms_flashback.get_system_change_number from dual

GET_SYSTEM_CHANGE_NUMBER
————————

4116553

سپس با استفاده از SCN فعلی و تابع SCN_TO_TIMESTAMP بصورت زیر استفاده کنید.

;select SCN_TO_TIMESTAMP(current_scn_value) from dual

;select SCN_TO_TIMESTAMP(4116553) from dual

SCN_TO_TIMESTAMP(4116553)
——————————-
09SEP-13 08.59.44.000000000 PM

با استفاده از تابع CURRENT_TIMESTAMP می توانید timestamp فعلی را بدست آورید.

;select CURRENT_TIMESTAMP from dual

CURRENT_TIMESTAMP
————————————
09-SEP-13 09.45.22.950000 PM -07:00

خروجی بالا نشان می دهد که آخرین تغییر در پایگاه داده در تاریخ 9 سپتامبر، و در ساعت 8:59:44 اتفاق افتاده است.