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
چه اتفاقی پشت صحنه رخ میدهد؟
وقتی تبدیل انجام میشود:
-
Apply به Standby متوقف میشود
-
Broker به صورت خودکار یک Guaranteed Restore Point با نام مشابه ایجاد میکند:
-
دیتابیس Open Read Write میشود
-
آرشیولگهای 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 لازم را میسازد.