Snapshot Standby در Oracle Data Guard

Snapshot Standby یکی از قدرتمندترین قابلیت‌های Oracle Data Guard است که به شما امکان می‌دهد یک Standby را به حالت Read-Write تبدیل کنید تا بتوانید تست‌های destructive، تغییرات اپلیکیشن، Patch، و هر نوع عملیات آزمایشی را بدون تأثیر روی Primary انجام دهید.

در این حالت، رابطه Data Guard قطع نمی‌شود؛ فقط Apply متوقف می‌شود و Standby در یک حالت جداگانه (Snapshot) اجرا می‌شود. پس از پایان تست، با یک دستور همه چیز Rollback می‌شود و دیتابیس وارد حالت Physical Standby می‌گردد.

یش‌نیازها

  • بخش Data Guard درست کار کند

  • حتماً Archive Gap نداشته باشید.

نام‌ها در محیط من

نقش سرور DB Unique Name
Primary dc1.vahiddb.com vahiddb
Standby dc2.vahiddb.com vahiddbdc2

در DGMGRL نیز همین نام استفاده می‌شود.

 به broker وصل می شویم و اوضاع فعلی را بررسی می کنیم:

show configuration;

خروجی:

DGMGRL> show configuration;

Configuration - dg_vahiddb

  Protection Mode: MaxAvailability
  Members:
  vahiddb    - Primary database
    vahiddbdc2 - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 4 seconds ago)

 

Flashback باید فعال باشد

Snapshot Standby مبتنی بر Guaranteed Restore Point است.
اگر Flashback فعال نباشد، دستور تبدیل به Snapshot خطا می‌دهد.

در Standby حتماً چک می کنیم:

select flashback_on from v$database;

خروجی:

sys@vahiddb(28)> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

 

اگر OFF بود:

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database flashback on;
SQL> alter database open;

تبدیل Physical Standby به Snapshot Standby

تمام عملیات از طریق Broker انجام می‌شود

در broker دستور زیر را می زنیم:

convert database vahiddbdc2 to snapshot standby;

نمونه خروجی:

DGMGRL> convert database vahiddbdc2 to snapshot standby;
Converting database "vahiddbdc2" to a Snapshot Standby database, please wait...
Database "vahiddbdc2" converted successfully

 

وضعیتش را چک می کنیم:

 show database vahiddbdc2;

 

نمونه خروجی:

DGMGRL>  show database vahiddbdc2;

Database - vahiddbdc2

  Role:               SNAPSHOT STANDBY
  Transport Lag:      0 seconds (computed 0 seconds ago)
  Apply Lag:          58 seconds (computed 0 seconds ago)
  Instance(s):
    vahiddbdc2

Database Status:
SUCCESS

 

چه اتفاقی پشت صحنه رخ می‌دهد؟

وقتی تبدیل انجام می‌شود:

  1. Apply به Standby متوقف می‌شود

  2. Broker به صورت خودکار یک Guaranteed Restore Point با نام مشابه ایجاد می‌کند:

  3. دیتابیس Open Read Write می‌شود

  4. آرشیولگ‌های Primary ارسال می‌شوند اما Apply نمی‌شوند

 

نمونه خروجی چک guranteed restore point:

sys@vahiddb(362)>  select name, guarantee_flashback_database from v$restore_point;

NAME                                                                                                                             GUA
-------------------------------------------------------------------------------------------------------------------------------- ---
SNAPSHOT_STANDBY_REQUIRED_12/05/2025 10:33:22                                                                                    YES

این یعنی Snapshot Standby از Data Guard جدا نمی‌شود.

اجرای تست‌ها در Snapshot

در این مرحله هر تغییری خواستید انجام دهید:

sys@vahiddb(362)> drop user hr cascade;

User dropped.

Elapsed: 00:00:02.82
sys@vahiddb(362)> create user vahidtest identified by vahidtest;

User created.

Elapsed: 00:00:00.10
sys@vahiddb(362)> grant dba to vahidtest;

Grant succeeded.

Elapsed: 00:00:00.03
sys@vahiddb(362)> create table vahidtest.t1 as select * from dba_tables;

Table created.



یا حتی تغییر پارامتر:

sys@vahiddb(362)> show parameter cursor

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cursor_bind_capture_destination      string      memory+disk
cursor_invalidation                  string      IMMEDIATE
cursor_sharing                       string      EXACT
cursor_space_for_time                boolean     FALSE
open_cursors                         integer     300
session_cached_cursors               integer     50
sys@vahiddb(362)> alter system set cursor_sharing='FORCE';

System altered.



برگشت به Physical Standby (Rollback کامل)

وقتی تست تمام شد:

convert database vahiddbdc2 to physical standby;

نمونه خروجی:

DGMGRL> convert database vahiddbdc2 to physical standby;
Converting database "vahiddbdc2" to a Physical Standby database, please wait...
Operation requires a connection to database "vahiddb"
Connecting ...
Connected to "vahiddb"
Connected as SYSDBA.
Oracle Clusterware is restarting database "vahiddbdc2" ...
Connected to an idle instance.
Connected to an idle instance.
Connected to an idle instance.
Connected to an idle instance.
Connected to "vahiddbdc2"
Continuing to convert database "vahiddbdc2" ...
Database "vahiddbdc2" converted successfully

 

در این مرحله:

  • دیتابیس Shutdown می‌شود

  • به Restore Point برمی‌گردد

  • به حالت Physical Standby برمی‌گردد

  • Apply مجدداً فعال می‌شود

  • آرشیولگ‌هایی که در این بازه ارسال شده بودند، شروع به Apply می‌شوند.

 

تست تغییراتی که دادیم:

sys@vahiddb(200)>  select username from dba_users where username='HR';

USERNAME
--------------------------------------------------------------------------------------------------------------------------------
HR

Elapsed: 00:00:00.11
sys@vahiddb(200)> show parameter cursor

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cursor_bind_capture_destination      string      memory+disk
cursor_invalidation                  string      IMMEDIATE
cursor_sharing                       string      EXACT
cursor_space_for_time                boolean     FALSE
open_cursors                         integer     300
session_cached_cursors               integer     50

 

سخهٔ بدون Broker — فقط با SQLPLUS

اگر یک نفر Broker را دوست نداشته باشد، از این دستورات استفاده می‌کند. دقت کنید که مرحله تبدیل دیتابیس به flashback همچنان اجباری است.

۱) تبدیل Physical Standby به Snapshot Standby

در Standby:

shutdown immediate;
startup mount;
alter database convert to snapshot standby;
alter database open;

 

۲) بازگشت به Physical Standby

 

shutdown immediate;
startup mount;
alter database convert to physical standby;
startup;

 

و سپس:

 

alter database recover managed standby database disconnect;

۷) نکته‌های مهم

 اگر Flashback OFF باشد Snapshot امکان‌پذیر نیست

Broker خطا می‌دهد.

 Snapshot Standby نمی‌تواند redo apply انجام دهد

redo فقط دریافت می‌شود.

 زمان Snapshot هرچقدر طولانی‌تر شود، حجم redo بیشتری برای Apply خواهید داشت.

 Snapshot Standby برای تست UAT و Release بهترین ابزار دنیاست

بدون ساختن محیط جدید!

 اگر restore point دستی بسازید، Broker ایراد نمی‌گیرد

اما خودش همیشه restore point لازم را می‌سازد.