中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

oracle隊列(AQ)---實現orale到mysql的數據同步

發布時間:2020-08-18 09:56:44 來源:ITPUB博客 閱讀:247 作者:賀子_DBA時代 欄目:關系型數據庫
高級隊列(Advanced Queue,簡稱AQ): 
高級隊列是oracle的一種高級應用,它主要是表和觸發器之間的組合而成的一種應用。其主要作用是在各應用系統中進行消息傳遞。 
利用高級隊列來實現消息在兩個不同數據庫之間的異步傳輸,滿足業務系統的改造需求。 
我們利用觸發器+高級序列 然后加ruby讀取隊列的主鍵,然后再在對應表中查出數據,insert 進mysql,這是idc機房oracle到idc的mysql的過程;
至于idc機房到阿里云的mysql,處于安全考慮,ruby不能直接連接rds,借助了mq, 先放放到mq,然后從mq讀取放進rds. 實現oracle到mysql的同步。需要注意oracle高級序列是可以讓多個
Oracle 高級隊列具體開發步驟如下:
(1)首先確定應用的需求,是否適合使用高級隊列?使用高級隊列預計提高性能的預期值
(2)賦予數據庫賬戶相應aq權限。
(3)確定隊列包體結構,即創建type。
(4)創建隊列表及隊列。
(5)隊列管理
一:我們的隊列結構(type):
因為我們oracle中信息表有兩個:t_publish_info 和t_publish_zbxx,所以會比會員表t_member_info 的type多一個字段:table_name 用來區分是從那個表讀取數據,其中opr也是是標識位,1表示insert, 2表示update ,3表示delete
CREATE OR REPLACE TYPE INFOSERVICE."INFO_SYNC_TYPE2" as object
(
table_name number(3),
opr number(2) ,
record_id number(20)
);
二:隊列表:INFOSERVICE.T_INFO_SYNC_MESSAGE
begin
sys.dbms_aqadm.create_queue_table(
queue_table => 'INFOSERVICE.T_INFO_SYNC_MESSAGE',
queue_payload_type => 'INFOSERVICE.INFO_SYNC_TYPE2',
sort_list => 'ENQ_TIME',
compatible => '10.0.0',
primary_instance => 0,
secondary_instance => 0,
storage_clause => 'tablespace INFOSERVICE pctfree 10 initrans 1 maxtrans 255 storage ( initial 16M next 16M minextents 1 maxextents unlimited )');
end;
/
三:創建隊列:
begin
  sys.dbms_aqadm.create_queue
 (
  queue_name     => 'infoservice.q_info_sync_message',
  queue_table    => 'INFOSERVICE.T_INFO_SYNC_MESSAGE',                 
  queue_type     => sys.dbms_aqadm.normal_queue,
  max_retries    => 3,                              
  retry_delay    => 1,                              
  retention_time => 0                                
 );
end;
啟動隊列:
begin
  sys.dbms_aqadm.start_queue
  (queue_name => 'infoservice.q_info_sync_message',enqueue => true ,dequeue => true );
end;
暫停隊列:
begin
  sys.dbms_aqadm.stop_queue ( queue_name => '隊列名');
end;
刪除隊列:
begin
  sys.dbms_aqadm.drop_queue ( queue_name => '隊列名');
end;
刪除隊列表:
begin
  sys.dbms_aqadm.drop_queue_table (queue_table   =>  '隊列表名');
end;
四:入隊存儲過程DBMS_AQ.enqueue:
create or replace procedure infoservice.info_sync_enqueue( table_name in number, opr in number,record_id in number)
as
begin
DECLARE
queue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_id RAW(16);
my_message info_sync_type2;
BEGIN
my_message := info_sync_type2( table_name, opr,record_id );
DBMS_AQ.enqueue(queue_name => 'infoservice.q_info_sync_message',
enqueue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id);
COMMIT;
END;
end info_sync_enqueue;
出對存儲過程DBMS_AQ.DEQUEUE:
create or replace procedure infoservice.info_sync_dequeue(table_name out number,opr out number ,record_id out number)
as
begin
DECLARE
queue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_id RAW(200);
my_message info_sync_type2;
BEGIN
DBMS_AQ.DEQUEUE(
queue_name => 'infoservice.q_info_sync_message',
dequeue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id );
COMMIT;
table_name := my_message.table_name;
opr :=my_message. opr;
record_id := my_message.record_id ;
END;
end info_sync_dequeue;
五:我們這里用的觸發器實現自動入隊,當在T_PUBLISH_INFO表上做增刪改的時候,觸發入隊,通過標識字段 opr的值 來區分: 1表示insert, 2表示update ,3表示delete:
create or replace trigger INFOSERVICE.TRG_PUBLISH_2016A_Q
before insert or delete or update of table_name,table_name2,cust_id, title,publish_date,OK_STATUS,OK_DATE,UP_DATE,IN_DATE,FILE_NAME on T_PUBLISH_INFO
for each row
declare
queue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_id RAW(16);
my_message info_sync_type2;
opr number(2);
table_name number(3);
begin
opr := 0;
table_name := 22;###就把標識位置為22,
CASE
WHEN inserting THEN
if (:NEW.OK_STATUS = 'Y') then
opr := 1;
my_message := info_sync_type2( table_name, opr,:new.record_id );
end if;
WHEN updating THEN
if ((:NEW.OK_STATUS != :OLD.OK_STATUS)or (:NEW.OK_STATUS = 'Y' )) then
opr := 2;
my_message := info_sync_type2( table_name, opr,:new.record_id );
end if;
WHEN deleting THEN
opr := 3;
my_message := info_sync_type2( table_name, opr,:old.record_id );
END CASE;
if ( opr != 0) then
DBMS_AQ.enqueue(queue_name => 'infoservice.q_info_sync_message',
enqueue_options => queue_options,
message_properties =>message_properties,
payload => my_message,
msgid => message_id);
end if;
end;
這里的table_name:=22,就是說這個觸發器入隊的時候,就把標識位table_name設置成了22,方便接下來ruby在讀取的時候,判斷從那個表讀取數據,
call infoservice.info_sync_enqueue(21,1,39097403);
call infoservice.info_sync_enqueue(155,1,39097403); ---這樣就讀t_publish_info_20142015
執行入隊的存儲過程,就會把type(INFO_SYNC_TYPE2)對應的三個字段的值存進隊列表中,如下:需要注意的是隊列表的字段是固定的。
SQL> desc INFOSERVICE.T_INFO_SYNC_MESSAGE;
Name Null? Type
----------------------------------------- -------- ----------------------------
Q_NAME VARCHAR2(30)
MSGID NOT NULL RAW(16)
CORRID VARCHAR2(128)
PRIORITY NUMBER
STATE NUMBER
DELAY TIMESTAMP(6)
EXPIRATION NUMBER
TIME_MANAGER_INFO TIMESTAMP(6)
LOCAL_ORDER_NO NUMBER
CHAIN_NO NUMBER
CSCN NUMBER
DSCN NUMBER
ENQ_TIME TIMESTAMP(6)
ENQ_UID VARCHAR2(30)
ENQ_TID VARCHAR2(30)
DEQ_TIME TIMESTAMP(6)
DEQ_UID VARCHAR2(30)
DEQ_TID VARCHAR2(30)
RETRY_COUNT NUMBER
EXCEPTION_QSCHEMA VARCHAR2(30)
EXCEPTION_QUEUE VARCHAR2(30)
STEP_NO NUMBER
RECIPIENT_KEY NUMBER
DEQUEUE_MSGID RAW(16)
SENDER_NAME VARCHAR2(30)
SENDER_ADDRESS VARCHAR2(1024)
SENDER_PROTOCOL NUMBER
USER_DATA INFOSERVICE.INFO_SYNC_TYPE2
USER_PROP ANYDATA
查看現在隊列表中的數據,USER_DATA.table_name ,USER_DATA.opr ,USER_DATA.record_id 這三個是之前type中定義的字段。
select * from INFOSERVICE.T_INFO_SYNC_MESSAGE;
oracle隊列(AQ)---實現orale到mysql的數據同步
總結:我們這個案例中高級隊列中實際上保存的最重要的信息是那個主鍵id,也就是record_id,然后ruby連接上oracle和mysql。通過主鍵id在oracle對應的表中查出數據(通過table_name 的值來判斷是從哪個表找數據),通過標識符opr的值來判斷是增刪改操作。ruby讀取oracle數據到內存中,然后insert 到mysql。實現了可靠的異步同步。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拜城县| 太和县| 九龙坡区| 青铜峡市| 都江堰市| 确山县| 建宁县| 嘉义县| 周口市| 格尔木市| 张家港市| 波密县| 陵川县| 绍兴市| 郁南县| 南木林县| 丰原市| 肇州县| 五河县| 霍林郭勒市| 班玛县| 永胜县| 资源县| 个旧市| 民权县| 巴彦县| 永济市| 民丰县| 新兴县| 榆树市| 九龙城区| 眉山市| 托里县| 桦川县| 峨边| 瑞金市| 弥渡县| 浦东新区| 宣威市| 庐江县| 隆回县|