91嫩草国产线免费观看_欧美日韩中文字幕在线观看_精品精品国产高清a毛片_六月婷婷网 - 一级一级特黄女人精品毛片

MYSQL 轉 ORACLE CLOB類型

首頁 > 身份戶籍2022-04-20 13:49:45

mysql語句改成oracle的

DROP TABLE IF EXISTS `user`;rnCREATE TABLE `user` (rn `id` int(10) unsigned NOT NULL auto_increment,rn `uid` varchar(20) NOT NULL default x27x27,rn `password` varchar(30) NOT NULL default x27x27,rn `realName` varchar(20) NOT NULL default x27x27,rn `gender` tinyint(1) unsigned NOT NULL default x270x27,rn `email` varchar(50) NOT NULL default x27x27,rn `tel` varchar(15) default NULL,rn `question` varchar(50) default NULL,rn `validateCode` varchar(20) NOT NULL default x27x27,rn `answer` varchar(50) NOT NULL default x27x27,rn `loginNum` int(10) unsigned NOT NULL default x270x27,rn PRIMARY KEY (`id`),rn UNIQUE KEY `Index_uid` USING BTREE (`uid`)rn) ENGINE=InnoDB DEFAULT CHARSET=gbk;rn 要求能運行,一些條件盡量不要少,謝謝
--先運行
DECLARE
v_sql VARCHAR2(100);
v_num NUMBER;

BEGIN
SELECT ROWNUM INTO v_num FROM USER_OBJECTS
WHERE object_name = 'TEST_USERS'
AND object_type = 'TABLE'
;
IF v_num > 0 THEN
v_sql:='DROP TABLE TEST_USERS';
EXECUTE IMMEDIATE v_sql ;
END IF;

END;

--第二次運行
CREATE TABLE TEST_USERS
(
ID NUMBER not null,
U_ID VARCHAR2(20) default '' not null,
PASSWORD VARCHAR2(30) default '' not null,
REALNAME VARCHAR2(20) default '' not null,
GENDER NUMBER default 0 not null,
EMAIL VARCHAR2(50) default '' not null,
TEL VARCHAR2(15),
QUESTION VARCHAR2(50) not null,
VALIDATECODE VARCHAR2(20) default '',
ANSWER VARCHAR2(50) default '',
LOGINNUM NUMBER default 0,
USERID VARCHAR2(32) not null,
USERNAME VARCHAR2(50),
TRUENAME VARCHAR2(50)
)

--最后運行
alter table TEST_USERS
add constraint primary_key_a primary key (ID);
alter table TEST_USERS
add constraint unique_key_b unique (U_ID);

有問題再聯系
有很多應用項目, 剛起步的時候用MYSQL數據庫基本上能實現各種功能需求,隨著應用用戶的增多,數據量的增加,MYSQL漸漸地出現不堪重負的情況:連接很慢甚至宕機, 于是就有把數據從MYSQL遷到ORACLE的需求,應用程序也要相應做一些修改。本人總結出以下幾點注意事項,希望對大家有所幫助。

1.自動增長的數據類型處理
MYSQL有自動增長的數據類型,插入記錄時不用操作此字段,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。

CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的長度來定, 如果定義的自動增長的序列號 NUMBER(6) , 最大值為999999
INSERT 語句插入這個字段值為: 序列號的名稱.NEXTVAL

2. 單引號的處理
MYSQL里可以用雙引號包起字符串,ORACLE里只可以用單引號包起字符串。在插入和修改字符串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。

3. 翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;PHP里還可以用SEEK定位到結果集的位置。ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM字段標明它的位 置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
以下是經過分析后較好的兩種ORACLE翻頁SQL語句( ID是唯一關鍵字的字段名 ):
語句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;

語句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;

4. 長字符串的處理

長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字符串長度小于等于4000個單字節, 如果要插入更長的字符串, 請考慮字段用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的字段值和超出長 度字段值都應該提出警告,返回上次操作。

5. 日期字段的處理

MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時分秒信息,用當前數據庫的系統時間為SYSDATE, 精確到秒,或者用字符串轉換成日期型函數TO_DATE(‘2001-08-01','YYYY-MM-DD')年-月-日 24小時:分鐘:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型字段轉換成字符串函數TO_CHAR(‘2001-08-01','YYYY-MM-DD HH24:MI:SS')

日期字段的數學運算公式有很大的不同。MYSQL找到離當前時間7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;

MYSQL中插入當前時間的幾個函數是:NOW()函數以`'YYYY-MM-DD HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以 直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回當前的時間,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())

而oracle中當前時間是sysdate

6. 空字符的處理

MYSQL的非空字段也有空的內容,ORACLE里定義了非空字段就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。

7. 字符串的模糊比較

MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但這種方法不能使用索引, 速度不快,用字符串比較函數 instr(字段名,'字符串')>0 會得到更精確的查找結果。

8. 程序和函數里,操作數據庫的工作完成后請注意結果集和指針的釋放。
把字段和表名的``去掉就行了

oracle的blob數據怎么遷移到mysql

OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用于解決異構數據環境中數據復制的一個商業工具。相比于其它遷移工具OGG的優勢在于可以直接解析源端Oracle的redo log,因此能夠實現在不需要對原表結構做太多調整的前提下完成數據增量部分的遷移。本篇文章將重點介紹如何使用OGG實現Oracle到MySQL數據的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。


(一)OGG邏輯架構

參照上圖簡單給大家介紹下OGG邏輯架構,讓大家對OGG數據同步過程有個簡單了解,后面章節會詳細演示相關進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:

Manager進程:需要源端跟目標端同時運行,主要作用是監控管理其它進程,報告錯誤,分配及清理數據存儲空間,發布閾值報告等

Extract進程:運行在數據庫源端,主要用于捕獲數據的變化,負責全量、增量數據的抽取

Trails文件:臨時存放在磁盤上的數據文件

Data Pump進程:運行在數據庫源端,屬于Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數據直接發送到目標端的Trail文件,如果配置了Data Pump,Extract進程會將數據抽取到本地Trail文件,然后通過Data Pump進程發送到目標端,配置Data Pump進程的主要好處是即使源端到目標端發生網絡中斷,Extract進程依然不會終止

Collector進程:接收源端傳輸過來的數據變化,并寫入本地Trail文件中

Replicat進程:讀取Trail文件中記錄的數據變化,創建對應的DML語句并在目標端回放

二、遷移方案

(一)環境信息

OGG版本    OGG 12.2.0.2.2 For Oracle    OGG 12.2.0.2.2 For MySQL    

數據庫版本    Oracle 11.2.0.4    MySQL 5.7.21    

OGG_HOME    /home/oracle/ogg    /opt/ogg    

(二)表結構遷移

表結構遷移屬于難度不高但內容比較繁瑣的一步,我們在遷移表結構時使用了一個叫sqlines的開源工具,對于sqlines工具在MySQL端創建失敗及不符合預期的表結構再進行特殊處理,以此來提高表結構轉換的效率。

注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結構遷移完成后到數據庫切換前盡量不要再修改表結構。

(三)數據遷移

數據同步的操作均采用OGG工具進行,考慮數據全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取數據庫的redo log,待全量抽取結束后開啟增量數據回放,應用全量和增量這段期間產生的日志數據,OGG可基于參數配置進行重復數據處理,所以使用OGG時優先將增量進行配置并啟用。此外,為了避免本章節篇幅過長,OGG參數將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢任何你不理解的參數。

1.源端OGG配置

(1)Oracle數據庫配置

針對Oracle數據庫,OGG需要數據庫開啟歸檔模式及增加輔助補充日志、強制記錄日志等來保障OGG可抓取到完整的日志信息

查看當前環境是否滿足要求,輸出結果如下圖所示:

(2)Oracle數據庫OGG用戶創建

OGG需要有一個用戶有權限對數據庫的相關對象做操作,以下為涉及的權限,該示例將創建一個用戶名和密碼均為ogg的Oracle數據庫用戶并授予以下權限

(3)源端OGG 管理進程(MGR)配置

(4)源端OGG 表級補全日志(trandata)配置

表級補全日志需要在最小補全日志打開的情況下才起作用,之前只在數據庫級開啟了最小補全日志(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補全日志以獲得必要的信息。

(5)源端OGG 抽取進程(extract)配置

Extract進程運行在數據庫源端,負責從源端數據表或日志中捕獲數據。Extract進程利用其內在的checkpoint機制,周期性地檢查并記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機制是為了保證如果Extract進程終止或者操作系統宕機,我們重啟Extract進程后,GoldenGate能夠恢復到以前的狀態,從上一個斷點處繼續往下運行,而不會有任何數據損失。

(6)源端OGG 傳輸進程(pump)配置

pump進程運行在數據庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那么pump進程就會把trail文件以數據塊的形式通過TCP/IP協議發送到目標端,Pump進程本質上是Extract進程的一種特殊形式,如果不使用trail文件,那么Extract進程在抽取完數據后,直接投遞到目標端。

補充:pump進程啟動時需要與目標端的mgr進程進行連接,所以需要優先將目標端的mgr提前配置好,否則會報錯連接被拒絕,無法傳輸抽取的日志文件到目標端對應目錄下

(7)源端OGG 異構mapping文件(defgen)生成

該文件記錄了源庫需要復制的表的表結構定義信息,在源庫生成該文件后需要拷貝到目標庫的dirdef目錄,當目標庫的replica進程將傳輸過來的數據apply到目標庫時需要讀寫該文件,同構的數據庫不需要進行該操作。

2.目標端OGG配置

(1)目標端MySQL數據庫配置

確認MySQL端表結構已經存在

MySQL數據庫OGG用戶創建

mysql> create user 'ogg'@'%' identified by 'ogg';

mysql> grant all on *.* to 'ogg'@'%';

#### 提前創建好ogg存放checkpoint表的數據庫

mysql> create database ogg;

(2)目標端OGG 管理進程(MGR)配置

目標端的MGR進程和源端配置一樣,可直接將源端配置方式在目標端重復執行一次即可,該部分不在贅述

(3)目標端OGG 檢查點日志表(checkpoint)配置

checkpoint表用來保障一個事務執行完成后,在MySQL數據庫從有一張表記錄當前的日志回放點,與MySQL復制記錄binlog的GTID或position點類似。

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit param ./GLOBALS

checkpointtable ogg.ggs_checkpoint

ggsci> dblogin sourcedb [email protected]:3306 userid ogg

ggsci> add checkpointtable ogg.ggs_checkpoint

(4)目標端OGG 回放線程(replicat)配置

Replicat進程運行在目標端,是數據投遞的最后一站,負責讀取目標端Trail文件中的內容,并將解析其解析為DML語句,然后應用到目標數據庫中。

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 添加一個回放線程并與源端pump進程傳輸過來的trail文件關聯,并使用checkpoint表確保數據不丟失

ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

#### 增加/編輯回放進程配置文件

ggsci> edit params r_cms

replicat r_cms

targetdb [email protected]:3306,userid ogg,password ogg

sourcedefs /opt/ogg/dirdef/cms.def

discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024

HANDLECOLLISIONS

MAP cms.*,target cms.*;

注意:replicat進程只需配置完成,無需啟動,待全量抽取完成后再啟動。

至此源端環境配置完成 

待全量數據抽取完畢后啟動目標端回放進程即可完成數據準實時同步。

3.全量同步配置

全量數據同步為一次性操作,當OGG軟件部署完成及增量抽取進程配置并啟動后,可配置1個特殊的extract進程從表中抽取數據,將抽取的數據保存到目標端生成文件,目標端同時啟動一個單次運行的replicat回放進程將數據解析并回放至目標數據庫中。

(1)源端OGG 全量抽取進程(extract)配置

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 增加/編輯全量抽取進程配置文件

#### 其中RMTFILE指定抽取的數據直接傳送到遠端對應目錄下

#### 注意:RMTFILE參數指定的文件只支持2位字符,如果超過replicat則無法識別

ggsci> edit params ei_cms

SOURCEISTABLE

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID=cms)

SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)

USERID [email protected],PASSWORD ogg

RMTHOST 17X.1X.84.121,MGRPORT 7809

RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

TABLE cms.*;

#### 啟動并查看抽取進程正常

shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

## 查看日志是否正常進行全量抽取

shell> tail -f ./dirrpt/ei_cms.rpt

(2)目標端OGG 全量回放進程(replicat)配置

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit params ri_cms

SPECIALRUN

END RUNTIME

TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg

EXTFILE /opt/ogg/dirdat/ms

DISCARDFILE ./dirrpt/ri_cms.dsc,purge

MAP cms.*,TARGET cms.*;

#### 啟動并查看回放進程正常

shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

#### 查看日志是否正常進行全量回放

shell> tail -f ./dirrpt/ri_cms.rpt

三、數據校驗

數據校驗是數據遷移過程中必不可少的環節,本章節提供給幾個數據校驗的思路共大家參數,校驗方式可以由以下幾個角度去實現:

1.通過OGG日志查看全量、增量過程中discards記錄是否為0來判斷是否丟失數據;

2.通過對源端、目標端的表執行count判斷數據量是否一致;

3.編寫類似于pt-table-checksum校驗原理的程序,實現行級別一致性校驗,這種方式優缺點特別明顯,優點是能夠完全準確對數據內容進行校驗,缺點是需要遍歷每一行數據,校驗成本較高;

4.相對折中的數據校驗方式是通過業務角度,提前編寫好數十個返回結果較快的SQL,從業務角度抽樣校驗。

四、遷移問題處理

本章節將講述遷移過程中碰到的一些問題及相應的解決方式。

(一)MySQL限制

在Oracle到MySQL的表結構遷移過程中主要碰到以下兩個限制:

1. Oracle端的表結構因為最初設計不嚴謹,存在大量的列使用varchar(4000)數據類型,導致遷移到MySQL后超出行限制,表結構無法創建。由于MySQL本身數據結構的限制,一個16K的數據頁最少要存儲兩行數據,因此單行數據不能超過65,535 bytes,因此針對這種情況有兩種解決方式:

根據實際存儲數據的長度,對超長的varchar列進行收縮;

對于無法收縮的列轉換數據類型為text,但這在使用過程中可能導致一些性能問題;

2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字符集時,最多只能對varchar(768)的列創建索引;

3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導入時由于各表的插入順序不唯一,可能子表先插入數據而主表還未插入,導致報錯子表依賴的記錄不存在,因此建議數據遷移階段禁用主外鍵約束,待遷移結束后再打開。

mysql>set global foreign_key_checks=off;


(二)全量與增量銜接

HANDLECOLLISIONS參數是實現OGG全量數據與增量數據銜接的關鍵,其實現原理是在全量抽取前先開啟增量抽取進程,抓去全量應用期間產生的redo log,當全量應用完成后,開啟增量回放進程,應用全量期間的增量數據。使用該參數后增量回放DML語句時主要有以下場景及處理邏輯:

目標端不存在delete語句的記錄,忽略該問題并不記錄到discardfile

目標端丟失update記錄

- 更新的是主鍵值,update轉換成insert

- 更新的鍵值是非主鍵,忽略該問題并不記錄到discardfile

目標端重復insert已存在的主鍵值,這將被replicat進程轉換為UPDATE現有主鍵值的行

(三)OGG版本選擇

在OGG版本選擇上我們也根據用戶的場景多次更換了OGG版本,最初因為客戶的Oracle 數據庫版本為11.2.0.4,因此我們在選擇OGG版本時優先選擇使用了11版本,但是使用過程中發現,每次數據抽取生成的trail文件達到2G左右時,OGG報錯連接中斷,查看RMTFILE參數詳細說明了解到trail文件默認限制為2G,后來我們替換OGG版本為12.3,使用MAXFILES參數控制生成多個指定大小的trail文件,回放時Replicat進程也能自動輪轉讀取Trail文件,最終解決該問題。但是如果不幸Oracle環境使用了Linux 5版本的系統,那么你的OGG需要再降一個小版本,最高只能使用OGG 12.2。

(四)無主鍵表處理

在遷移過程中還碰到一個比較難搞的問題就是當前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因為很容易導致性能問題和主從延遲。同時在OGG遷移過程中表沒有主鍵也會產生一些隱患,比如對于沒有主鍵的表,OGG默認是將這個一行數據中所有的列拼湊起來作為唯一鍵,但實際還是可能存在重復數據導致數據同步異常,Oracle官方對此也提供了一個解決方案,通過對無主鍵表添加GUID列來作為行唯一標示,具體操作方式可以搜索MOS文檔ID 1271578.1進行查看。

(五)OGG安全規則

報錯信息

2019-03-08 06:15:22  ERROR   OGG-01201  Error reported by MGR : Access denied.


錯誤信息含義源端報錯表示為該抽取進程需要和目標端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標端mgr進行溝通,遠程將目標的replicat進行啟動,由于安全性現在而被拒絕連接。

報錯原因

在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要遠程啟動目標端的replicat進程,需要在mgr節點增加訪問控制參數允許遠程調用

解決辦法

在源端和目標端的mgr節點上分別增加訪問控制規則并重啟

## 表示該mgr節點允許(ALLOW)10.186網段(IPADDR)的所有類型程序(PROG *)進行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW


(六)數據抽取方式

報錯信息

2019-03-15 14:49:04  ERROR   OGG-01192  Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').


報錯原因

根據官方文檔說明,當前直接通過Oracle數據庫抽取數據寫到MySQL這種initial-load方式,不支持LOBs數據類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB字段,無法進行傳輸,并且該方式不支持超過4k的字段數據類型

解決方法

將抽取進程中的RMTTASK改為RMTFILE參數 官方建議將數據先抽取成文件,再基于文件數據解析進行初始化導入

可以在SQLServer下運行:
SELECT *
FROM msdb.dbo.MSdatatype_mappings
SELECT *
FROM msdb.dbo.sysdatatypemappings
第一個SQL語句是看SQL轉Oracle的類型對應
第二個表則更詳細得顯示了各個數據庫系統的類型對應。

oracle clob類型相當于mysql中的什么類型?

Oracle

CLOB  

Oracle 9i 及以前,最大4G字符數據  Oracle10g 最大4G*數據庫塊大小的字符數據  

MySQL

LONGTEXT

最大長度為4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允許的)長度取決

于客戶端/服務器協議中配置最大包大小和可用的內存。

LONGBLOB

最大長度為4,294,967,295或4GB(232–1)字節的BLOB列。LONGBLOB列的最大有效(允許的)長度取

決于客戶端/服務器協議中配置最大包大小和可用的內存。

Oracle

CLOB
Oracle 9i 及以前,最大4G字符數據 Oracle10g 最大4G*數據庫塊大小的字符數據

MySQL

LONGTEXT
最大長度為4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允許的)長度取決于客戶端/服務器協議中配置最大包大小和可用的內存。

LONGBLOB
最大長度為4,294,967,295或4GB(232–1)字節的BLOB列。LONGBLOB列的最大有效(允許的)長度取決于客戶端/服務器協議中配置最大包大小和可用的內存。

數據從MySQL遷移到Oracle 需要注意什么

1.自動增長的數據類型處理
MYSQL有自動增長的數據類型,插入記錄時不用操作此字段,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。
CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的長度來定, 如果定義的自動增長的序列號 NUMBER(6) , 最大值為999999
INSERT 語句插入這個字段值為: 序列號的名稱.NEXTVAL
2. 單引號的處理
MYSQL里可以用雙引號包起字符串,ORACLE里只可以用單引號包起字符串。在插入和修改字符串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。
3. 翻頁的SQL語句的處理
MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;PHP里還可以用SEEK定位到結果集的位置。ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM字段標明它的位 置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
以下是經過分析后較好的兩種ORACLE翻頁SQL語句( ID是唯一關鍵字的字段名 ):語句一:SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;語句二:SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 條件1 ORDER BY 條件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 條件3;
4. 長字符串的處理
長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字符串長度小于等于4000個單字節, 如果要插入更長的字符串, 請考慮字段用CLOB類型,方法借用ORACLE里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的字段值和超出長 度字段值都應該提出警告,返回上次操作。
5. 日期字段的處理
MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時分秒信息,用當前數據庫的系統時間為SYSDATE, 精確到秒,或者用字符串轉換成日期型函數TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小時:分鐘:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC.日期型字段轉換成字符串函數TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)
日期字段的數學運算公式有很大的不同。MYSQL找到離當前時間7天用 DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;
6. 空字符的處理
MYSQL的非空字段也有空的內容,ORACLE里定義了非空字段就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。
7. 字符串的模糊比較
MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但這種方法不能使用索引, 速度不快,用字符串比較函數 instr(字段名,'字符串')>0 會得到更精確的查找結果。
8. 程序和函數里,操作數據庫的工作完成后請注意結果集和指針的釋放。

OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用于解決異構數據環境中數據復制的一個商業工具。相比于其它遷移工具OGG的優勢在于可以直接解析源端Oracle的redo log,因此能夠實現在不需要對原表結構做太多調整的前提下完成數據增量部分的遷移。本篇文章將重點介紹如何使用OGG實現Oracle到MySQL數據的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。


(一)OGG邏輯架構

參照上圖簡單給大家介紹下OGG邏輯架構,讓大家對OGG數據同步過程有個簡單了解,后面章節會詳細演示相關進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:

Manager進程:需要源端跟目標端同時運行,主要作用是監控管理其它進程,報告錯誤,分配及清理數據存儲空間,發布閾值報告等

Extract進程:運行在數據庫源端,主要用于捕獲數據的變化,負責全量、增量數據的抽取

Trails文件:臨時存放在磁盤上的數據文件

Data Pump進程:運行在數據庫源端,屬于Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數據直接發送到目標端的Trail文件,如果配置了Data Pump,Extract進程會將數據抽取到本地Trail文件,然后通過Data Pump進程發送到目標端,配置Data Pump進程的主要好處是即使源端到目標端發生網絡中斷,Extract進程依然不會終止

Collector進程:接收源端傳輸過來的數據變化,并寫入本地Trail文件中

Replicat進程:讀取Trail文件中記錄的數據變化,創建對應的DML語句并在目標端回放

二、遷移方案

(一)環境信息

OGG版本    OGG 12.2.0.2.2 For Oracle    OGG 12.2.0.2.2 For MySQL    

數據庫版本    Oracle 11.2.0.4    MySQL 5.7.21    

OGG_HOME    /home/oracle/ogg    /opt/ogg    

(二)表結構遷移

表結構遷移屬于難度不高但內容比較繁瑣的一步,我們在遷移表結構時使用了一個叫sqlines的開源工具,對于sqlines工具在MySQL端創建失敗及不符合預期的表結構再進行特殊處理,以此來提高表結構轉換的效率。

注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結構遷移完成后到數據庫切換前盡量不要再修改表結構。

(三)數據遷移

數據同步的操作均采用OGG工具進行,考慮數據全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取數據庫的redo log,待全量抽取結束后開啟增量數據回放,應用全量和增量這段期間產生的日志數據,OGG可基于參數配置進行重復數據處理,所以使用OGG時優先將增量進行配置并啟用。此外,為了避免本章節篇幅過長,OGG參數將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢任何你不理解的參數。

1.源端OGG配置

(1)Oracle數據庫配置

針對Oracle數據庫,OGG需要數據庫開啟歸檔模式及增加輔助補充日志、強制記錄日志等來保障OGG可抓取到完整的日志信息

查看當前環境是否滿足要求,輸出結果如下圖所示:

(2)Oracle數據庫OGG用戶創建

OGG需要有一個用戶有權限對數據庫的相關對象做操作,以下為涉及的權限,該示例將創建一個用戶名和密碼均為ogg的Oracle數據庫用戶并授予以下權限

(3)源端OGG 管理進程(MGR)配置

(4)源端OGG 表級補全日志(trandata)配置

表級補全日志需要在最小補全日志打開的情況下才起作用,之前只在數據庫級開啟了最小補全日志(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補全日志以獲得必要的信息。

(5)源端OGG 抽取進程(extract)配置

Extract進程運行在數據庫源端,負責從源端數據表或日志中捕獲數據。Extract進程利用其內在的checkpoint機制,周期性地檢查并記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機制是為了保證如果Extract進程終止或者操作系統宕機,我們重啟Extract進程后,GoldenGate能夠恢復到以前的狀態,從上一個斷點處繼續往下運行,而不會有任何數據損失。

(6)源端OGG 傳輸進程(pump)配置

pump進程運行在數據庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那么pump進程就會把trail文件以數據塊的形式通過TCP/IP協議發送到目標端,Pump進程本質上是Extract進程的一種特殊形式,如果不使用trail文件,那么Extract進程在抽取完數據后,直接投遞到目標端。

補充:pump進程啟動時需要與目標端的mgr進程進行連接,所以需要優先將目標端的mgr提前配置好,否則會報錯連接被拒絕,無法傳輸抽取的日志文件到目標端對應目錄下

(7)源端OGG 異構mapping文件(defgen)生成

該文件記錄了源庫需要復制的表的表結構定義信息,在源庫生成該文件后需要拷貝到目標庫的dirdef目錄,當目標庫的replica進程將傳輸過來的數據apply到目標庫時需要讀寫該文件,同構的數據庫不需要進行該操作。

2.目標端OGG配置

(1)目標端MySQL數據庫配置

確認MySQL端表結構已經存在

MySQL數據庫OGG用戶創建

mysql> create user 'ogg'@'%' identified by 'ogg';

mysql> grant all on *.* to 'ogg'@'%';

#### 提前創建好ogg存放checkpoint表的數據庫

mysql> create database ogg;

(2)目標端OGG 管理進程(MGR)配置

目標端的MGR進程和源端配置一樣,可直接將源端配置方式在目標端重復執行一次即可,該部分不在贅述

(3)目標端OGG 檢查點日志表(checkpoint)配置

checkpoint表用來保障一個事務執行完成后,在MySQL數據庫從有一張表記錄當前的日志回放點,與MySQL復制記錄binlog的GTID或position點類似。

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit param ./GLOBALS

checkpointtable ogg.ggs_checkpoint

ggsci> dblogin sourcedb [email protected]:3306 userid ogg

ggsci> add checkpointtable ogg.ggs_checkpoint

(4)目標端OGG 回放線程(replicat)配置

Replicat進程運行在目標端,是數據投遞的最后一站,負責讀取目標端Trail文件中的內容,并將解析其解析為DML語句,然后應用到目標數據庫中。

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 添加一個回放線程并與源端pump進程傳輸過來的trail文件關聯,并使用checkpoint表確保數據不丟失

ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

#### 增加/編輯回放進程配置文件

ggsci> edit params r_cms

replicat r_cms

targetdb [email protected]:3306,userid ogg,password ogg

sourcedefs /opt/ogg/dirdef/cms.def

discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024

HANDLECOLLISIONS

MAP cms.*,target cms.*;

注意:replicat進程只需配置完成,無需啟動,待全量抽取完成后再啟動。

至此源端環境配置完成 

待全量數據抽取完畢后啟動目標端回放進程即可完成數據準實時同步。

3.全量同步配置

全量數據同步為一次性操作,當OGG軟件部署完成及增量抽取進程配置并啟動后,可配置1個特殊的extract進程從表中抽取數據,將抽取的數據保存到目標端生成文件,目標端同時啟動一個單次運行的replicat回放進程將數據解析并回放至目標數據庫中。

(1)源端OGG 全量抽取進程(extract)配置

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

#### 增加/編輯全量抽取進程配置文件

#### 其中RMTFILE指定抽取的數據直接傳送到遠端對應目錄下

#### 注意:RMTFILE參數指定的文件只支持2位字符,如果超過replicat則無法識別

ggsci> edit params ei_cms

SOURCEISTABLE

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

SETENV (ORACLE_SID=cms)

SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)

USERID [email protected],PASSWORD ogg

RMTHOST 17X.1X.84.121,MGRPORT 7809

RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

TABLE cms.*;

#### 啟動并查看抽取進程正常

shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

## 查看日志是否正常進行全量抽取

shell> tail -f ./dirrpt/ei_cms.rpt

(2)目標端OGG 全量回放進程(replicat)配置

#### 切換至ogg軟件目錄并執行ggsci進入命令行終端

shell> cd $OGG_HOME

shell> ggsci

ggsci> edit params ri_cms

SPECIALRUN

END RUNTIME

TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg

EXTFILE /opt/ogg/dirdat/ms

DISCARDFILE ./dirrpt/ri_cms.dsc,purge

MAP cms.*,TARGET cms.*;

#### 啟動并查看回放進程正常

shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

#### 查看日志是否正常進行全量回放

shell> tail -f ./dirrpt/ri_cms.rpt

三、數據校驗

數據校驗是數據遷移過程中必不可少的環節,本章節提供給幾個數據校驗的思路共大家參數,校驗方式可以由以下幾個角度去實現:

1.通過OGG日志查看全量、增量過程中discards記錄是否為0來判斷是否丟失數據;

2.通過對源端、目標端的表執行count判斷數據量是否一致;

3.編寫類似于pt-table-checksum校驗原理的程序,實現行級別一致性校驗,這種方式優缺點特別明顯,優點是能夠完全準確對數據內容進行校驗,缺點是需要遍歷每一行數據,校驗成本較高;

4.相對折中的數據校驗方式是通過業務角度,提前編寫好數十個返回結果較快的SQL,從業務角度抽樣校驗。

四、遷移問題處理

本章節將講述遷移過程中碰到的一些問題及相應的解決方式。

(一)MySQL限制

在Oracle到MySQL的表結構遷移過程中主要碰到以下兩個限制:

1. Oracle端的表結構因為最初設計不嚴謹,存在大量的列使用varchar(4000)數據類型,導致遷移到MySQL后超出行限制,表結構無法創建。由于MySQL本身數據結構的限制,一個16K的數據頁最少要存儲兩行數據,因此單行數據不能超過65,535 bytes,因此針對這種情況有兩種解決方式:

根據實際存儲數據的長度,對超長的varchar列進行收縮;

對于無法收縮的列轉換數據類型為text,但這在使用過程中可能導致一些性能問題;

2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字符集時,最多只能對varchar(768)的列創建索引;

3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導入時由于各表的插入順序不唯一,可能子表先插入數據而主表還未插入,導致報錯子表依賴的記錄不存在,因此建議數據遷移階段禁用主外鍵約束,待遷移結束后再打開。

mysql>set global foreign_key_checks=off;


(二)全量與增量銜接

HANDLECOLLISIONS參數是實現OGG全量數據與增量數據銜接的關鍵,其實現原理是在全量抽取前先開啟增量抽取進程,抓去全量應用期間產生的redo log,當全量應用完成后,開啟增量回放進程,應用全量期間的增量數據。使用該參數后增量回放DML語句時主要有以下場景及處理邏輯:

目標端不存在delete語句的記錄,忽略該問題并不記錄到discardfile

目標端丟失update記錄

- 更新的是主鍵值,update轉換成insert

- 更新的鍵值是非主鍵,忽略該問題并不記錄到discardfile

目標端重復insert已存在的主鍵值,這將被replicat進程轉換為UPDATE現有主鍵值的行

(三)OGG版本選擇

在OGG版本選擇上我們也根據用戶的場景多次更換了OGG版本,最初因為客戶的Oracle 數據庫版本為11.2.0.4,因此我們在選擇OGG版本時優先選擇使用了11版本,但是使用過程中發現,每次數據抽取生成的trail文件達到2G左右時,OGG報錯連接中斷,查看RMTFILE參數詳細說明了解到trail文件默認限制為2G,后來我們替換OGG版本為12.3,使用MAXFILES參數控制生成多個指定大小的trail文件,回放時Replicat進程也能自動輪轉讀取Trail文件,最終解決該問題。但是如果不幸Oracle環境使用了Linux 5版本的系統,那么你的OGG需要再降一個小版本,最高只能使用OGG 12.2。

(四)無主鍵表處理

在遷移過程中還碰到一個比較難搞的問題就是當前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因為很容易導致性能問題和主從延遲。同時在OGG遷移過程中表沒有主鍵也會產生一些隱患,比如對于沒有主鍵的表,OGG默認是將這個一行數據中所有的列拼湊起來作為唯一鍵,但實際還是可能存在重復數據導致數據同步異常,Oracle官方對此也提供了一個解決方案,通過對無主鍵表添加GUID列來作為行唯一標示,具體操作方式可以搜索MOS文檔ID 1271578.1進行查看。

(五)OGG安全規則

報錯信息

2019-03-08 06:15:22  ERROR   OGG-01201  Error reported by MGR : Access denied.


錯誤信息含義源端報錯表示為該抽取進程需要和目標端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標端mgr進行溝通,遠程將目標的replicat進行啟動,由于安全性現在而被拒絕連接。

報錯原因

在Oracle OGG 11版本后,增加了新特性安全性要求,如果需要遠程啟動目標端的replicat進程,需要在mgr節點增加訪問控制參數允許遠程調用

解決辦法

在源端和目標端的mgr節點上分別增加訪問控制規則并重啟

## 表示該mgr節點允許(ALLOW)10.186網段(IPADDR)的所有類型程序(PROG *)進行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW


(六)數據抽取方式

報錯信息

2019-03-15 14:49:04  ERROR   OGG-01192  Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').


報錯原因

根據官方文檔說明,當前直接通過Oracle數據庫抽取數據寫到MySQL這種initial-load方式,不支持LOBs數據類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB字段,無法進行傳輸,并且該方式不支持超過4k的字段數據類型

解決方法

將抽取進程中的RMTTASK改為RMTFILE參數 官方建議將數據先抽取成文件,再基于文件數據解析進行初始化導入

答:以下是MySQL遷到Oracle需要掌握的注意事項,希望對你有所幫助。 1.自動增長的數據類型處理 MYSQL有自動增長的數據類型,插入記錄時不用操作此字段,會自動獲得數據值。ORACLE沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。

相關推薦:

離婚如何立戶(離婚后戶口怎么分開單獨立戶)

農村刑事辯護(農村戶口法律援助免費嗎)

同村離婚戶口(雙方都是同村離婚遷戶口需要證明嗎)

離婚后的戶籍(離婚后的戶口怎么辦理)

離婚落戶申請(離婚了女方戶口怎么遷回娘家)