همانطور که می دانید دو نوع گارد و یا standby database داریم:
Physical standby database
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 26
Next log sequence to archive 30
Current log sequence 30
حال روی physical standby دستور زیر را بزنید تا آخرین redo log ای که apply شده را نشان دهد:
SQL> select thread# , max(sequence#) from v$archived_log where applied=’YES’ group by thread#;
اگر خروجی دستور بالا با از پرس و جوی بالا با 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;