Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle Streams Step by Step Replication Ví dụ

Hệ thống sao lưu thời gian thực Oracle là gì?

Sao chép Oracle Streams là quá trình cho phép lược đồ cơ sở dữ liệu Oracle sao chép sang một cơ sở dữ liệu Oracle khác, có thể được định vị ở bất kỳ vị trí nào. Bất cứ khi nào một giao dịch xảy ra trong cơ sở dữ liệu chính DML hoặc DDL, nó sẽ thực thi ngay lập tức với cơ sở dữ liệu đích để duy trì một bản sao lưu trực tiếp. Dưới đây, tôi giải thích và cung cấp các tập lệnh cho ví dụ sao chép từng bước của Oracle Streams.

Thiết lập sao chép các luồng Oracle

Trong bài đăng này, tôi mô tả các bước để tạo bản sao cơ sở dữ liệu Oracle thông qua tính năng Oracle Streams, cho cơ sở dữ liệu dự phòng hoặc cơ sở dữ liệu có thể được sử dụng cho mục đích báo cáo và phân tích hoặc bất kỳ mục đích nào khác. Tính năng Oracle Streams này được hỗ trợ trong Oracle 11g Enterprise Edition và 10gR2 và 9iR2. Oracle Streams không còn được hỗ trợ trong 12c; Hiện tại Oracle đang sử dụng Oracle Golden Gate cho tính năng này. , sau đó chạy lần lượt các tập lệnh để thiết lập bản sao.Nhưng trước khi chạy các tập lệnh, hãy thay đổi các giá trị thành các giá trị của bạn nằm trong dấu ngoặc vuông [] và thay thế nó một cách cẩn thận, tất cả các giá trị trong dấu ngoặc vuông có nghĩa là tên đầy đủ, vì vậy hãy thay đổi cho phù hợp.

Quan trọng! Tạo một mục nhập trong tnsname.ora cho cả cơ sở dữ liệu nguồn và cơ sở dữ liệu đích cho mỗi kết nối khác.

Bước 1 Định cấu hình Cơ sở dữ liệu Mục tiêu hoặc Phụ

CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA; ALTER SYSTEM SET AQ_TM_PROCESSES =3 SCOPE =BOTH; thay đổi hệ thống đặt global_names =TRUE scope =BOTH; thay đổi hệ thống set job_queue_processes =6 scope =BOTH; thay đổi hệ thống thiết lập stream_pool_size =100M phạm vi hệ thống =BOTH; undo_retention =3600 scope =BOTH; tắt ngay lập tức; khởi động mount; thay đổi cơ sở dữ liệu đang mở;

Bước 2 Định cấu hình nguồn hoặc cơ sở dữ liệu chính

CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA; ALTER SYSTEM SET AQ_TM_PROCESSES =3 SCOPE =BOTH; thay đổi hệ thống đặt global_names =TRUE scope =BOTH; thay đổi hệ thống đặt job_queue_processes =6 scope =BOTH; thay đổi hệ thống thiết lập stream_pool_size =48M scope =BOTH; ALTER_size =48M scope =BOTH; SMTP_OUT_SERVER ='[MAIL_SERVER] [MAIL_PORT]' SCOPE =BOTH; --- UNDO_RETENTION =86400alter hệ thống đặt undo_retention =3600 scope =BOTH; --- UNDO_MANAGEMENT =AUTOAlter System Set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG]' Hệ thống thay thế_DEST_1 ='[ARCHIVELOG] Đặt LOG_ARCHIVE_DEST_STATE_1 =enable Scope =Spfile; shutdown ngay lập tức; khởi động mount; thay đổi kho lưu trữ cơ sở dữ liệu; mở cơ sở dữ liệu thay đổi; Cơ sở dữ liệu thay thế Thêm dữ liệu nhật ký bổ sung (Khoá chính, Khoá duy nhất, Khoá ngoại); Thay thế lực lượng cơ sở dữ liệu ghi nhật ký; Thay đổi hệ thống lưu trữ bản ghi hiện tại;

Bước-3 Tạo vùng bảng cho Cơ sở dữ liệu nguồn

kết nối [source_sys_connection1] dưới dạng sysdba; tạo không gian bảng [logminer_ts_name] datafile '[logminer_datafile]' kích thước 100m sử dụng tự động lập chỉ mục trên maxsize không giới hạn; thực thi dbms_logmnr_d.set_tablespace ('[logminer_ts_name]'); tạo không gian bảng [stream_ts_tệp] 'size_name]') autoextend trên maxsize không giới hạn;

Bước-4 Tạo người dùng quản trị luồng Oracle cho Cơ sở dữ liệu nguồn

kết nối [source_sys_connection1] dưới dạng sysdba;

tạo người dùng [source_stream_admin] được xác định bởi [source_stream_psw] không gian bảng mặc định [stream_ts_name] tạm thời không gian bảng tạm thời; - 9 vai trò cho [source_stream_admin] cấp tài nguyên cho [source_stream_admin]; cấp datapump_imp_full_database cho [source_stream_admin]; cấp imp_full_database cho [source_stream_admin]; cấp datapump_exp_full_database cho [source_stream_admin]; cấp exp_full_database cho [source_stream_admin]; cấp dba cho [source_stream_admin]; cấp kết nối với [source_stream_admin]; cấp aq_administrator_role cho [source_stream_admin]; cấp select_catalog_role cho [source_stream_admin]; thay đổi tài nguyên vai trò mặc định của người dùng [source_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; - 15 đặc quyền hệ thống cho [source_stream_admin] beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.alter_any_rule_set, người được cấp => '[source_stream_admin]', Grant_optiongrage => true); end; / beginysystem.dmms.> 'dequeue_any', người được cấp => '[source_stream_admin]', admin_option => true); end; / beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.alter_any_rule, Grantee => '[source_stream] true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_rule_obj, Grantee => '[source_stream_admin]', Grant_option => true); end; / cấp không gian bảng không giới hạn cho [source_stream_admin]; cấp phiên hạn chế cho [source_stream_admin]; beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.execute_any_rule_set, người được cấp => '[source_stream_admin]', Grant_option => true); end; / startedys.dbms_rule_adm.grant_system_vilem_prile =synt_set_system_prile =synt_set_system_prile => '[source_stream_admin]', Grant_option => true); end; / cấp phép tạo phiên cho [source_stream_admin]; beginys.dbms_aqadm.grant_system_privilege (đặc quyền => 'enqueue_any', người được cấp => '[source_stream_admin]', admin_option => true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms.exrule, Grant_adm.exrule, Grant [source_stream_admin] ', Grant_option => true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_any_rule, Grantee =>' [source_stream_admin] ', Grant_option => true); end; .grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_evaluation_context_obj, người được cấp => '[source_stream_admin]', Grant_option => true); end; / beginys.dbms_aqadm.grant_system_prige_any '[source], management_system_prige => đặc quyền' [source] ', Admin_option => true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_rule_set_obj, Grantee =>' [source_stream_admin] ', Grant_option => true); end;
/

Bước-5 Tạo quản trị luồng cho cơ sở dữ liệu đích

kết nối [target_sys_connection] dưới dạng sysdba;

--- chạy với tư cách người dùng hệ thống tại người dùng targetcreate [target_stream_admin] được xác định bởi [target_stream_psw]; - 9 vai trò cho strmadmin cấp tài nguyên cho [target_stream_admin]; cấp datapump_imp_full_database cho [target_stream_admin]; cấp imp_full_database cho [target_stream_admin]; cấp datapump_exp_full_database cho [target_stream_admin]; cấp exp_full_database cho [target_stream_admin]; cấp dba cho [target_stream_admin]; cấp kết nối với [target_stream_admin]; cấp aq_administrator_role cho [target_stream_admin]; cấp select_catalog_role cho [target_stream_admin]; thay đổi tài nguyên vai trò mặc định của người dùng [target_stream_admin], imp_full_database, exp_full_database, dba, connect, aq_administrator_role, select_catalog_role; - 15 đặc quyền hệ thống cho [target_stream_admin] beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.alter_any_rule_set, người được cấp => '[target_stream_admin]', Grant_optiongrage => true); end; / beginysystem.dmms.> 'dequeue_any', người được cấp => '[target_stream_admin]', admin_option => true); end; / beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.alter_any_rule, Grantee => '[target_stream] true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_rule_obj, Grantee => '[target_stream_admin]', Grant_option => true); end; / cấp không gian bảng không giới hạn cho [target_stream_admin]; cấp phiên bị hạn chế cho [target_stream_admin]; beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.execute_any_rule_set, người được cấp => '[target_stream_admin]', Grant_option => true); end; / startedys.dbms_rule_adm.grant_system_vilem_prile =synt_set_system_prile =synt_set_system_prile => synt_set_system_prile => '[target_stream_admin]', Grant_option => true); end; / cấp phép tạo phiên cho [target_stream_admin]; beginys.dbms_aqadm.grant_system_privilege (đặc quyền => 'enqueue_any', người được cấp => '[target_stream_admin]', admin_option => true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms.exrule, Grant_adm.exrule [target_stream_admin] ', Grant_option => true); end; / startedys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_any_rule, Grantee =>' [target_stream_admin] ', Grant_option => true); end; end; .grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_evaluation_context_obj, người được cấp => '[target_stream_admin]', Grant_option => true); end; / startedys.dbms_aqadm.grant_system_prige_any '[target_stream_system_prige => đặc quyền' [target_stream => ' ', Admin_option => true); end; / beginys.dbms_rule_adm.grant_system_privilege (đặc quyền => sys.dbms_rule_adm.create_rule_set_obj, người được cấp =>' [target_stream_admin] ', Grant_option => true); end; /

Bước-6 Tạo liên kết cơ sở dữ liệu cho cơ sở dữ liệu nguồn

kết nối [source_stream_connection]

--- liên kết cho cơ sở dữ liệu đích ... tạo liên kết cơ sở dữ liệu [source_dblink] kết nối với [target_stream_admin] được xác định bởi [target_stream_psw] using '[target_connect_string]';

Bước-7 Tạo liên kết cơ sở dữ liệu cho cơ sở dữ liệu đích

kết nối [target_stream_connection]

tạo liên kết cơ sở dữ liệu [target_dblink] kết nối với [source_stream_admin] được xác định bởi [source_stream_psw] bằng cách sử dụng '[source_connect_string]';

Bước-8 Tạo thư mục Datapumb trên cơ sở dữ liệu Target

kết nối [target_stream_connection]

tạo hoặc thay thế thư mục [target_datapump_dir] thành '[target_dir_location]';

Bước-9 Tạo quy trình Capture tại cơ sở dữ liệu nguồn

tắt tiếng vang; --- chấp nhận lời nhắc strm_pwd_src 'nhập mật khẩu của luồng quản trị "strmadmin" tại nguồn:' ẩn --- chấp nhận lời nhắc strm_pwd_dest 'nhập mật khẩu của luồng quản trị "strmadmin" tại đích:' hideconnect [source_stream_connection]; khai báo con trỏ vin là select 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); ngoại lệ khi những người khác sau đó null; chấm dứt; end loop; end; / begin dbms_streams_adm.set_up_queue (queue_table => '"stream_capture_qt"', queue_name => '"stream_capture_q"', queue_user => '"[source_stream_admin]"'); end; / begin dbmsname.adprop_sadm => '"[source_schema]"', stream_name => '"stream_propagation1"', source_queue_name => '"strmadmin". "stream_capture_q"', destination_queue_name => '"strmadmin". "stream_apply_q" @ [source_dblink]', include_dml => true, include_ddl => true, source_database => '[source_database]', inclusive_rule => true); end; / commit; begin dbms_streams_adm.add_schema_rules (schema_name => '"[source_schema]"', stream_type => 'capture ', Stream_name =>' "Stream_capture" ', queue_name =>' "[source_stream_admin]". "Stream_capture_q" ', include_dml => true, include_ddl => true, include_tagged_lcr => false, inclusio n_rule => true); end; / - lặp lại 2 bước trên cho mỗi schemacommit; khai báo con trỏ vin is select table_namefrom dba_streams_unsupportedwhere owner ='[source_schema]'; beginfor c in vin loop dbms_streams_adm.add_table_rules (table_name =>] '[source_schema . '|| c.table_name, Stream_type =>' capture ', Stream_name =>' Stream_capture ', queue_name =>' [source_stream_admin] .streams_capture_q ', include_dml => true, include_ddl => false, inclusive_rule => false, source_database => '[source_database]'); end loop; commit; end; /

Bước-10 Tạo quy trình Áp dụng tại cơ sở dữ liệu đích

kết nối [target_stream_connection]

begin dbms_streams_adm.set_up_queue (queue_table => '"stream_apply_qt"', queue_name => '"stream_apply_q"', queue_user => '"[target_stream_admin]"'); end; / begin dbms_streams_adm.add_schema [source_streams_adm.add_schema " ] "', Stream_type =>' apply ', Stream_name =>'" Stream_apply "', queue_name =>'" [target_stream_admin] "." Stream_apply_q "', include_dml => true, include_ddl => true, include_tagged_lcr => false, inclusive_rule => true); end; / commit; begin dbms_apply_adm.set_parameter (apply_name => 'stream_apply', tham số => 'disable_on_error', value => 'n'); end; / begin dbms_apply_adm.set_parameter (apply_name => ' stream_apply ', tham số =>' allow_duplicate_rows ', value =>' y '); end; /

Bước-11 Khởi tạo cơ sở dữ liệu mục tiêu

kết nối [target_stream_connection]

đặt serverout trên; thực thi dbms_output.enable (50000); khai báo số handle1; số ind; số phần trăm; job_state varchar2 (30); le ku $ _logentry; js ku $ _jobstatus; jd ku $ _jobdesc; sts ku $ _status; begin begin thực thi ngay lập tức 'drop user' || '[source_schema]' || ' thác '; ngoại lệ khi những người khác sau đó null; chấm dứt; 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' ')' cho nhiều dbms_datapump.set_parameter (handle1, 'include_metadata', 1); dbms_datapump.start_job (xử lý1); phần trăm_done:=0; job_state:='undefined'; while (job_state! ='complete') and (job_state! ='stop') vòng lặp dbms_datapump.get_status (handle1, dbms_datapump.ku $ _status_job_error + dbms_datapump.ku $ _stipus_job_status + dbms_datstapump.ku; js:=sts.job_status; if js.percent_done! =erc_done then dbms_output.put_line ('*** job phần trăm done =' || to_char (js.percent_done)); phần trăm_done:=js.percent_done; kết thúc nếu; 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; kết thúc nếu; kết thúc nếu; nếu le không null thì ind:=le.first; trong khi ind không phải là null loop dbms_output.put_line (le (ind) .logtext); ind:=le.next (ind); kết thúc vòng lặp; kết thúc nếu; kết thúc vòng lặp; dbms_output.put_line ('công việc đã hoàn thành'); dbms_output.put_line ('trạng thái công việc cuối cùng =' || job_state); dbms_datapump.detach (handle1); end; / connect [source_stream_connection] tạo hoặc thay thế trình kích hoạt ddltrigger sau khi tạo trên n số dữ liệu; bắt đầu nếu ora_dict_obj_type ='table' và ora_dict_obj_owner ='[source_snsuchema]' rồi bắt đầu chọn 1 vào n từ dba_streams owner ='[source_schema]' và table_name =ora_dict_obj_name; if n =1 then dbms_streams_adm.add_table_rules (table_name => '[source_schema].' || ora_dict_obj_name, stream_type => 'capture', stream_name => 'stream_capture', queue_name => '[source_stream_admin] .streams_capture true, include_ddl => false, inclusive_rule => false, source_database => '[source_database]'); kết thúc nếu; ngoại lệ khi những người khác sau đó null; chấm dứt; kết thúc nếu; kết thúc; /

Bước-12 Bắt đầu quy trình Áp dụng tại cơ sở dữ liệu arget

kết nối [target_stream_connection]

thiết lập serverout on; - lấy số tức thờideclare iscn number; beginiscn:=dbms_flashback.get_system_change_number (); dbms_apply_adm.set_schema_instantiation_scn (source_schema_name => '"[source_schema]"', source_database_name => '[source_database_scn]; giải mã beginelect (trạng thái, 'đã bật', 1, 0) thành v_started từ dba_apply nơi apply_name ='stream_apply'; if (v_started =0) then dbms_apply_adm.start_apply (apply_name => '"stream_apply"'); kết thúc nếu; kết thúc; /

Bước-13 Bắt đầu quy trình Chụp nguồn

kết nối [source_stream_connection]

đặt serverout on; khai báo số v_started; giải mã bắt đầu chọn (trạng thái, 'đã bật', 1, 0) thành v_started từ dba_capture nơi capture_name ='stream_capture'; if (v_started =0) then dbms_capture_adm.start_capture (capture_name => '"Stream_capture"'); end if; end; /begindbms_output.put_line ('*** process message ===> đã bắt đầu quá trình thu thập stream_capture tại cơ sở dữ liệu nguồn và quy trình áp dụng stream_apply tại cơ sở dữ liệu đích thành công. ***'); end; / Your hiện đã hoàn tất thiết lập, để kiểm tra xem thiết lập steams của bạn có hoạt động bình thường hay không, hãy sử dụng các lệnh sau bằng cách đăng nhập bằng thông tin đăng nhập quản trị luồng mà bạn đã tạo cho cơ sở dữ liệu nguồn.

Chọn * Từ V $ STREAMS_CAPTURE;

Chọn * Từ DBA_CAPTURE; Chọn * Từ DBA_PROPAGATION; Chọn * Từ DBA_CAPTURE_PREPARED_TABLES; Và đối với cơ sở dữ liệu đích, hãy sử dụng các truy vấn sau bằng cách đăng nhập bằng luồng thông tin đăng nhập của người dùng trên cơ sở dữ liệu đích.

Chọn * Từ DBA_APPLY;

Chọn * Từ DBA_APPLY_CONFLICT_COLUMNS; Chọn * Từ DBA_APPLY_EXECUTE; Chọn * Từ DBA_APPLY_ERROR; Chọn * Từ DBA_APPLY_PROGRESS; Chọn * Từ DBA_APPLY_INSTANTIATED_OBJECT_RES; Chọn * Từ V $ V $ STREAMSAGATION để dừng quá trình sử dụng trong trường hợp bạn muốn sử dụng. tập lệnh sau:

kết nối [target_stream_connection]

đặt serverout on; khai báo số v_started; giải mã bắt đầu chọn (trạng thái, 'đã bật', 1, 0) thành v_started từ dba_apply nơi apply_name ='stream_apply'; if (v_started =1) then dbms_apply_adm.stop_apply (apply_name => '"stream_apply"'); end if; end; / Trong trường hợp bạn muốn dừng quy trình chụp cơ sở dữ liệu nguồn, hãy sử dụng quy trình sau:

kết nối [source_stream_connection]

đặt serverout on; khai báo số v_started; giải mã bắt đầu chọn (trạng thái, 'đã bật', 1, 0) thành v_started từ dba_capture nơi capture_name ='stream_capture'; if (v_started =0) then dbms_capture_adm.start_capture (capture_name => '"Stream_capture"'); end if; end; /begindbms_output.put_line ('*** thông báo tiến trình ===> bắt đầu quá trình thu thập stream_capture tại cơ sở dữ liệu nguồn và quy trình áp dụng stream_apply tại cơ sở dữ liệu đích thành công. ***'); end; /

Nếu bạn không thể sửa đổi các tập lệnh này thì bạn có thể mua tiện ích này, dựa trên vb.net, hãy kiểm tra liên kết này Phần mềm sao chép 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. Cách chạy Tạo bảng DDL với THỰC HIỆN NGAY LẬP TỨC trong cơ sở dữ liệu Oracle

  2. Khóa Liquibase - lý do?

  3. Cách trả lại Dấu thời gian Unix trong Oracle

  4. Chính xác thì dấu ngoặc kép xung quanh tên bảng làm gì?

  5. Hàm REPLACE () trong Oracle