成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從Oracle到MariaDB的同步復制

數據庫 Oracle MariaDB
幾種從Oracle數據庫或其它如文本文件、MariaDB (or MySQL for that matter)獲取數據的方法。Oracle數據庫可不愿意你這樣做,因此需要做一些必要的調整。其中一種方式就是使用觸發器,UDF, UPD-communication 和簡單的服務器,這是 從Oracle到MariaDB的同步復制方式系列文章第一部分。

[[195284]]

幾種從Oracle數據庫或其它如文本文件、MariaDB (or MySQL for that matter)獲取數據的方法。Oracle數據庫可不愿意你這樣做,因此需要做一些必要的調整。其中一種方式就是使用觸發器,UDF, UPD-communication 和簡單的服務器,這是 從Oracle到MariaDB的同步復制方式系列文章***部分。也就是說從Oracle導出數據到文本文件是Oracle所不愿意看到的。它希望你把數據保存在它里面,圍繞它開展工作,現在你可以使用Oracle dump工具。這已經很好了且能正常處理大多數Oracle的數據類型。

對于復制,如果不使用觸發器或其它機制,那么使用開源的東西可能是比較好的了,或者可以不使用說明特殊工具來做嗎?一種方式是在Oracle的前面放一個代理。這非常有用,但是需要花費太多時間來開發并且要熟悉Oracle的通訊協議,可我不愿意這樣做(我承認我很懶)。

因此現在我只能嘗試其他方式來直接從Oracle復制數據。在后面我將演示一個實際的例子來做此事,不需要太多代碼,但現在我先解釋它是如何工作的。更為困難是如果正確的得到Oracle中的數據,所以這一系列博客的***部分將更多的對Oracle進行相關說明,這是一個好理由(比如:得到可用的而不必自己實現) ,讓我們開始吧。

現在開始,Oracle中沒有 二進制日志(binlog) (也沒有修改日志)。Oracle有重做日志 ,InnoDB/XtraDB 也是使用的這種方式,它們都是基于同樣的目的 —在崩潰發生時能恢復數據庫。 由于重做日志要達成此目的,因此它記錄了比binlog更低層次日志。數據庫中任何修改事件都能夠從Oracle的重做日志中找到,包括很多Oracle的內部處理。Oracle在后臺做了很多東西,與MariaDB強烈依賴操作系統不同它會會更多使用自己的內部管理,比如文件空間管理等類似的東西。 當然這并不是說在這一方面Oracle比MariaDB更好,或與此相反,Oracle誕生的年代你不得不支持多種不同的操作系統,因此在在某些方面就需要設計得透明的(即設計得更抽象,高層次不必依賴操作系統實現)。同時Oracle誕生的年代多數磁盤大小僅為5MB,因此很多都是一些保守做法 (這暴露了我的年齡,是的,我的出生日期早于Mille Small主打歌曲 "My Boy Lollipop"。 與流行的看法相反,它不是Rod Stewart使用口琴獨奏的那首。 ,結束了今天的“無用的知識”課).

在我們進入詳細查看Oracle重做日志之前,我想先解釋一些東西。在Oracle中還有另外一個文件,它很小但是卻很重要,叫著控制文件。控制文件用于跟蹤記錄其它所有文件和關聯的數據庫設置。對于重做日志,有兩個用途。一個基礎方式是 非歸檔(NOARCHIVELOG)模式,意味著日志文件會被重用。這和InnoDB/XtraDB的日志文件使用方式相似,它目的也是提供一種手段來進行崩潰后恢復。想象一下,需要使用這些日志文件進行某一個時間點的恢復,前提是你保存了這些文件,比如:進行了物理備份且保存了這些文件。對于MariaDB,我們會使用binlog進行時間點的恢復。

使用重做日志的目的就是可以對Oracle進行時間點的恢復,我們不得不保存重做日志,在歸檔模式下Oracle有一個單獨的進程"archive"來做,也就是當日志寫滿切換日志時把日志保存在其它地方。所有這一切,當前的和歸檔的重置日志文件都被記錄在Oracle的控制文件中。

這些Oracle知識對于理解代碼如何工作是非常重要的。還有一個我需要簡要的討論一下,就是Oracle的ROWID。ROWID 是Oracle中表的數據行的唯一標識。ROWID實際上是一個物理地址。在某些情況下,當表屬于聚集表時相同的ROWID可用于兩個不同的表,但是對一個表來說,里面的ROWID是唯一標識了一行。 使用表的ROWID,可以使用偽列ROWID,它可以用在WHERE和SELECT語句中。

因此,現在我們要靈活運用上面這些知識。Oracle的重做日志包含了數據庫的變化,因此我們可以使用重做日志來達成MariaDB中binlog相同的目的,如:復制。為了做復制,我們首先需要能夠讀取重做日志,我們可以讀取重做日志文件,但卻相當復雜,如果你堅持這樣做,你可以閱讀 這個文檔 中的例子,但我認為這不是一個好主意。相反,我們應該使用Oracle的工具。對于我們感興趣的DML,我們需要復制處理表的INSERT, UPDATE和DELETE語句,然后在在事務的結束處提交。對于這些操作,我們希望重做日志中包含如下這些數據:

  • 操作類型
  • 表的唯一標識 (不是表名)
  • 列和值的變化
  • 行的ROWID
  • SCN (系統變更號).

現在我需要說一說SCN。SCN非常簡單;它是一個48位整型數標記了一個事務,每開始一個新事務它就向上增加。你可以獲取表中***更改的SCN,實際上是row所在塊的SCN(你可以跟蹤ROW的變化。有很多奇奇怪怪的選項來滿足用戶的需求。)。

在我寫完這篇博文之前,我想演示下怎么從重做日志文件獲取數據的代碼。在你詢問之前,oracle沒有重做日志單元,或類似這樣的工具。這不是MariaDB,這是Oracle數據庫。Oracle數據庫的工具本身幾乎不是工具,而是 Oracle PL/SQL包。在此例子中是日志分析,或者是一個類似DBMS_LOGMNR包。想要日志分析工作,我們需要在歸檔模式下運行數據庫。所以如果你新安裝了Oracle數據庫,請以特權用戶進行登錄:

  1. $ sqlplus / as sysdba 

然后運行以下命令:

  1. SQL> SHUTDOWN IMMEDIATE; 
  2. SQL> STARTUP MOUNT; 
  3. SQL> ALTER DATABASE ARCHIVELOG; 
  4. SQL> ALTER DATABASE OPEN

此外,為了從日志分析中獲得所有數據,我們必須在重做日志中加入"supplemental data"。這意味著我還沒有看其中的數據,但是如果你想看數據請相信我。在同個 SQL*Plus窗口,運行:

  1. SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; 

我們可以在此開始分析日志。這包含兩個步驟:***,開始分析日志本身,然后選擇一張表存儲分析日志。讓我們看下怎樣用SQL腳本開始分析日志。調用腳本startlog.sql:

  1. column min_scn new_value startscn 
  2. column current_scn new_value endscn 
  3. SELECT MIN(FIRST_CHANGE#) min_scn FROM v$log; 
  4. SELECT current_scn FROM v$database
  5. EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTSCN => &startscn, - 
  6.     ENDSCN => &endscn, - 
  7.     OPTIONS => DBMS_LOGMNR.COMMITTED_DATA_ONLY + - 
  8.     DBMS_LOGMNR.CONTINUOUS_MINE + - 
  9.     DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG); 
  10. SET ARRAYSIZE 1 

然后運行腳本,因為腳本里不含明顯的退出語句,所以腳本執行后還是會看到SQL*Plus的命令提示符。這和 MariaDB命令行工作方式是不同的。

  1. $ sqlplus / as sysdba @startlog.sql 

現在我們可以獲取一下日志數據,比方說我們有張表稱為T1,并且已經在T1上做了些改動,那我們可以用如下語句獲取相關記錄:

  1. SQL> SELECT sql_redo FROM v$logmnr_contents WHERE table_name = 'T1'  AND seg_owner = 'ANDERS' AND operation IN ('INSERT''UPDATE''DELETE'); 
  2. SQL_REDO 
  3. -------------------------------------------------------------------------------- 
  4. insert into "ANDERS"."T1"("C1","C2"values ('1','2'); 
  5. insert into "ANDERS"."T1"("C1","C2"values ('2','2'); 
  6. update "ANDERS"."T1" set "C2" = '3' where "C2" = '2' and ROWID = 'AAAE5KAAEAAAAFfAAA'
  7. update "ANDERS"."T1" set "C2" = '3' where "C2" = '2' and ROWID = 'AAAE5KAAEAAAAFfAAB'

這似乎不完整!但里面的有些內容可能是有意義的,對么?有關此系列的下篇博文我們會進行嘗試。這篇博文或多或少都是關于Oracle數據庫的,在下篇博文中將更多描述有關復制到MariaDB的內容,MariaDB也是我們想讓數據存儲的地方,不是么?

快樂的SQL編程吧!

責任編輯:武曉燕 來源: 可譯網
相關推薦

2010-04-28 11:19:04

Oracle高級復制

2024-11-28 09:23:09

2010-04-28 08:55:40

Oracle高級復制

2020-09-24 08:45:10

React架構源碼

2010-05-12 17:03:30

Oracle復制技術

2009-03-09 20:57:28

linuxrsync文件同步備份

2023-03-19 17:36:38

2023-03-22 11:41:56

2019-11-24 19:17:06

MySQL異步復制全同步復制

2010-04-19 09:06:24

Oracle的方法

2010-04-01 16:17:37

Oracle復制

2010-10-20 14:27:09

SQL Server同

2013-05-20 10:39:55

MariaDB

2017-04-07 13:30:54

2019-09-19 09:54:16

英方

2010-11-08 11:22:21

SQL Server同

2013-06-21 13:49:08

MariaDB

2021-07-15 09:00:00

MySQL數據庫數據分析

2009-10-26 17:36:13

Oracle管理員DBA

2012-04-11 16:41:20

英特爾云計算IDF2012
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久99精品久久久久婷婷 | 91久久视频 | 玖玖在线精品 | 欧美中国少妇xxx性高请视频 | 成人精品视频在线 | 亚洲精品黄色 | 欧美久久精品一级c片 | 久久精品国产久精国产 | 天天操天天干天天曰 | 欧美在线视频网 | 精品一区二区av | 欧美乱码精品一区二区三区 | 日韩av在线免费 | 欧美v片 | 3p视频在线观看 | 国产精品一区视频 | 日韩精品影院 | av不卡一区 | 祝你幸福电影在线观看 | 自拍 亚洲 欧美 老师 丝袜 | 精品久久久久久久久久久下田 | 91在线电影 | 亚洲欧美在线一区 | 精品国产乱码久久久久久蜜臀 | 日本中文字幕日韩精品免费 | 国产欧美精品 | 天天干天天爽 | 国产中文字幕av | 日本成人福利视频 | 91在线电影 | 日韩精品三区 | 久久1区 | 亚洲人在线观看视频 | 中文字幕在线电影观看 | 91九色porny首页最多播放 | 91精品国产一区二区 | 性福视频在线观看 | 久久一| 久久一区精品 | 成人免费大片黄在线播放 | 亚洲精品1区 |