Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle Streams Contoh Replikasi Langkah demi Langkah

Apa itu sistem pencadangan real-time Oracle?

Replikasi Oracle Streams adalah proses yang memungkinkan skema database Oracle untuk direplikasi ke database Oracle lain, yang dapat ditemukan di lokasi mana pun. Setiap kali transaksi terjadi di database utama DML atau DDL, itu akan segera dieksekusi ke database target untuk mempertahankan salinan cadangan langsung. Di bawah ini saya menjelaskan dan menyediakan skrip untuk Oracle Streams contoh replikasi langkah demi langkah.

Pengaturan Replikasi Aliran Oracle

Dalam posting ini, saya menjelaskan langkah-langkah untuk membuat replikasi database Oracle melalui fitur Oracle Streams, untuk database siaga atau database yang dapat digunakan untuk tujuan pelaporan dan analisis atau tujuan lainnya. Fitur Oracle Streams ini didukung di Oracle 11g Enterprise Edition dan 10gR2 dan 9iR2. Oracle Streams tidak lagi didukung di 12c; sekarang Oracle menggunakan Oracle Golden Gate untuk fitur ini. Saya menjelaskan langkah-langkah sederhana di bawah ini untuk membuat replikasi ke database Oracle lain, untuk setiap langkah saya menyediakan skrip SQL yang dapat Anda salin dan simpan sebagai langkah-1, langkah-2, dan seterusnya , kemudian jalankan skrip satu per satu untuk mengatur replikasi. Tetapi sebelum menjalankan skrip, ubah nilainya menjadi nilai Anda yang berada dalam tanda kurung siku [ ] dan ganti dengan hati-hati, semua nilai dalam tanda kurung siku memiliki arti nama lengkap jadi ubah demikian.

Penting! Buat entri di tnsname.ora untuk database sumber dan target untuk satu sama lain koneksi.

Langkah-1 Mengonfigurasi Target atau Database Sekunder

CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;ubah set sistem global_names=TRUE scope=BOTH;ubah set sistem job_queue_processes=6 scope=BOTH;ubah set sistem streams_pool_size=ubah cakupan sistem=BOTH undo_retention=3600 scope=BOTH;shutdown langsung;startup mount;ubah database terbuka;

Langkah-2 Mengonfigurasi Basis Data Sumber atau Utama

CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA;ALTER SYSTEM SET AQ_TM_PROCESSES=3 SCOPE=BOTH;ubah set sistem global_names=TRUE scope=BOTH;ubah set sistem job_queue_processes=6 scope=BOTH;ubah set sistem streams_pool_size=ALTER SET SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400alter set sistem undo_retention=3600 scope=BOTH;--- UNDO_MANAGEMENT=AUTOAlter Set Sistem LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATIONSpfile Setel LOG_ARCHIVE_DEST_STATE_1=aktifkan Cakupan=Spfile;shutdown segera;startup mount;mengubah database archivelog;mengubah database terbuka;Mengubah Database Menambahkan Data Log Tambahan (Primary Key, Unique, Foreign Key) Kolom;Mengubah Pencatatan Angkatan Database;Mengubah Log Arsip Sistem Saat Ini;

Langkah-3 Buat Tablespace untuk Database Sumber

hubungkan [source_sys_connection1] sebagai sysdba;buat tablespace [logminer_ts_name]datafile '[logminer_datafile]'size 100mreuse autoextend on maxsize unlimited;execute dbms_logmnr_d.set_tablespace('[logminer_ts_name]');membuat tablespace'[stream_datafiletuse]'size [stream_datafiletuse]'size] perpanjangan otomatis pada ukuran maksimal tidak terbatas;

Langkah-4 Buat Pengguna Admin Oracle Streams untuk Basis Data Sumber

sambungkan [source_sys_connection1] sebagai sysdba;

buat pengguna [source_stream_admin]  yang diidentifikasi oleh [source_stream_psw]  tablespace default [stream_ts_name]  tablespace temporer; -- 9 peran untuk [source_stream_admin]  memberikan sumber daya kepada [source_stream_admin]; berikan datapump_imp_full_database ke [source_stream_admin]; berikan imp_full_database ke [source_stream_admin]; berikan datapump_exp_full_database ke [source_stream_admin]; berikan exp_full_database ke [source_stream_admin]; berikan dba ke [source_stream_admin]; berikan koneksi ke [source_stream_admin]; berikan aq_administrator_role ke [source_stream_admin]; berikan select_catalog_role ke [source_stream_admin]; ubah sumber daya peran default [source_stream_admin] pengguna, imp_full_database, exp_full_database, dba, sambungkan, aq_administrator_role, select_catalog_role; ( 15 hak istimewa sistem untuk [source_stream_admin]  beginys.dbms_rule_adm.grant_system_privilege(  hak istimewa    => sys.dbms_rule_adm.alter_any_rule_set,  penerima hibah     dimulai true  => '[source_stream_admin]', ad_option =>_ ad_option =>_ ad_option> 'dequeue_any',  penerima hibah      => '[source_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  hak istimewa    => sys.dbms_rule_adm.alter => '  grantee_rule => _ grantee_rule => ' grantee_rule => ' grantee_rule_admin , grantee_rule true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  penerima hibah      => '[source_stream_admin]',  grant_option => true);end to;/  grant unlimited tablespace berikan sesi terbatas ke [source_stream_admin]; beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.execute_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  beginsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule_set,  grantee      => '[source_stream_admin]',  grant_option => true);end;/  berikan sesi pembuatan ke [source_stream_admin]; 'rueeys.dbms_aqadm.grant_system_privilege (  hak istimewa    => 'enqueue_any',  penerima hibah      => '[source_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege_=[source_stream_admin]',  grant_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  penerima hibah      => '[source_stream_admin]', dimulai trueymled. .grant_system_privilege(  hak istimewa    => sys.dbms_rule_adm.create_evaluation_context_obj,  penerima hibah      => '[source_stream_admin]',  grant_option => true);end;/  startys.dbms_aqadm. grant_system_ 'admingrant_> 'admingrant_aqadm. ',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  penerima hibah      => '[source_stream_admin]',  grant_option => />/

Langkah-5 Membuat Admin Streaming untuk database target

sambungkan [target_sys_connection] sebagai sysdba;

--- jalankan sebagai pengguna sistem di pengguna targetcreate [target_stream_admin]  yang diidentifikasi oleh [target_stream_psw]; -- 9 peran untuk strmadmin  memberikan sumber daya ke [target_stream_admin]; berikan datapump_imp_full_database ke [target_stream_admin]; berikan imp_full_database ke [target_stream_admin]; berikan datapump_exp_full_database ke [target_stream_admin]; berikan exp_full_database ke [target_stream_admin]; berikan dba ke [target_stream_admin]; berikan koneksi ke [target_stream_admin]; berikan aq_administrator_role ke [target_stream_admin]; berikan select_catalog_role ke [target_stream_admin]; ubah sumber daya peran default pengguna [target_stream_admin], imp_full_database, exp_full_database, dba, sambungkan, aq_administrator_role, select_catalog_role; ( 15 hak istimewa sistem untuk [target_stream_admin]  beginys.dbms_rule_adm.grant_system_privilege(  hak istimewa    => sys.dbms_rule_adm.alter_any_rule_set,  penerima hibah     dimulai true  => '[target_stream_admin]', ad_option =>_ ad_option =_ adm_option> 'dequeue_any',  penerima hibah      => '[target_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  hak istimewa    => sys.dbms_rule_adm.alter]'  grantee_rule => _ grantee_rule => ' grant_rule => ' grantee_rule_admin, any_rule true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_obj,  penerima hibah      => '[target_stream_admin]',  grant_option => true);end to;/ target grant unlimited tablespace_admin]; berikan sesi terbatas ke [target_stream_admin]; startsys.dbms_rule_adm.grant_system_privilege (privilege => sys.dbms_rule_adm.execute_any_rule_set, hibah => '[target_stream_admin', hibah_option => true); end;/startysys.dbms_rule_rule.adgrion =true); end;/startysys.dbms_rule_rule.adgreMeon =true); end;/startysys.dbms_rule_rule.> '[target_stream_admin]',  grant_option => true);end;/  berikan sesi pembuatan ke [target_stream_admin]; 'rueeys.dbms_aqadm.grant_system_privilege (  hak istimewa    => 'enqueue_any',  penerima hibah      => '[target_stream_admin]',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege_=[target_stream_admin]',  grant_option => true);end;/  startsys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_any_rule,  penerima hibah      => '[target_stream_admin]', dimulai trueymled. .grant_system_privilege(  hak istimewa    => sys.dbms_rule_adm.create_evaluation_context_obj,  penerima hibah      => '[target_stream_admin]',  grant_option => true);end;/  beginys.dbms_aqadm. target_grant_system_ 'admingrant_ > 'admingrant_aqadm. ',  admin_option => true);end;/  beginys.dbms_rule_adm.grant_system_privilege(  privilege    => sys.dbms_rule_adm.create_rule_set_obj,  penerima hibah      => '[target_stream_admin]',  grant_option =>

Langkah-6 Membuat Tautan Basis Data untuk Basis Data Sumber

sambungkan [source_stream_connection]

--- tautan untuk basis data target...buat tautan basis data [source_dblink] sambungkan ke [target_stream_admin] yang diidentifikasi oleh [target_stream_psw] menggunakan '[target_connect_string]';

Langkah-7 Membuat Tautan Basis Data untuk Basis Data Target

sambungkan [target_stream_connection]

buat tautan basis data [target_dblink] sambungkan ke [source_stream_admin] yang diidentifikasi oleh [source_stream_psw] menggunakan '[source_connect_string]';

Langkah-8 Membuat Direktori Datapumb pada database Target

sambungkan [target_stream_connection]

buat atau ganti direktori[target_datapump_dir] sebagai'[target_dir_location]';

Langkah-9 Membuat proses Capture di database sumber

matikan gema; ---accept strm_pwd_src prompt 'masukkan password stream admin "strmadmin" di sumber :' hide ---accept strm_pwd_dest prompt 'masukkan password stream admin "strmadmin" di tujuan :' hideconnect   [source_stream_connection];declare  cursor vin is    pilih ruleset_name from dba_rulesets where owner ='[source_stream_admin]';begin for i in vin loop begin  dbms_rule_adm.drop_rule_set(    rule_set_name => '[source_stream_admin].'||i.ruleset_name,    delete_rules  => true); pengecualian    saat yang lain kemudian null; akhir; 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]" _de; => '"[source_schema]"',   streams_name           => '"streams_propagation1"',    source_queue_name      => '"strmadmin"."streams_capture_q"',    destination_queue_name => '"include_appml"_dstream@'sourcely." => true,    include_ddl            => true,    source_database        => '[source_database]',    inklusi_rule           => true);/commit;begin  dbms_streams_adm_.add(_> . ',    streams_name       => '"streams_capture"',    queue_name         => '"[source_stream_admin]"."streams_capture_q"',    include_dml        => true,    include_ddl  =>_ ,clust n_rule     => true);end;/-- ulangi 2 langkah di atas untuk setiap schemacommit;deklarasikan kursor vin adalah    pilih table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]';mulai untuk c di vin loop dbms_streams_adm.add_table_name =>' [nama_tabel =>] .'||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;/

Langkah-10 Membuat proses Apply di database target

sambungkan [target_stream_connection]

mulai  dbms_streams_adm.set_up_queue(    queue_table => '"streams_apply_qt"',    queue_name  => '"streams_apply_q"',    queue_user  => '"[target_stream_admin]"');end;/begin _ db ]"',    streams_type       => 'apply',    streams_name       => '"streams_apply"',    queue_name         => '"[target_stream_admin]"."streams_apply_q"',    include      =_ dml ​​ > inclusion_rule     => true);end;/commit;begin  dbms_apply_adm.set_parameter(    apply_name  => 'streams_apply',    parameter   => 'disable_on_error',    value       => 'n');end;/begin_apply _name streams_apply',    parameter   => 'allow_duplicate_rows',    nilai       => 'y');end;/

Langkah-11 Membuat Instansi Database Target

sambungkan [target_stream_connection]

setel serverout on;execute dbms_output.enable(50000);deklarasikan  nomor handle1; nomor ind; nomor persen_selesai; job_state varchar2(30); le ku$_logentry; js ku$_jobstatus; jd ku$_jobdesc; sts ku$_status;begin  begin  eksekusi segera 'drop user '||'[source_schema]'||' riam'; pengecualian   ketika orang lain kemudian     null; akhir; 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', 'in (''[source_schema]'')'); --'in (''cdsl11'',''kra'')' untuk beberapa  dbms_datapump.set_parameter(handle1, 'include_metadata', 1); dbms_datapump.start_job(handle1); persen_selesai :=0; job_state :='tidak ditentukan'; while (job_state !='selesai') dan (job_state !='stopped') loop  dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job_status + dbms_datapump_wistate$,-1,job_wistate$,-1,job_wistate$,-1; js :=sts.job_status; if js.percent_done !=persen_selesai  maka     dbms_output.put_line('*** persen pekerjaan selesai =' || to_char(js.percent_done)); persen_selesai :=js.persen_done; berakhir jika; 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; berakhir jika; berakhir jika; jika file bukan null  maka    ind :=le.first; sementara ind bukan loop nol      dbms_output.put_line(le(ind).logtext); ind :=le.next(ind); lingkaran akhir; berakhir jika; lingkaran akhir; dbms_output.put_line('pekerjaan telah selesai'); dbms_output.put_line('status tugas akhir =' || status_pekerjaan); dbms_datapump.detach (handle1); end;/connect [source_stream_connection] Buat atau ganti pemicu ddltrigger setelah buat pada basis data nomor n; mulai jika ora_dict_obj_type ='tabel' dan ora_dict_obj_owner ='[source_schema] kemudian kemudian mulai ke ora_dict_obj_owner =' [source_schema] 'kemudian ora ora_dict_owner =' [source_schema] 'dan kemudian ke ORA_DICT_OWJ_OWNER =' [SOURCE_SCHEME] kemudian '[Source_SCHEMA] kemudian' [Source_SCHEMA] ' pemilik ='[source_schema]' dan table_name =ora_dict_obj_name; jika n =1 maka dbms_streams_adm.add_table_rules (table_name => '[source_schema].' || ora_dict_obj_name, streams_type => 'capture', streams_name => 'sover_capture', queue_name => ', sumber_streams. Benar, include_ddl => false, inclusion_rule => false, source_database => '[source_database]'); berakhir jika; pengecualian         ketika orang lain         lalu            null; akhir; akhiri jika; akhiri;/

Langkah-12 Memulai proses Apply di database arget

sambungkan [target_stream_connection]

aktifkan serverout;-- dapatkan nomor instantiasideklarasikan nomor iscn; clavedscn :=dbms_flashback.get_system_change_number();dbms_apply_adm.set_schema_instantiation_scn(    source_schema_name   => '"[source_schema]"',source_database_name => '[source_database]',instantiation  = > adalah   _scn;;mulai pilih decode(status, 'enabled', 1, 0) menjadi v_started dari dba_apply di mana apply_name ='streams_apply'; if (v_started =0) maka  dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); akhiri jika; akhiri;/

Langkah-13 Memulai proses Pengambilan Sumber

sambungkan [source_stream_connection]

set serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) ke v_started from dba_capture dimana capture_name ='streams_capture'; if (v_started =0) maka  dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** progress message ===> memulai proses capture streams_capture di estock database sumber dan proses apply streams_apply di database tujuan berhasil. ***');end;/Your pengaturan sekarang selesai, untuk memeriksa apakah pengaturan steams Anda berfungsi dengan benar atau tidak, gunakan perintah berikut dengan masuk dengan kredensial admin aliran yang Anda buat untuk database sumber.

Pilih * Dari V$STREAMS_CAPTURE;

Pilih * Dari DBA_CAPTURE;Pilih * Dari DBA_PROPAGATION;Pilih * Dari DBA_CAPTURE_PREPARED_TABLES;Dan untuk basis data target, gunakan kueri berikut dengan masuk menggunakan kredensial pengguna stream pada basis data target.

Pilih * Dari DBA_APPLY;

Pilih * Dari DBA_APPLY_CONFLICT_COLUMNS;Pilih * Dari DBA_APPLY_EXECUTE;Pilih * Dari DBA_APPLY_ERROR;Pilih * Dari DBA_APPLY_PROGRESS;Pilih * Dari DBA_APPLY_INSTANTIATED_OBJECTS;Select *TRANSAC_RECEPAMS dari target yang Anda inginkan skrip berikut:

sambungkan [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'; if (v_started =1) maka  dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); end if;end;/Jika Anda ingin menghentikan proses pengambilan basis data sumber, gunakan proses berikut:

sambungkan [source_stream_connection]

set serverout on;declare   v_started number;beginselect decode(status, 'enabled', 1, 0) ke v_started from dba_capture dimana capture_name ='streams_capture'; if (v_started =0) maka  dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** progress message ===> memulai proses capture streams_capture di estock database sumber dan proses apply streams_apply di database tujuan berhasil. ***');end;/

Jika Anda tidak dapat mengubah skrip ini, Anda dapat membeli utilitas ini, berdasarkan vb.net, periksa tautan ini Perangkat Lunak Replikasi Oracle.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menemukan karyawan dengan gaji tertinggi kedua?

  2. Bagaimana Anda bisa tahu jika suatu nilai bukan numerik di Oracle?

  3. Beberapa fungsi REPLACE di Oracle

  4. Jejak SQL, 10046 acara di Oracle:trcsess, utilitas tkprof

  5. Bagaimana Cara Menghasilkan Paket Tabel API di Oracle SQL Developer?