17.04.2012 16:58
Решил записать шаги, может, кому-то пригодится. Речь про Oracle 10-11
Начальные условия - primary 10.120.0.21 и standby 10.1.200.109, на .21 уже поднята база work.

1. Проверить primary ini, он должен быть приблизительно такой
Код:
DB_UNIQUE_NAME=work_pri
*.aq_tm_processes=5
*.audit_file_dest='/erc_base_vol1/work/adump'
*.audit_trail='TRUE'
*.compatible='11.2.0.3'
*.control_files='/erc_base_vol1/work/control01.ctl','/erc_base_vol1/work/control02.ctl','/erc_base_vol1/work/control03.ctl'
*.core_dump_dest='/erc_base_vol1/work/dump'
*.db_block_size=8192
*.db_create_file_dest='/erc_base_vol1/work/'
*.db_name='work'
*.db_recovery_file_dest_size=214748364800
*.db_recovery_file_dest='/erc_base_vol1/work/fra'
*.diagnostic_dest='/erc_base_vol1/work/dump'
*.fast_start_mttr_target=1200
*.instance_name='work'
*.job_queue_processes=50
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=500
*.pga_aggregate_target=1442450944
*.processes=550
*.remote_login_passwordfile='EXCLUSIVE'
*.sec_case_sensitive_logon=FALSE
*.sga_max_size=2212254720
*.sga_target=2212254720
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=1800
*.undo_tablespace='UNDOTBS1'
*.workarea_size_policy='AUTO'
FAL_SERVER='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.200.109)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=work_stby)(INSTANCE_NAME=work)(SERVER=dedicated)))'
FAL_CLIENT='(DESCRIPTION= (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.120.0.21)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=work_pri)(INSTANCE_NAME=work)(SERVER=dedicated)))'
STANDBY_FILE_MANAGEMENT=AUTO
log_archive_dest_2='service="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.200.109)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=work_stby)(INSTANCE_NAME=work)(SERVER=dedicated)))",LGWR ASYNC db_unique_name="work_stby" valid_for=(online_logfile,primary_role)'
local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.200.109)(PORT = 1521))'
LOG_ARCHIVE_DEST_STATE_2=enable
2. Делаем full rman бекап и заливаем на .109, для primary делаем alter database force logging;
2.5. создаем файл паролей на primary и standby с одинаковыми паролями.
3. ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/erc_base_vol1/work/stby.ctl';
4. Полученный .ctl тоже скопировать на .109
5. На стендбае, соответственно, разница:
Код:
DB_UNIQUE_NAME=work_stby
FAL_CLIENT='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.200.109)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=work_stby)(INSTANCE_NAME=work)(SERVER=dedicated)))'
FAL_SERVER='(DESCRIPTION= (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.120.0.21)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=work_pri)(INSTANCE_NAME=work)(SERVER=dedicated)))'
log_archive_dest_2='service="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.120.0.21)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=work_pri)(INSTANCE_NAME=work)(SERVER=dedicated)))",LGWR ASYNC db_unique_name="work_pri" valid_for=(online_logfile,primary_role)'
6. Полный бекап из п.2, каталог называется WORK_PRI, перемещаем во fra для новой базы, standby. Переименовывать не надо.
7. Подключаемся rman к еще незапущенной standby
Код:
startup nomount
restore standby controlfile from '/11/stby.ctl';
sql 'alter database mount standby database';
restore database;
sql 'alter database flashback off';
sql 'alter database flashback on';
recover database;
8. создаете standby-логи, у меня для этого есть скриптик (это под солярку, но работает везде, только путь к bash поправьте)
Код:
#!/usr/bin/bash

export STANDBY_LOG_FILE_PATH=/erc_base_vol1/work/  # ! must ended /

$ORACLE_HOME/bin/sqlplus -S "/ as sysdba" << EOF
set linesize 150
set serveroutput on;
declare
 standby_logs_exists            number          := 0;
 max_groups                     number          := 0;
 max_onlinelog_size             number          := 0;
 standby_logfile_path           varchar2(100)   := '$STANDBY_LOG_FILE_PATH';
 standby_logfile_group_number   number          := 0;
begin
    dbms_output.put_line(CHR(13)||CHR(10)||'##############################################################################################');
    dbms_output.put_line('<=== This PL/SQL generate SQL script for add standby logfiles ===>');

    select count(group#) into standby_logs_exists from v\$standby_log;
    if standby_logs_exists>0 then
        dbms_output.put_line(CHR(13)||CHR(10));
        dbms_output.put_line('===========================================================');
        dbms_output.put_line('AHTUNG!');
        dbms_output.put_line('AHTUNG!: standby logfiles already exists!');
        dbms_output.put_line('AHTUNG!');
        dbms_output.put_line('===========================================================');
        dbms_output.put_line(CHR(13)||CHR(10));
    end if;


    dbms_output.put_line('recommended number of standby redo log file groups = (maximum number of logfiles for each thread + 1) * maximum number of threads');

    select max(group#), max(bytes)/1024/1024 into max_groups, max_onlinelog_size from v\$log;

    dbms_output.put_line('Max.Groups = '||max_groups);
    dbms_output.put_line('Max.Onlinelog.Size (Mb) = '||max_onlinelog_size||CHR(13)||CHR(10));


    for i in 0..max_groups loop
        standby_logfile_group_number := i + max_groups + 1;
        dbms_output.put_line('alter database add standby logfile group '||standby_logfile_group_number||' ('''||standby_logfile_path||'standby_redo_g'||standby_logfile_group_number||'m1.dbf'')'||' size '||max_onlinelog_size||'M;');
    end loop;

    dbms_output.put_line(CHR(13)||CHR(10)||'Check standby log:');
    dbms_output.put_line('SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V\$STANDBY_LOG;');
    dbms_output.put_line(CHR(13)||CHR(10)||'##############################################################################################');
end;
/
exit;
EOF
9. ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Если в логе стендбая что-то вроде
Цитата:
Tue Apr 17 16:24:02 2012
Media Recovery Log /erc_base_vol1/work/fra/WORK_STBY/archivelog/2012_04_17/o1_mf_1_3757_1NcugAc3P_.arc
Media Recovery Waiting for thread 1 sequence 3758 (in transit)
то, наверное, повезло...
на primary можно потыкать что-то вроде alter system switch logfile, чтобы логи поехали на standby, будет лучше видно, передаются логи или нет. Само собой разумеется, необходимо посмотреть и лог primary, там тоже могут быть сюрпризы.

P.S. не ставил задачу написать руководство для тех, кто в первый раз видит Oracle, эта задача не для вас, подробнее и понятнее писать не буду, извините.
также прошу прощения, если что-то пропустил. старался все шаги записывать, но мог где-то забыть, косяки с сетью были, отвлекался. ошибки прошу поправить, если кто заметит. но у меня, соответственно, все работает нормально.
17.04.2012 17:03

делал не по нему, хотя, может, когда-то и с него начинал...
чтобы открыть standby для работы нужно
Код:
alter database recover managed standby database cancel;
alter database open;
07.08.2013 10:43
Если датагард прикручен, то для его отрыва:
Код:
select sequence#, applied from v$archvied_log;
на праймари
Код:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
на стендбае
Код:
select switchover_status,database_role from v$database;
и если ALLOWED, то на нем же
Код:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
а для убийства standby надо удалить все назначения параметров
Код:
alter system reset FAL_SERVER;
alter system reset FAL_CLIENT;
alter system reset STANDBY_FILE_MANAGEMENT;
alter system set LOG_ARCHIVE_DEST_STATE_2=reset;
alter system set log_archive_dest_state_2=defer scope = both sid = '*';
но у меня все равно до перезагрузки не оторвался стендбай.

Если стендбай отрываем, то, возможно, получим ошибку
ORA-16072: a minimum of one standby database destination is required
и надо будет выполнить
Код:
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
12.08.2013 16:44
Удаление APPLIED archived_logs на стендбае (оставляет 3 последних лога на всякий пожарный):
Код:
conn / as sysdba
set linesize 200;
set heading off;
SET SERVEROUTPUT ON
SET FEEDBACK OFF
spool /u/oracle/backup/logs_delete.rcv

SELECT 'CROSSCHECK ARCHIVELOG ALL;' 
    ||chr(10)
    || 'allocate channel for maintenance device type disk;'
                    || chr(10)
                    || 'delete archivelog until sequence '
                    || MAX (sequence# -3)
                    || ' thread '
                    || thread#
                    || ';'
                    || chr(10)
                    || 'release channel;'
         END
    FROM v$archived_log
 WHERE applied = 'YES'
GROUP BY thread#;
spool off;
exit
15.08.2013 12:29
Переписал на днях на "более" правильный
Код:
 SELECT 'CROSSCHECK ARCHIVELOG ALL;' 
    ||chr(10)
    || 'allocate channel for maintenance device type disk;'
                    || chr(10)
                    || 'delete archivelog until sequence '
                    || APPLIED_SEQ#
                    || ' thread '
                    || APPLIED_THREAD#
                    || ';'
                    || chr(10)
                    || 'release channel;'
         END
    from V$ARCHIVE_DEST_STATUS where DEST_NAME='LOG_ARCHIVE_DEST_2';
21.09.2017 17:22
В общем, споткнулся об ошибку
ORA-01033: ORACLE initialization or shutdown in progress
И так и эдак... Заметил только потом, что standby создал под другим именем.
Итак, на всякий случай еще раз опишу последовательность, уже для 11g
Создаем инстанс RCK на обоих хостах, во избежание путаницы, на основном ставим db_uniq_name=rckp, на standby db_uniq_name=rcks.
Продуктив, понятно, с архивлогом, force logging. Создавалось все на Windows (обматерился, UAC отключайте в реестре, не забудьте проверить отсутствие IPv6), поэтому пришлось на втором сервере создать сервис ORADIM -NEW -SID RCK -SYSPWD qqq. Во избежание проблем на обоих базах sec_case_sensitive_logon=false. Остальное все в параметрах выше достаточно подробно описано, но суть - создать одинаковые инстансы и назначить им разные db_uniq_name. Убедитесь, что пароли в файлах orapwd одинаковые (скопированы с одного хоста), а так же вспомните, что в Linux и Windows файлы паролей по разному называются.

Параметры на продуктиве
Код:
*.audit_file_dest='C:\app\rck\admin\RCK\adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='E:\RCK\control01.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='RCK'
*.db_recovery_file_dest='C:\BACKUP'
*.db_recovery_file_dest_size=107374182400
*.db_unique_name='RCKP'
*.diagnostic_dest='C:\app\rck'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=RCKXDB)'
*.fal_client='RCKP'
*.fal_server='RCKS'
*.log_archive_config='dg_config=(rckp,rcks)'
*.log_archive_dest_2='SERVICE=rcks LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=rcks'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='%t_%s_%r.arc'
*.open_cursors=300
*.pga_aggregate_target=4380950528
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sec_case_sensitive_logon=FALSE
*.sga_target=13144948736
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
Параметры на standby
Код:
*.audit_file_dest='C:\app\rck\admin\RCK\adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='E:\RCK\CONTROL01.CTL'#Restore Controlfile
*.db_block_size=8192
*.db_domain=''
*.db_name='RCK'
*.db_recovery_file_dest='C:\BACKUP'
*.db_recovery_file_dest_size=107374182400
*.db_unique_name='RCKS'
*.diagnostic_dest='C:\app\rck'
*.fal_client='RCKS'
*.fal_server='RCKP'
*.log_archive_config='dg_config=(rckp,rcks)'
*.open_cursors=300
*.pga_aggregate_target=1380950528
*.processes=550
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=5144948736
*.undo_tablespace='UNDOTBS1'
*.standby_file_management='AUTO'
listener.ora на продуктиве
Код:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = RCK)
      (SID_NAME = RCK)
	(ORACLE_HOME = C:\app\rck\product\11.2.0\dbhome_1)
    )
    (SID_DESC =
	(SID_NAME = PLSExtProc)
	(ORACLE_HOME = C:\app\rck\product\11.2.0\dbhome_1)
        (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RCK-DBV)(PORT = 1521))
	(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))
  )

ADR_BASE_LISTENER = C:\app\rck\product\11.2.0\dbhome_1\log
listener.ora на standby
Код:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = RCK)
      (SID_NAME = RCK)
	(ORACLE_HOME = C:\app\rck\product\11.2.0\dbhome_1)
    )
    (SID_DESC =
	(SID_NAME = PLSExtProc)
	(ORACLE_HOME = C:\app\rck\product\11.2.0\dbhome_1)
        (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RCK-DBRV)(PORT = 1521))
	(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))
  )

ADR_BASE_LISTENER = C:\app\rck\product\11.2.0\dbhome_1\log
tnsnames.ora на продуктиве
Код:
RCKP =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rck-dbv)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = RCK)
	(SERVER=dedicated)
    )
  )

RCKS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rck-dbrv)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = RCK)
      (SERVER=dedicated)
    )
  )
tnsnames.ora на standby
Код:
RCKP =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rck-dbv)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = RCK)
	(SERVER=dedicated)
    )
  )

RCKS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rck-dbrv)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = RCK)
	(SERVER=dedicated)
    )
  )
Собственно, просто сделал backup database plus archivelog на продуктиве с учетом включенного controlfile autobackup и FRA целиком бросил по тому же пути, что и лежал на продуктиве. Затем, на продуктиве подключился к основной базе
Код:
set ORACLE_SID=RCK
rman target /
connect auxiliary sys@rcks
пароль
duplicate target database for standby nofilenamecheck dorecover;
база создалась и на standby
нашел в alertlog продуктива пожелание создать журнальные файлы, прямо эти команды и выполнил на standby, уточнив путь до файлов
SQL код:
ALTER DATABASE ADD STANDBY LOGFILE 'E:\RCK\srl1.f' SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE 'E:\RCK\srl2.f' SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE 'E:\RCK\srl3.f' SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE 'E:\RCK\srl4.f' SIZE 52428800; 
они должны появиться в выводе
SQL код:
select * from v$standby_log; 
ради интереса можно опустить и поднять standby
SQL код:
shutdown immediate;
startup nomount;
alter database mount standby database; 
и пнуть применение журналов (можно это и сразу сделать)
SQL код:
alter database recover managed standby database using current logfile disconnect; 
ну и проверить, что заработало
SQL код:
select recovery_mode from v$archive_dest_status; 
(вверху должен быть MANAGED REAL TIME APPLY)
и переключением
SQL код:
alter system switch logfile; 
на продуктиве с отслеживанием
SQL код:
select max(sequence#) from v$log_history; 
на обоих хостах
возможно, что журналы где-то потеряются, их можно будет докопировать и докатить вручную, сначала разорвав связь
SQL код:
alter database recover managed standby database cancel; 
докатив журналы
SQL код:
recover standby database; 
и запустив все заново
SQL код:
alter database recover managed standby database using current logfile disconnect; 
Вот, может, кому-то с Windows не повезло, для этого и писал...

Для открытия standby необходимо сохранить spfile в pfile где-нибудь и по необходимости надо сделать следующее
Код:
alter system reset FAL_SERVER;
alter system reset FAL_CLIENT;
alter system reset STANDBY_FILE_MANAGEMENT;
alter system set LOG_ARCHIVE_DEST_STATE_2=reset;
alter system set log_archive_dest_2='';
alter database recover managed standby database finish;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
после чего перезагрузить базу
26.12.2023 12:28
Вариант переливки с работающего primary (DB) в standby (DB_ST)
Код:
#!/bin/bash
rman target sys/pwd@DB auxiliary sys/pwd@DB_ST<<EOF
spool log to "`date +%Y%m%d_%H%M%S_%N`_duplicate_DB.log";
duplicate target database for standby from active database dorecover nofilenamecheck;
EOF
потом просто пересоздал конфигурацию https://olegon.ru/showthread.php?t=38597 и понеслась... Очистку архивлогов только не включайте.

Есть еще вариант восстанавливать из текущего primary, подключаетесь к standby
Код:
rman target /
RECOVER STANDBY DATABASE FROM SERVICE primary_db;
Если Active Dataguard -
Код:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE UNTIL CONSISTENT;
ALTER DATABASE OPEN READ ONLY;
Ну и
Код:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Если DG, то
Код:
edit database standby_db set state='APPLY-ON';
Часовой пояс GMT +3, время: 21:32.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.