O que é o sistema de backup em tempo real da Oracle?
A replicação do Oracle Streams é o processo que permite que o esquema do banco de dados Oracle seja replicado para outro banco de dados Oracle, que pode ser localizado em qualquer local. Sempre que uma transação ocorrer no banco de dados primário DML ou DDL, ela será executada imediatamente no banco de dados de destino para manter uma cópia de backup ativa. Abaixo estou explicando e fornecendo scripts para exemplo de replicação passo a passo do Oracle Streams.
Configuração de replicação do Oracle Streams
Neste post, estou descrevendo as etapas para criar uma replicação de banco de dados Oracle por meio do recurso Oracle Streams, para banco de dados ou banco de dados standby que pode ser usado para fins de relatório e análise ou quaisquer outros fins. Este recurso Oracle Streams é suportado no Oracle 11g Enterprise Edition e 10gR2 e 9iR2. O Oracle Streams não é mais compatível com a versão 12c; agora a Oracle está usando o Oracle Golden Gate para este recurso. Descrevi abaixo etapas simples para criar uma replicação para outro banco de dados Oracle, para cada etapa estou fornecendo um script SQL que você pode copiar e salvar como etapa-1, etapa-2 e assim por diante , em seguida, execute os scripts um por um para configurar a replicação. Mas antes de executar os scripts, altere os valores para seus valores que estão entre colchetes [ ] e substitua-os com cuidado, todos os valores entre colchetes têm nomes completos, portanto, altere adequadamente.Importante! Crie uma entrada em tnsname.ora para os bancos de dados de origem e destino para cada conexão.
Etapa 1 Configurando o banco de dados de destino ou secundário
CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=BOTH;alter system set streams_pool_size=100M scope=BOTH;alter system set undo_retention=3600 scope=BOTH;desligamento imediato;montagem de inicialização;alterar banco de dados aberto;Etapa-2 Configurando o banco de dados de origem ou primário
CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;alter system set global_names=TRUE scope=BOTH;alter system set job_queue_processes=6 scope=BOTH;alter system set streams_pool_size=48M scope=BOTH;ALTER SYSTEM SET SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400alter system set unndo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOAlter System Set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATION]' Scope=Spfile;Alter System Definir LOG_ARCHIVE_DEST_STATE_1=ativar Escopo=Spfile;encerrar imediatamente;montar inicialização;alterar arquivo de banco de dados;alterar banco de dados aberto;Alter banco de dados Adicionar dados de log suplementares (chave primária, única, chave estrangeira) Colunas;Alter banco de dados Forçar log;Alter log de arquivo do sistema atual;Etapa-3 Criar tablespace para banco de dados de origem
conectar [source_sys_connection1] como sysdba;criar tablespace [logminer_ts_name]datafile '[logminer_datafile]'size 100mreuse autoextend on maxsize Unlimited;execute dbms_logmnr_d.set_tablespace('[logminer_ts_name]');criar tablespace [stream_ts_name]datafile '[stream_datafile]'size 100mreuse autoextend em maxsize ilimitado;Etapa-4 Criar usuário administrador do Oracle Streams para o banco de dados de origem
conectar [source_sys_connection1] como sysdba;
criar usuário [source_stream_admin] identificado por [source_stream_psw] tablespace padrão [stream_ts_name] tablespace temporário temporário; -- 9 funções para [source_stream_admin] concedem recursos para [source_stream_admin]; conceder datapump_imp_full_database para [source_stream_admin]; conceder imp_full_database para [source_stream_admin]; conceder datapump_exp_full_database para [source_stream_admin]; conceder exp_full_database para [source_stream_admin]; conceder dba para [source_stream_admin]; conceder conexão a [source_stream_admin]; conceder aq_administrator_role para [source_stream_admin]; conceder select_catalog_role para [source_stream_admin]; alter user [source_stream_admin] recurso de função padrão, imp_full_database, exp_full_database, dba, conectar, aq_administrator_role, select_catalog_role; -- 15 privilégios de sistema para [source_stream_admin] beginys.dbms_rule_adm.grant_system_privilege( privilégio => sys.dbms_rule_adm.alter_any_rule_set, grantee => '[source_stream_admin]', grant_option => true); end;/ beginys.dbms_aqadm.grant_system_privilege ( > 'dequeue_any', grantee => '[source_stream_admin]', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm.alter_any_rule, grantee >> '[source_stream_admin]', grant_option true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilégio => sys.dbms_rule_adm.create_rule_obj, grantee => '[source_stream_admin]', grant_option => true);end;/ conceder tablespace ilimitado para [source_stream_admin]; conceder sessão restrita a [source_stream_admin]; BeginSys.dbms_rule_adm.grant_system_privilege (privilegiado => sys.dbms_rule_adm.execute_any_rule_set, donDee => '[fonte_stream_admin]', spin_option => true); end;/beginsys.dbms_rule_strant],> '[source_stream_admin]', grant_option => true);end;/ grant create session to [source_stream_admin]; beginys.dbms_aqadm.grant_system_privilege ( privilégio => 'enqueue_any', grantee => '[source_stream_admin]', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm. [source_stream_admin]', grant_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm.create_any_rule, grantee => '[source_stream_admin]', grant_option => true);end;/ beginys.dbms_rule_adm .grant_system_privilege( privilégio => sys.dbms_rule_adm.create_evaluation_context_obj, beneficiário => '[source_stream_admin]', grant_option => true);end;/ beginys.dbms_aqadm.grant_system_privilege ( privilégio => '[source_stream_admin]', beneficiário ] administrador ', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm.create_rule_set_obj, grantee => '[source_stream_admin]', grant_option => true);end;
/
Etapa-5 Criando Streams Admin para o banco de dados de destino
conectar [target_sys_connection] como sysdba;
--- execute como usuário sys no usuário targetcreate [target_stream_admin] identificado por [target_stream_psw]; -- 9 funções para strmadmin concedem recurso para [target_stream_admin]; conceder datapump_imp_full_database para [target_stream_admin]; conceder imp_full_database para [target_stream_admin]; conceder datapump_exp_full_database para [target_stream_admin]; conceder exp_full_database para [target_stream_admin]; conceder dba para [target_stream_admin]; conceder conexão com [target_stream_admin]; conceder aq_administrator_role para [target_stream_admin]; conceder select_catalog_role para [target_stream_admin]; alter user [target_stream_admin] recurso de função padrão, imp_full_database, exp_full_database, dba, conectar, aq_administrator_role, select_catalog_role; -- 15 privilégios de sistema para [target_stream_admin] beginys.dbms_rule_adm.grant_system_privilege( privilégio => sys.dbms_rule_adm.alter_any_rule_set, beneficiário => '[target_stream_admin]', grant_option => true);end;/_ beginys.dbms_aqadm.grant_system ( privilegio aqadm.grant_system> 'dequeue_any', grantee => '[target_stream_admin]', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm.alter_any_rule, grantee => '[target_stream_admin]', grant_option true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilégio => sys.dbms_rule_adm.create_rule_obj, grantee => '[target_stream_admin]', grant_option => true);end;/ conceder tablespace ilimitado para [target_stream_admin]; conceder sessão restrita a [target_stream_admin]; BeginSys.dbms_rule_adm.grant_system_privilege (privilegiado => sys.dbms_rule_adm.execute_any_rule_set, donDee => '[TARGET_STREAM_ADMIN]', Grant_Option => true); end;/beginsys.dbms_Rule_emM.GRANT_SYSTE_SYSTE_SYSTE_SYSTE_STER_STENIMENTEMENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGENSENGEMENTE_STEMENTE_STEMENTEMENTES;> '[target_stream_admin]', grant_option => true);end;/ conceder criar sessão para [target_stream_admin]; ys.dbms_aqadm.grant_system_privilege ( privilégio => 'enqueue_any', concessionário => '[target_stream_admin]', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_ =>execute grant [target_stream_admin]', grant_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm.create_any_rule, grantee => '[target_stream_admin]', grant_option => true);end;/ beginys.dbms_rule_adm .grant_system_privilege( privilégio => sys.dbms_rule_adm.create_evaluation_context_obj, beneficiário => '[target_stream_admin]', grant_option => true);end;/ beginys.dbms_aqadm.grant_system_privilege ( privilégio => '[gerenciar_anystream', ] beneficiário ', admin_option => true);end;/ beginys.dbms_rule_adm.grant_system_privilege( privilegio => sys.dbms_rule_adm.create_rule_set_obj, grantee => '[target_stream_admin]', grant_option => true);end;/
Etapa-6 Criando link de banco de dados para banco de dados de origem
conectar [source_stream_connection]
--- link para banco de dados de destino... criar link de banco de dados [source_dblink] conectar a [target_stream_admin] identificado por [target_stream_psw] usando '[target_connect_string]';
Etapa-7 Criando link de banco de dados para banco de dados de destino
conectar [target_stream_connection]
criar link de banco de dados [target_dblink] conectar a [source_stream_admin] identificado por [source_stream_psw] usando '[source_connect_string]';
Etapa-8 Criando o diretório Datapumb no banco de dados de destino
conectar [target_stream_connection]
crie ou substitua o diretório[target_datapump_dir] como '[target_dir_location]';
Etapa-9 Criando o processo de captura no banco de dados de origem
desative o eco; ---accept strm_pwd_src prompt 'digite a senha do administrador de streams "strmadmin" na origem:' hide ---accept strm_pwd_dest prompt 'digite a senha do administrador de streams "strmadmin" no destino:' hideconnect [source_stream_connection];declare cursor vin is select ruleset_name from dba_rulesets where owner ='[source_stream_admin]';começar para i in vin loop começar dbms_rule_adm.drop_rule_set( rule_set_name => '[source_stream_admin].'||i.ruleset_name, delete_rules => true); exceção quando outros são nulos; fim; end loop;end;/begin dbms_streams_adm.set_up_queue( queue_table => '"streams_capture_qt"', queue_name => '"streams_capture_q"', queue_user => '"[source_stream_admin]"'); end;/begin dbms_streams_adm.add_schema_propagation_rules( => '"[source_schema]"', streams_name => '"streams_propagation1"', source_queue_name => '"strmadmin"."streams_capture_q"', destination_queue_name => '"strmadmin"."streams_apply_q"@[source_dblink]', include_dml => true, include_ddl => true, fonte_database => '[fonte_database]', inclusão_rule => true); end;/commit; comece dbms_streams_adm.add_schema_rules (schema_name => '"[fonte_schema]", streams_type ', streams_name => '"streams_capture"', queue_name => '"[source_stream_admin]"."streams_capture_q"', include_dml => true, include_ddl => true, include_tagged_lcr => false, inclusio n_rule => true);end;/-- repita as 2 etapas acima para cada schemacommit;declare cursor vin is selecione table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';começando por c in vin loop dbms_streams_adm.add_table_rules ( table_name => '[source_schema] .'||c.table_name, streams_type => 'capture', streams_name => 'streams_capture', queue_name => '[source_stream_admin].streams_capture_q', include_dml => true, include_ddl => false, inclusion_rule => false, source_database => '[source_database]' );end loop;commit;end;/Etapa-10 Criando o processo de aplicação no banco de dados de destino
conectar [target_stream_connection]
begin dbms_streams_adm.set_up_queue( queue_table => '"streams_apply_qt"', queue_name => '"streams_apply_q"', queue_user => '"[target_stream_admin]"'); end;/begin dbms_streams_adm.add_schema_rules( schema_name '" ]"', streams_type => 'apply', streams_name => '"streams_apply"', queue_name => '"[target_stream_admin]"."streams_apply_q"', include_dml => true, include__ddl_ > false, => true, include__ddl_ > false include_rule => true);end;/commit;begin dbms_apply_adm.set_parameter( apply_name => 'streams_apply', parâmetro => 'disable_on_error', value => 'n');end;/begin dbms_apply_adm.set_parameter( apply_name => ' streams_apply', parâmetro => 'allow_duplicate_rows', value => 'y');end;/
Etapa-11 Instanciando o banco de dados de destino
conectar [target_stream_connection]
definir serverout on;execute dbms_output.enable(50000);declare handle1 number; número ind; número percent_done; job_state varchar2(30); le ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;começar começar executar imediatamente 'soltar usuário'||'[source_schema]'||' cascata'; exceção quando outros então nulos; fim; handle1 :=dbms_datapump.open('import','schema', '[target_dblink]'); dbms_datapump.add_file(handle1, 'streamimport_1349243553109.log', '[target_datapump_dir]', '', dbms_datapump.ku$_file_type_log_file); dbms_datapump.metadata_filter(handle1, 'schema_expr', 'em (''[source_schema]'')'); --'in (''cdsl11'',''kra'')' para vários dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handle1); percent_done :=0; job_state :='indefinido'; while (job_state !='completed') e (job_state !='stopped') loop dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump.ku$_status_wip,-1,job_state,sts); js :=sts.job_status; se js.percent_done !=percent_done then dbms_output.put_line('*** porcentagem do trabalho concluído =' || to_char(js.percent_done)); percent_done :=js.percent_done; fim se; if(bitand(sts.mask, dbms_datapump.ku$_status_wip) !=0) then le :=sts.wip; else if(bitand(sts.mask,dbms_datapump.ku$_status_job_error) !=0) then le :=sts.error; else le :=null; fim se; fim se; se le não for nulo, então ind :=le.first; enquanto ind não for null loop dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); laço final; fim se; laço final; dbms_output.put_line('trabalho concluído'); dbms_output.put_line('estado final do trabalho =' || estado_trabalho); dbms_datapump.detach (handle1); end;/conectar [fonte_stream_connection] Crie ou substitua o gatilho ddlTrigger após criar no número do databasedeclare n; comece se ora_dict_obj_type ='tabela' e ora_dict_obj_owner ='[fonte_schema] proprietário ='[source_schema]' e table_name =ora_dict_obj_name; if n =1 then dbms_streams_adm.add_table_rules (table_name => '[source_schema].' || ora_dict_obj_name, streams_type => 'capture', streams_name => 'streams_capture', queue_name => '[source_stream_admin].streams_capture_q', include_dml => Verdadeiro, incluir_ddl => false, inclusão_rule => false, fonte_database => '[fonte_database]'); fim se; exceção quando outros então nulo; fim; fim se;fim;/
Etapa-12 Iniciando o processo de aplicação no banco de dados arget
conectar [target_stream_connection]
defina serverout on;-- obtenha o número de instanciaçãodeclare o número iscn; beginiscn :=dbms_flashback.get_system_change_number();dbms_apply_adm.set_schema_instantiation_scn( source_schema_name => '"[source_schema]"',source_database_name => '[source_database]',instantiation_scn => iscn,recursive _ number;beginselect decode(status, 'enabled', 1, 0) em v_started de dba_apply onde apply_name ='streams_apply'; se (v_started =0) então dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); fim se;fim;/
Etapa-13 Iniciando o processo de captura de origem
conectar [source_stream_connection]
set serverout on;declare v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture where capture_name ='streams_capture'; se (v_started =0) então dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** progress message ===> iniciou o processo de captura streams_capture no banco de dados de origem estock e o processo de aplicação streams_apply no banco de dados de destino com sucesso. ***');end;/Your A configuração está agora concluída, para verificar se a configuração do seu steams está funcionando corretamente ou não use os seguintes comandos fazendo login com as credenciais de administrador de streams que você criou para o banco de dados de origem.
Selecione * De V$STREAMS_CAPTURE;
Selecione * De DBA_CAPTURE;Selecione * De DBA_PROPAGATION;Selecione * De DBA_CAPTURE_PREPARED_TABLES;E para banco de dados de destino, use as seguintes consultas efetuando login com credenciais de usuário de fluxos no banco de dados de destino.
Selecione * De DBA_APPLY;
Selecione * De DBA_APPLY_CONFLICT_COLUMNS;Selecione * De DBA_APPLY_EXECUTE;Selecione * De DBA_APPLY_ERROR;Selecione * De DBA_APPLY_PROGRESS;Selecione * De DBA_APPLY_INSTANTIATED_OBJECTS;Selecione * De V$STREAMS_TRANSACTION;Selecione *De V$PROPAGATION_RECEIVER;Caso você queira parar o processo de aplicação de destino, use o seguinte roteiro:
conectar [target_stream_connection]
set serverout on;declare v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_apply where apply_name ='streams_apply'; se (v_started =1) então dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/Caso você queira interromper o processo de captura do banco de dados de origem, use o seguinte processo:
conectar [source_stream_connection]
set serverout on;declare v_started number;beginselect decode(status, 'enabled', 1, 0) into v_started from dba_capture where capture_name ='streams_capture'; se (v_started =0) então dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** progress message ===> iniciou o processo de captura streams_capture no banco de dados de origem estock e o processo de aplicação streams_apply no banco de dados de destino com sucesso. ***');end;/
Se você não conseguir modificar esses scripts, poderá comprar este utilitário, com base no vb.net, verifique este link Oracle Replication Software.