Для тестирования сриптов перед накатом на основную базу и для каких-то еще тестов, когда нужна текущая база в ее наиболее актуальном состоянии, начиная с 11 версии Oracle, standby можно перевести в snapshot standby, поработать в нем в режиме чтения-записи, после чего вернуть все в первоначальное состояние и продолжить накат. Последовательность следующая.
Проверяем, что стендбай правильный и в нужном режиме.
Код:
SQL@STANDBY> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY WITH APPLY
1 row selected.
Код:
SYS@STANDBY> select database_role from v$database;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
1 row selected.
Останавливаем накат логов
Код:
SYS@STANDBY> alter database recover managed standby database cancel;
Database altered.
Включаем flashback
Код:
SYS@STANDBY> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@STANDBY> startup mount;
ORACLE instance started.
Total System Global Area 2656452608 bytes
Fixed Size 2161272 bytes
Variable Size 1291847048 bytes
Database Buffers 1073741824 bytes
Redo Buffers 288702464 bytes
Database mounted.
SYS@TESTER1 SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.
SYS@TESTER1 SQL> show parameter db_recovery_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 0
SYS@TESTER1 SQL> alter system set db_recovery_file_dest_size=1g;
System altered.
SYS@TESTER1 SQL> alter system set db_recovery_file_dest='/u03/testdb/TESTER1';
System altered.
SYS@TESTER1 SQL> show parameter db_recovery_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u03/testdb/TESTER1
db_recovery_file_dest_size big integer 1G
SYS@TESTER1 SQL> alter database flashback on;
Database altered.
SYS@TESTER1 SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
1 row selected.
Переключаем в snapshot standby
Код:
SYS@TESTER1 SQL> select status from v$instance;
STATUS
------------
MOUNTED
1 row selected.
SYS@TESTER1 SQL> alter database convert to snapshot standby;
Database altered.
SYS@TESTER1 SQL> alter database open;
Database altered.
SYS@TESTER1 SQL> select database_role from v$database;
DATABASE_ROLE
----------------
SNAPSHOT STANDBY
1 row selected.
SYS@TESTER1 SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
SQL> select NAME,GUARANTEE_FLASHBACK_DATABASE from v$restore_point;
NAME GUA
---------------------------------------- ---
SNAPSHOT_STANDBY_REQUIRED_10/03/2012 06: YES 13:19
Здесь с базой творите всякие неприличные вещи, стараясь не выйти за пределы объема RFD.
И возвращаем обратно в physical standby
Код:
SYS@TESTER1 SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@TESTER1 SQL> startup mount
ORACLE instance started.
Total System Global Area 2656452608 bytes
Fixed Size 2161272 bytes
Variable Size 1291847048 bytes
Database Buffers 1073741824 bytes
Redo Buffers 288702464 bytes
Database mounted.
SYS@TESTER1 SQL> select FLASHBACK_ON from v$database;
FLASHBACK_ON
------------------
YES
1 row selected.
SYS@TESTER1 SQL> alter database convert to physical standby;
Database altered.
SYS@TESTER1 SQL> select database_role from v$database;
select database_role from v$database
*
ERROR at line 1:
ORA-01507: database not mounted
SYS@TESTER1 SQL> select status from v$instance;
STATUS
------------
STARTED
1 row selected.
SYS@TESTER1 SQL> shut immediate
ORA-01507: database not mounted
ORACLE instance shut down.
SYS@TESTER1 SQL> startup
ORACLE instance started.
Total System Global Area 2656452608 bytes
Fixed Size 2161272 bytes
Variable Size 1291847048 bytes
Database Buffers 1073741824 bytes
Redo Buffers 288702464 bytes
Database mounted.
Database opened.
SYS@TESTER1 SQL>alter database recover managed standby database using current logfile disconnect;
SYS@TESTER1 SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY
1 row selected.
SYS@TESTER1 SQL> select database_role from v$database;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
1 row selected.