[ОТВЕТИТЬ]
Опции темы
17.04.2012 16:58  
OlegON
Решил записать шаги, может, кому-то пригодится. Речь про 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  
OlegON
Руководство для чайников
делал не по нему, хотя, может, когда-то и с него начинал...
чтобы открыть standby для работы нужно
Код:
alter database recover managed standby database cancel;
alter database open;
 
"Спасибо" OlegON от:
07.08.2013 10:43  
Troll
Если датагард прикручен, то для его отрыва:
Код:
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 = '*';
но у меня все равно до перезагрузке не оторвался стендбай.
 
12.08.2013 16:44  
bayan
Удаление 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  
bayan
Переписал на днях на "более" правильный
Код:
 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';
 
 
Опции темы



Часовой пояс GMT +3, время: 17:05.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.