Oracle रीयल-टाइम बैकअप सिस्टम क्या है?
Oracle स्ट्रीम प्रतिकृति वह प्रक्रिया है जो Oracle डेटाबेस स्कीमा को किसी अन्य Oracle डेटाबेस को दोहराने में सक्षम बनाती है, जो किसी भी स्थान पर स्थित हो सकती है। जब भी प्राथमिक डेटाबेस डीएमएल या डीडीएल में कोई लेन-देन होता है, तो यह लाइव बैकअप प्रतिलिपि बनाए रखने के लिए लक्ष्य डेटाबेस पर तुरंत निष्पादित होगा। नीचे मैं Oracle स्ट्रीम के लिए चरण दर चरण प्रतिकृति उदाहरण के लिए स्क्रिप्ट समझा रहा हूँ और प्रदान कर रहा हूँ।
Oracle स्ट्रीम प्रतिकृति सेटअप
इस पोस्ट में, मैं ओरेकल स्ट्रीम फीचर के माध्यम से ओरेकल डेटाबेस प्रतिकृति बनाने के चरणों का वर्णन कर रहा हूं, स्टैंडबाय डेटाबेस या डेटाबेस के लिए जिसका उपयोग रिपोर्टिंग और विश्लेषण उद्देश्य या किसी अन्य उद्देश्यों के लिए किया जा सकता है। यह ओरेकल स्ट्रीम फीचर ओरेकल 11 जी एंटरप्राइज संस्करण में समर्थित है और 10gR2 और 9iR2. Oracle Streams अब 12c में समर्थित नहीं है; अब Oracle इस सुविधा के लिए Oracle गोल्डन गेट का उपयोग कर रहा है। मैंने अन्य Oracle डेटाबेस के लिए एक प्रतिकृति बनाने के लिए सरल चरणों का वर्णन किया है, प्रत्येक चरण के लिए मैं SQL स्क्रिप्ट प्रदान कर रहा हूं जिसे आप कॉपी कर सकते हैं और चरण -1, चरण -2 आदि के रूप में सहेज सकते हैं। , फिर प्रतिकृति सेट करने के लिए एक-एक करके स्क्रिप्ट चलाएँ। लेकिन स्क्रिप्ट चलाने से पहले, अपने मानों को वर्ग कोष्ठक में बदलें [ ] और इसे ध्यान से बदलें, वर्ग कोष्ठक में सभी मान जिनका अर्थ पूर्ण नाम है, इसलिए बदल दें इसलिए।जरूरी! एक दूसरे के कनेक्शन के लिए स्रोत और लक्ष्य डेटाबेस दोनों के लिए tnsname.ora में एक प्रविष्टि बनाएँ।
चरण-1 लक्ष्य या द्वितीयक डेटाबेस को कॉन्फ़िगर करना
कनेक्ट [TARGET_SYS_CONNECTION] SYSDBA के रूप में; वैकल्पिक सिस्टम सेट AQ_TM_PROCESSES=3 SCOPE=BOTH; सिस्टम सेट को बदल दें Global_names=TRUE स्कोप=BOTH; सिस्टम सेट को बदल दें job_queue_processes=6 स्कोप=BOTH; सिस्टम सेट को बदलें streams_pool_size=100M स्कोप बदलें=BOTH undo_retention =3600 गुंजाइश =दोनों; तत्काल शटडाउन; स्टार्टअप माउंट; डेटाबेस खुला बदलें;चरण-2 स्रोत या प्राथमिक डेटाबेस को कॉन्फ़िगर करना
कनेक्ट [SOURCE_SYS_CONNECTION1] SYSDBA के रूप में; वैकल्पिक प्रणाली सेट AQ_TM_PROCESSES =3 SCOPE =दोनों; सिस्टम सेट Global_names =TRUE स्कोप =BOTH; सिस्टम सेट बदलें job_queue_processes =6 स्कोप =दोनों; सिस्टम सेट स्ट्रीम बदलें =BOTH; ALTER S स्कोप =48M स्कोप सेट करें SMTP_OUT_SERVER='[MAIL_SERVER] [MAIL_PORT]' SCOPE=BOTH;--- UNDO_RETENTION=86400alter system set undo_retention=3600 स्कोप=BOTH;---- UNDO_MANAGEMENT=AUTOAlter System Set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG]' स्कोप =Spfile बदलें; LOG_ARCHIVE_DEST_STATE_1 =स्कोप सक्षम करें; तत्काल शटडाउन; स्टार्टअप माउंट; डेटाबेस आर्काइवलॉग बदलें; डेटाबेस खोलें बदलें; डेटाबेस को पूरक लॉग डेटा जोड़ें (प्राथमिक कुंजी, अद्वितीय, विदेशी कुंजी) कॉलम जोड़ें; डेटाबेस फोर्स लॉगिंग बदलें; सिस्टम आर्काइव लॉग करेंट बदलें;चरण-3 स्रोत डेटाबेस के लिए तालिका स्थान बनाएं
[source_sys_connection1] को sysdba के रूप में कनेक्ट करें; टेबलस्पेस बनाएं [logminer_ts_name] डेटाफाइल '[logminer_datafile]' आकार 100mreuse autoextend पर अधिकतम असीमित असीमित; निष्पादित dbms_logmnr_d.set_tablespace('[logminer_ts_name]'); टेबलस्पेस बनाएं [stream_ts_name]datafile'[stream_ts_name]datafile' अधिकतम असीमित पर स्वत:विस्तार;चरण-4 स्रोत डेटाबेस के लिए Oracle स्ट्रीम व्यवस्थापक उपयोगकर्ता बनाएं
[source_sys_connection1] को sysdba के रूप में कनेक्ट करें;
[source_stream_psw] द्वारा पहचाना गया उपयोगकर्ता [source_stream_admin] बनाएं डिफ़ॉल्ट टेबलस्पेस [stream_ts_name] अस्थायी टेबलस्पेस अस्थायी; -- [source_stream_admin] के लिए 9 भूमिकाएँ [source_stream_admin] को संसाधन प्रदान करें; [source_stream_admin] को datapump_imp_full_database प्रदान करें; [source_stream_admin] को imp_full_database प्रदान करें; [source_stream_admin] को datapump_exp_full_database प्रदान करें; [source_stream_admin] को exp_full_database प्रदान करें; [source_stream_admin] को डीबीए दें; [source_stream_admin] से कनेक्ट करें; [source_stream_admin] को aq_administrator_role प्रदान करें; [source_stream_admin] को select_catalog_role प्रदान करें; उपयोगकर्ता बदलें [source_stream_admin] डिफ़ॉल्ट भूमिका संसाधन, imp_full_database, exp_full_database, dba, कनेक्ट, aq_administrator_role, select_catalog_role; -- [source_stream_admin] के लिए 15 सिस्टम विशेषाधिकार startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.alter_any_rule_set, अनुदेयी => '[source_stream_admin]', grant_option =सिस्टम_ शुरू करें।> 'dequeue_any', अनुदेयी => '[source_stream_admin]', admin_option => true);end;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.alter_any_option , अनुदानकर्ता => true);end;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_rule_obj, अनुदेयी => '[source_stream_admin]', grant_option => true);end;/ [source_stream_admin]; को असीमित टेबल स्पेस दें; [source_stream_admin] को प्रतिबंधित सत्र प्रदान करें; startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.execute_any_rule_set, अनुदेयी => '[source_stream_admin]', अनुदान_option => सच);अंत;> '[source_stream_admin]', Grant_option => true);end;/ [source_stream_admin] को सत्र बनाने की अनुमति दें; startsys.dbms_aqadm.grant_system_privilege ( विशेषाधिकार => 'enqueue_any', अनुदेयी => '[source_stream_admin]', admin_option => true);end;/ startsys.dbms_rule_adm.grant_system_privilege ( => 'enqueue_any', अनुदानकर्ता => [source_stream_admin]', अनुदान_विकल्प => सत्य);अंत;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_any_rule, अनुदेयी => '[source_stream_admin]', अनुदान_विकल्प => शुरू; .grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_evaluation_context_obj, अनुदेयी => '[source_stream_admin]', अनुदान_विकल्प => सत्य);अंत;/ शुरू होता है। ', admin_option => true);end;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_rule_set_obj, अनुदेयी => '[source_stream_admin]', grant_option_true);end;true);अंत; />/
चरण-5 लक्ष्य डेटाबेस के लिए स्ट्रीम व्यवस्थापक बनाना
[target_sys_connection] को sysdba के रूप में कनेक्ट करें;
--- [target_stream_psw] द्वारा पहचाने गए targetcreate उपयोगकर्ता [target_stream_admin] पर sys उपयोगकर्ता के रूप में चलाएं; -- strmadmin के लिए 9 भूमिकाएँ [target_stream_admin] को संसाधन प्रदान करती हैं; [target_stream_admin] को datapump_imp_full_database प्रदान करें; [target_stream_admin] को imp_full_database प्रदान करें; [target_stream_admin] को datapump_exp_full_database प्रदान करें; [target_stream_admin] को exp_full_database प्रदान करें; [target_stream_admin] को डीबीए दें; [target_stream_admin] से कनेक्ट करें; [target_stream_admin] को aq_administrator_role प्रदान करें; [target_stream_admin] को select_catalog_role प्रदान करें; उपयोगकर्ता बदलें [target_stream_admin] डिफ़ॉल्ट भूमिका संसाधन, imp_full_database, exp_full_database, dba, कनेक्ट, aq_administrator_role, select_catalog_role; -- [target_stream_admin] के लिए 15 सिस्टम विशेषाधिकार startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.alter_any_rule_set, अनुदेयी => '[target_stream_admin]', grant_option प्रारंभ सच);> 'dequeue_any', अनुदेयी => '[target_stream_admin]', admin_option => true);end;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.alter_any_rule, अनुदानी प्राप्त करें _adm.alter_any_rule, अनुदान प्राप्त करें। सच);अंत;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_rule_obj, अनुदेयी => '[target_stream_admin]', grant_option => true);end;/ [target_stream_admin] को प्रतिबंधित सत्र प्रदान करें; starteemsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.execute_any_rule_set, अनुदेयी => '[target_stream_admin]', अनुदान_विकल्प => सत्य); अंत;> '[target_stream_admin]', Grant_option => true);end;/ [target_stream_admin] को सत्र बनाने की अनुमति दें; startsys.dbms_aqadm.grant_system_privilege ( विशेषाधिकार => 'enqueue_any', अनुदेयी => '[target_stream_admin]', admin_option => true);end;/ startsys.dbms_rule_adm.grant_system_privilege_ ; [target_stream_admin]', अनुदान_विकल्प => सत्य);अंत;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_any_rule, अनुदेयी => '[target_stream_admin]', अनुदान/ .grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_evaluation_context_obj, अनुदेयी => '[target_stream_admin]', अनुदान_विकल्प => सत्य);अंत;/ > startsys.dbms_aqadm.grant_system _ विशेषाधिकार प्राप्त करें ', admin_option => true);end;/ startsys.dbms_rule_adm.grant_system_privilege( विशेषाधिकार => sys.dbms_rule_adm.create_rule_set_obj, अनुदेयी => '[target_stream_admin]', grant_option => true);चरण-6 स्रोत डेटाबेस के लिए डेटाबेस लिंक बनाना
कनेक्ट [source_stream_connection]
--- लक्ष्य डेटाबेस के लिए लिंक ... डेटाबेस लिंक बनाएं [source_dblink] [target_stream_admin] से कनेक्ट करें [target_stream_psw] द्वारा '[target_connect_string]' का उपयोग करके पहचाना गया;चरण-7 लक्ष्य डेटाबेस के लिए डेटाबेस लिंक बनाना
कनेक्ट [target_stream_connection]
डेटाबेस लिंक बनाएं [target_dblink] [source_stream_admin] से कनेक्ट करें जिसे [source_stream_psw] द्वारा '[source_connect_string]' का उपयोग करके पहचाना गया है;चरण-8 लक्ष्य डेटाबेस पर डेटापंब निर्देशिका बनाना
कनेक्ट [target_stream_connection]
निर्देशिका बनाएं या बदलें [target_datapump_dir] '[target_dir_location]' के रूप में;चरण-9 स्रोत डेटाबेस पर कैप्चर प्रक्रिया बनाना
गूंज बंद करें; --- strm_pwd_src प्रॉम्प्ट स्वीकार करें 'स्रोत पर स्ट्रीम व्यवस्थापक "strmadmin" का पासवर्ड दर्ज करें:' छुपाएं --- strm_pwd_dest प्रॉम्प्ट स्वीकार करें' गंतव्य पर "strmadmin" स्ट्रीम व्यवस्थापक का पासवर्ड दर्ज करें:' Hideconnect [source_stream_connection]; घोषित करें कर्सर विन है नियमसेट_नाम चुनें dba_rulessets से जहां स्वामी ='[source_stream_admin]';विन लूप में i के लिए प्रारंभ dbms_rule_adm.drop_rule_set( नियम_सेट_नाम => '[source_stream_admin].'||i.ruleset_name, delete_rules => true); अपवाद जब अन्य तब शून्य; अंत; अंत लूप;अंत;/शुरू करें dbms_streams_adm.set_up_queue( queue_table => '"streams_capture_qt"', queue_name => '"streams_capture_q"', queue_user => '"[source_stream_admin]"');end_ => '"[source_schema]"', streams_name => '"streams_propagation1"', source_queue_name => '"strmadmin"।"streams_capture_q"', db_queue_name => '"strmdly_q"।" => सच, शामिल_डीडीएल => सच, source_database => '[source_database]', समावेश_नियम => सच);अंत;/प्रतिबद्ध;नाम शुरू करें dbms_streams_adm. ', streams_name => '"streams_capture"', queue_name => '"[source_stream_admin]"।"streams_capture_q"', include_dml => सच है, n_rule => true);end;/- प्रत्येक स्कीमाकॉमिट के लिए 2 चरणों से ऊपर दोहराएं;घोषित कर्सर विन है dba_streams_unsupportedwhere स्वामी ='[source_schema]' से table_name चुनें; विन लूप में c शुरू करें dbms_streams_adm.add_table_rules => ' [source_schema] .'||c.table_name, streams_type => 'कैप्चर', 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]' );अंत लूप;प्रतिबद्ध;अंत;/चरण -10 लक्ष्य डेटाबेस पर लागू प्रक्रिया बनाना
कनेक्ट [target_stream_connection]
शुरू करें dbms_streams_adm.set_up_queue( queue_table => '"streams_apply_qt"', queue_name => '"streams_apply_q"', queue_user => '"[target_stream_admin]"'); अंत; ]"', streams_type => 'लागू करें', streams_name => '"streams_apply"', queue_name => '"[target_stream_admin]"।"streams_apply_q"', _ _ शामिल _d _= > सच शामिल करें समावेश_नियम => सत्य); अंत;/प्रतिबद्ध; प्रारंभ करें dbms_apply_adm.set_parameter ( apply_name => 'streams_apply', पैरामीटर => 'disable_on_error', मान _ मीटर ( => 'n'); अंत; streams_apply', पैरामीटर => 'allow_duplicate_rows', मान => 'y');end;/चरण-11 लक्ष्य डेटाबेस को त्वरित करना
कनेक्ट [target_stream_connection]
सर्वरआउट चालू करें; dbms_output.enable (50000) निष्पादित करें; हैंडल1 नंबर घोषित करें; उद्योग संख्या; प्रतिशत_डोन संख्या; job_state varchar2(30); ले कू$_लोगेंट्री; जेएस कू$_जॉबस्टैटस; जेडी कू$_jobdesc; sts ku$_status;शुरू शुरू तत्काल निष्पादित करें 'ड्रॉप उपयोगकर्ता'||'[source_schema]'||' झरना'; अपवाद जब अन्य तब अशक्त; अंत; हैंडल 1:=dbms_datapump.open ('आयात', 'स्कीमा', '[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'')' एकाधिक dbms_datapump.set_parameter(handle1, 'include_metadata', 1) के लिए; dbms_datapump.start_job(handle1); प्रतिशत_ किया:=0; जॉब_स्टेट:='अपरिभाषित'; जबकि (job_state !='पूर्ण') और (job_state !='stopped') लूप dbms_datapump.get_status(handle1, dbms_datapump.ku$_status_job_error + dbms_datapump.ku$_status_job,status + dbms_datapump.ku$_status_wip.ku$_status_wip); जेएस:=sts.job_status; अगर js.percent_done !=प्रतिशत_ किया गया है तो dbms_output.put_line('*** काम का प्रतिशत किया गया =' || to_char(js.percent_done)); प्रतिशत_ किया गया:=js.percent_done; अगर अंत; if(bitand(sts.mask, dbms_datapump.ku$_status_wip) !=0) तब ले :=sts.wip; और if(bitand(sts.mask,dbms_datapump.ku$_status_job_error) !=0) फिर le :=sts.error; अन्य ले :=शून्य; अगर अंत; अगर अंत; यदि le रिक्त नहीं है तो ind :=le.first; जबकि ind नल लूप नहीं है dbms_output.put_line(le(ind).logtext); इंडस्ट्रीज़:=ले.नेक्स्ट (इंड); अंत लूप; अगर अंत; अंत लूप; dbms_output.put_line ('कार्य पूरा हो गया है'); dbms_output.put_line ('अंतिम नौकरी की स्थिति =' || job_state); dbms_datapump.detach (हैंडल 1); अंत; मालिक ='[source_schema]' और table_name =ora_dict_obj_name; यदि n =1 तो dbms_streams_adm.add_table_rules (table_name => '[source_schema]।' TRUE, शामिल करें_डीडीएल => गलत, समावेश_रुले => गलत, source_database => '[source_database]'); अगर अंत; अपवाद जब अन्य तो अशक्त; अंत; अंत अगर; अंत;/चरण -12 arget डेटाबेस पर प्रक्रिया लागू करना शुरू करना
कनेक्ट [target_stream_connection]
सर्वरआउट चालू करें;-- इंस्टेंटेशन नंबर प्राप्त करें;आईएससीएन नंबर घोषित करें; startiscn :=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 c ; फिर से;;dba_apply से v_started में डिकोड (स्थिति, 'सक्षम', 1, 0) का चयन करें जहां apply_name ='streams_apply'; अगर (v_started =0) तो dbms_apply_adm.start_apply(apply_name => '"streams_apply"'); अंत अगर; अंत;/चरण-13 स्रोत कैप्चर प्रक्रिया प्रारंभ करना
कनेक्ट [source_stream_connection]
सर्वरआउट चालू करें;घोषणा v_started नंबर;शुरू करेंडिकोड का चयन करें(स्थिति, 'सक्षम', 1, 0) dba_capture से v_started में जहां कैप्चर_नाम ='streams_capture'; अगर (v_started =0) तो dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** प्रगति संदेश ===> स्रोत डेटाबेस एस्टॉक पर कैप्चर प्रक्रिया स्ट्रीम_कैप्चर शुरू किया और गंतव्य डेटाबेस पर सफलतापूर्वक लागू प्रक्रिया स्ट्रीम_अप्ली। ***'); समाप्त;/आपका सेटअप अब पूरा हो गया है, यह जांचने के लिए कि आपका स्टीम सेटअप ठीक से काम कर रहा है या स्रोत डेटाबेस के लिए आपके द्वारा बनाए गए स्ट्रीम एडमिन क्रेडेंशियल्स के साथ लॉग इन करके निम्न कमांड का उपयोग नहीं कर रहा है।* V$STREAMS_CAPTURE से चुनें;
चुनें * DBA_CAPTURE से; चुनें * DBA_PROPAGATION से; चुनें * DBA_CAPTURE_PREPARED_TABLES से; और लक्ष्य डेटाबेस के लिए लक्ष्य डेटाबेस पर स्ट्रीम उपयोगकर्ता क्रेडेंशियल्स के साथ लॉग इन करके निम्नलिखित प्रश्नों का उपयोग करें।* DBA_APPLY से चुनें;
DBA_APPLY_CONFLICT_COLUMNS से * चुनें; DBA_APPLY_EXECUTE से * चुनें; DBA_APPLY_ERROR से * चुनें; DBA_APPLY_PROGRESS से * चुनें; DBA_APPLY_INSTANTIATED_GOBJECTS से चुनें * प्रक्रिया का चयन करें * V$STREAMS का उपयोग करें; निम्नलिखित स्क्रिप्ट:कनेक्ट [target_stream_connection]
सर्वरआउट चालू करें;घोषणा v_started नंबर;शुरू करेंडिकोड का चयन करें(स्थिति, 'सक्षम', 1, 0) v_started में dba_apply से जहां apply_name ='streams_apply'; अगर (v_started =1) तो dbms_apply_adm.stop_apply(apply_name => '"streams_apply"'); अंत अगर; अंत;/यदि आप स्रोत डेटाबेस कैप्चर प्रक्रिया को रोकना चाहते हैं तो निम्न प्रक्रिया का उपयोग करें:कनेक्ट [source_stream_connection]
सर्वरआउट चालू करें;घोषणा v_started नंबर;शुरू करेंडिकोड (स्थिति, 'सक्षम', 1, 0) का चयन करें dba_capture से v_started में जहां कैप्चर_नाम ='streams_capture'; अगर (v_started =0) तो dbms_capture_adm.start_capture(capture_name => '"streams_capture"'); end if;end;/begindbms_output.put_line('*** प्रगति संदेश ===> स्रोत डेटाबेस एस्टॉक पर कैप्चर प्रक्रिया स्ट्रीम_कैप्चर शुरू कर दिया और गंतव्य डेटाबेस पर सफलतापूर्वक लागू प्रक्रिया streams_apply। ***'); समाप्त;/यदि आप इन लिपियों को संशोधित करने में सक्षम नहीं हैं तो आप इस उपयोगिता को खरीद सकते हैं, vb.net के आधार पर इस लिंक को देखें Oracle प्रतिकृति सॉफ्टवेयर।