Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Exemplo de replicação passo a passo do Oracle Streams

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.