نحوه چک کردن گارد اوراکل

نحوه چک کردن گارد اوراکل

همانطور که می دانید دو نوع گارد و یا standby database داریم:

  1. Physical standby database
  2. Logical standby database

۱-اگر سرور گارد از نوع physical باشد:
برای چک کردن اینکه آیا redo log فایل ها روی سرور گارد apply می شود به روش زیر عمل می کنیم.

روی سرور primary:

 SQL> archive log list
Database log mode           Archive Mode
Automatic archival           Enabled
Archive destination           USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     ۲۶
Next log sequence to archive   ۳۰
Current log sequence           ۳۰

حال روی physical standby دستور زیر را بزنید تا آخرین redo log ای که apply شده را نشان دهد:

SQL> select thread# , max(sequence#) from v$archived_log where applied=’YES’ group by thread#;

اگر مقدار بدست آمده max sequence از پرس و جوی بالا با Current log sequence ای که مقدار آن ۳۰ است یکی و یا دو تا اختلاف داشته باشد گارد شما سینک می باشد و مشکلی ندارد ولی اگر اختلاف بیش از دو تا بود باید مشکل را حل کنید.

حال incarnation چیست؟
در بانک اوراکل یک شمارنده داریم بنام scn که مختصر System Change Number است. یک عددی است که همواره رو به جلو افزایش می یابد و به هیچ عنوان به عقب بر نمی گردد. این عدد هر گاه log switch و یا commit اتفاق می افتد افزایش یافته و آن را در کنترل فایل اوراکل و تمامی هدر فایل های داده ذخیره می کند و هنگامی که بانک shutdown نرمال نشود scn  در کنترل فایل با scn در هدر فایل های داده متفاوت خواهد بود و هنگام بالا آمدن بانک اوراکل پروسه smon شروع به instance recovery می کند و برای اینکار از redo log فایل هایی که وضعیت active دارند استفاده می کند.
هر گاه هم یک log switch اتفاق می افتد یک عدی دیگری بنام sequence وجود دارد که آن هم افزایشی است.فیلد #sequence که در select بالا آمده نشان دهنده همین است. بنابراین وقتی که بانک های اوراکل نرمال هستند scn و sequence بصورت نرمال افزایش می یابند.
ولی اگر به هر دلیلی روی سرور primary database مجبور شویدکه یک recovery از نوع  point-in-time  داشته باشید. یعنی به یک زمان عقب برگشتید در این صورت در بانک اصلی مجبورید که بانک را بصورت open resetlogs بالا بیاورید.

SQL> alter database open resetlogs;

در اینصورت مقدار sequence از یک شروع می شود ولی scn تغییری نکرده و طبق روال قبل افزایش می یابد در اینصورت در بانک اصلی incarnation بوجود می آید.
برای بدست آوردن آن از دستور زیر استفاده کنید.

SQL> select * from v$database_incarnation;

آخرین reset log را با دستور زیر بدست آورید.

 

SQL> select resetlogs_change#  from v$database_incarnation  where status = ‘CURRENT’;

روش اول:

برای چک کردن اینکه آخرین sequence روی سرور physical standby database اعمال و یا apply شده از دستور زیر باید استفاده کنید.

 

SQL> select thread#,sequence#,applied from v$archived_log
where (thread#,sequence#) in (select thread# , max(sequence#)
from v$archived_log
where applied=’YES’
and resetlogs_change# = ( select resetlogs_change#
from v$database_incarnation
where status = ‘CURRENT’)
group by thread#
);

روش دوم :

این روش از روش اول مطمئن تر می باشد. با دستور زیر می توانید مستقل از وجود  incarnation   گارد را چک کنید.

SQL> select process, status, sequence# from v$managed_standby;

 

۲- اگر سرور گارد از نوع logical باشد:

الف- بدون اینکه روی سرور اصلی incarnation داشته باشید:

SQL> select sequence#, first_time, next_time, dict_begin, dict_end,applied from dba_logstdby_log order by 1;

ب- اگر روی سرور اصلی incarnation  داشته باشید.
چون سرور گارد از نوع logical هست و برای راه اندازی آن باید آن را open از نوع  resetlog کنید.
در اینصورت خود سرور گارد از نوع logical بطور معمول incarnation دارد. بنابراین دو تا incarnation دارید یکی در سرور primary و دیگری در سرور گارد.
برای چک کردن آن باید دستورات زیر را انجام دهید.
ابتدا به سرور اصلی primary وصل شوید و با دستور زیر reset log  را بدست آورید.

SQL> select resetlogs_id from v$database_incarnation where status =’CURRENT’;

RESETLOGS_ID
————
۹۱۹۹۵۳۶۴۰

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

SQL> select sequence#, first_time, next_time, dict_begin, dict_end,applied from dba_logstdby_log where resetlogs_id = 919953640 order by 1;