將數據從MySQL遷移到Oracle的注意事項

2021-01-12 TechWeb

將數據從MySQL遷移到Oracle的注意事項

1.自動增長的數據類型處理

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

CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記)

INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;

INSERT 語句插入這個欄位值為: 序列號的名稱.NEXTVAL

2. 單引號的處理

MYSQL裡可以用雙引號包起字符串,ORACLE裡只可以用單引號包起字符串。在插入和修改字符串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。當然你如果使用 Convert Mysql to Oracle工具就不用考慮這個問題

3.長字符串的處理

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

4. 翻頁的SQL語句的處理

MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數。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;

5. 日期欄位的處理

MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒信息,用當前資料庫的系統時間為SYSDATE, 精確到秒。

日期欄位的數學運算公式有很大的不同。

MYSQL找到離當前時間7天用:DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)

ORACLE找到離當前時間7天用:DATE_FIELD_NAME >SYSDATE - 7;

6. 字符串的模糊比較

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

7. 空字符的處理

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

Oracle移植到mysql注意事項

客戶用的資料庫是mysql,而研發好的產品支持oracle,我們必須把資料庫環境從oracle移植到mysql。在移植的過程中碰到了下面一些問題,如果我們在最初的設計、編碼過程中注意資料庫的移植性,這種情況下可以完全不需要作額外工作。

一、資料庫環境從oracle移植到mysql碰到的問題

1、 大小寫敏感的區別(如果伺服器OS是linux)

在oracle中一般情況下不區分大小寫。有時候我們在使用oracle不注意大小寫的問題,表名和欄位名不加雙引號是不區分大小寫的,像這樣:insert into tableName 和 insert into TABLENAME效果是一樣的,用工具導出創建/數據初始化腳本,得到的結果一般表名和欄位名轉化成了大寫。

但在MySQL中,所使用作業系統的大小寫敏感性決定了資料庫名和表名的大小寫敏感性。資料庫對應數據目錄中的目錄,資料庫中的每個表至少對應資料庫目錄中的一個文件(也可能是多個,取決於存儲引擎)。因此,使用資料庫或表實際上是操縱這些文件(夾),所以使用作業系統的大小寫敏感性決定了資料庫名和表名的大小寫敏感性。在以linux為內核的作業系統中是大小寫敏感的。

解決的辦法,是把mysql的資料庫名和oracle的大小寫保持一致,表名與應用程式中sql字符串中的表名保持一致,如果應用程式中欄位名用了雙引號,那請把sql中的欄位名大小寫與雙引號裡的字符保持一致。如果你的應用程式所引用的表名、欄位沒有統一大小寫,那麻煩就大了。

2、保留字的區別

像sql語言的函數名(如:inteval,show)等是保留字。Oracle中保留字是可以作為表名和欄位名,並且不影響使用,但mysql中保留字是不能作為表名和欄位名,如果使用會報語法錯誤。

解決辦法,把sql語句中的保留字用『`』符號引起來,這個符號位於鍵盤的tab鍵上面;如果是欄位名還有另外一種方法tablename.欄位名。像這樣:

insert into tablename (id, `interval`) value(…..

insert into tablename (id, tablename.inteval) value(…..

3、自動增長類型的區別

Oracle有sequence,mysql中沒有,但有auto_increment屬性。

解決辦法是把Oracle中sequence轉換成使用auto_increment屬性,某些情況可能還有一種辦法可以解決問題,新建一個獨立的表用來專門記錄自動增長型的數據。

4、數據類型的區別

在mysql中沒有像oracle中的varchar2、number,mysql有與之對應的varchar、numeric,當然在oracle中沒有mysql的time類型。

解決辦法是替換。

5、索引長度限制的區別

從MySQL 4.1.2開始,MyISAM和InnoDB表索引長度支持1000位元組,也就是說索引欄位的長度不能超過1000

字節,如果超過會報這樣的錯:

ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes。

如果是UTF-8編碼,相當於333個字符的長度(因為UTF8一個字符佔3個字節)。Oracle的索引長度限制比mysql要寬鬆得多。

解決的辦法就不必要多說了,要麼改索引的定義,要麼改欄位的定義長度。

二、為了資料庫的兼容性我們應該注意些什麼

資料庫的兼容性應該是資料庫設計應該重視的一個問題,因為有時候客戶存在已經在用的資料庫,並且不希望同時維護兩個資料庫,這樣的話兼容多種資料庫還能成為產品的一個賣點。

作到資料庫的兼容性關鍵是遵守標準用法。

1、 遵守標準用法,儘量不使用某種資料庫特有的用法

如msyql的『`』符號的用法,再比如,很多人有這種用法,在使用oracle開發的時候創建sequence,往表中插數據之前先SELECT seq.nextval FROM DUAL;,然後把查詢得到的值作為value插入表中,這種用法沒法適應沒有sequence的資料庫,每個資料庫都有自動增長型的用法,如果需要使用就應該完全地使用。

再舉個例子,不同的資料庫對分頁查詢作了擴展,postgresql有offset,limit,oracle就沒有。

2、 保留字

要求資料庫設計者儘量不使用保留字作表名和欄位名。也有很多人有這種用法,在表名和欄位名前加『_』,

像這樣:create table _tablename ( _id integer)。這樣永遠不會出現保留字引起的問題。

3、 避免資料庫大小寫敏感的問題

選擇資料庫表名和欄位名採用大寫還是小寫,並且在資料庫的設計和編碼過程中完全統一。

當使用 Convert Oracle to Mysql 工具時,請注意「名稱轉換為大寫」這個選項的控制

點讚 0

相關焦點

  • 如何將Oracle遷移至mysql?
    1)下載Navicat Premium版本,Navicat for mysql只支持連接mysql資料庫。如果需要支持oracle連接,還需要配置OCI,選擇工具—選項—OCI,選擇對應路徑下文件:配置完成後關閉Navicat再重新打開。
  • 為什麼以阿里為代表的大廠都傾向去Oracle而使用MySQL?
    但是這樣就簡單的判斷從oracle遷移到mysql就一定節約成本,我覺得這個事兒不好說。直接根據產品本身購買價格算成本的方式不能說錯,但是肯定不全面,還漏了不少東西要算。風險成本: 2008年的淘寶是一輛在高速公路上飛馳的汽車,業務發展是很快的,這個時候要遷移資料庫這樣的基礎架構,那必然是牽一髮而動全身的事情。
  • Oracle 資料庫遷移-百家號 - 百度經驗
    Oracle 資料庫遷移需求分析:資料庫所有文件(數據文件、日誌文件、臨時文件、控制文件)都存放在光纖存儲中,但是光纖存儲使用時間過長,超過3年,經常出現一些問題,而且光纖存儲需要廠家維護,維護方面不是很方便,需要將資料庫文件遷移到nas存儲中。
  • Oracle DBLINK MySQL實施步驟
    /usr/inlucde下,編譯好的庫文件安裝到了/usr/lib64下,與unixODBC相關的可執行文件安裝到了/usr/bin下,配置文件放到了/etc下。su - oracle12.13.配置監聽:(1)cd $ORACLE_HOME/network/admin(2) vi listener.ora添加如下信息:SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(SID_NAME=myodbc5)(ORACLE_HOME=/u01/app/oracle
  • 搭建簡單的Oracle到MySQL同步
    最近做了一次使用OGG工具將Oracle數據同步到MySQL的實驗,中間摻雜了mycat的簡單使用,在這裡將整個過程進行簡單的回顧和梳理。實驗環境:實驗目標:將A伺服器上的Oracle數據通過OGG同步到C庫上的MySQL庫。但由於C伺服器不能直接訪問,需要通過B伺服器的Mycat代理層訪問。所以最終實現需要在A和B上面搭建OGG同步,並在B上面把數據分發到C上。
  • 從mysql遷移到mssql需要哪些改變
    最近在項目中,初期使用的mysql作為資料庫,由於客戶方需要,將資料庫同時要兼容mssql,那麼在數據遷移過程中,有哪些是需要注意的呢?在此,介紹一款數據遷移工具:SQL Server Migration Assistant for MySQL ,該工具可以在微軟官方網站上下載到,官網版本對sqlserver版本的支持逐漸提高到2012及以上版本。下載該軟體後,先創建項目,然後連接已知的mysql和mssql即可逐步完成轉換遷移。那麼重點來了,在java項目中,sql語句應該做如何改變呢?
  • mysql和oracle語法異同
    一、mysql裡的ifnull(a,b)對應oracle的nvl(a,b);二、日期比較:mysql: 可以用Date類型的日期進行比較時間比較。oracle:必須用to_date()函數和to_char()函數配合轉換成統一格式的日期字符串,然後進行比較。
  • 實戰 | MySQL數據備份、恢復
    為了能更靈活的將數據恢復到指定的時間點,使用 binlog 作為增量備份。1.2.如果真實發生了,可以參考以下方式恢復:將 binlog 和上一次的備份結果拷貝到測試機器,將資料庫恢復到drop語句之前的一次事務狀態,並通過mysqldump將誤刪除的資料庫或者數據表導出,並導入生產環境的主庫。1.3.2.
  • 如何將數億Mysql數據無縫遷移到MongoDB?
    接下來,我們將對已有日誌類型老數據進行遷移。此次遷移S3老數據採用php定時任務腳本(多個)查詢數據,將數據投遞到RabbitMQ隊列中,LogStore系統從RabbitMQ隊列拉取消息進行消費存儲到
  • MySQL與oracle資料庫的一些區別
    【IT168 技術】1、 組函數用法規則  mysql中組函數在select語句中可以隨意使用,但在oracle中 如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者是group by子句中的列 否則報錯。
  • 我是如何在五分鐘內完成Centos7系統下遷移mysql的存儲路徑的
    工單場景centos7系統下使用rpm包安裝了一個mysql,隨著數據量大,發現系統的根目錄快慢了,於是需要遷移mysql的默認存儲路徑。工單分析1.在centos7中,使用systemctl命令對服務進行管理2.一般的mysql使用yum或者二進位安裝會有一個/etc/my.cnf,這個是數據配置文件
  • Mysql數據分片技術(一)——初識表分區
    對於億級別的數據,有些大的企業會選擇性能非常好的Oracle,Oracle屬於中大型資料庫,能在數據量大的情況下有好的數據處理性能。但是絕大部分小型企業是不會選擇昂貴的oracle的,況且幾乎所有的網際網路巨頭公司選擇的也都是免費開源的Mysql資料庫。
  • shardingsphere數據加密(數據脫敏)
    因為是全新系統,因而沒有存量數據清洗問題,所以實現相對簡單。已上線業務,之前一直將明文存儲在資料庫中。相關部門突然需要對已上線業務進行脫敏整改。這種場景一般需要處理三個問題:a) 歷史數據需要如何進行脫敏處理,即洗數。b) 如何能在不改動業務SQL和邏輯情況下,將新增數據進行脫敏處理,並存儲到資料庫;在使用時,再進行解密取出。
  • 如何將數據遷移到新的 Mac 上
    做了一期開箱視頻,很多小夥伴問怎麼把資料遷移至新的電腦上?所以這篇文章會簡單明了的說明一下遷移過程和注意事項。我們將用到的是 Mac 上自帶的app 遷移助理「遷移助理」能把所有的資料遷遷移前期準備系統版本必須是 OS X Lion 才能實現數據遷移儘可能的把舊電腦的 app 升級到最新版本為了避免中途關機,最好連接是電源新舊電腦連接有一個非常方便的方法
  • 卡脖子後,如何將Oracle資料庫數據遷移到國產資料庫
    來自海外提供商的技術、產品和運維服務都將終止,企業需要尋找替代產品;2. 替代產品與原產品存在異構問題,應用程式和業務數據如何安全快速地遷移過去;3. 資料庫數據遷移需要時間,但很多業務無法停止服務,如何實現異構資料庫的實時遷移。這是一件棘手的事情,以資料庫產品為例,目前大部分的金融機構或大型企業,用的幾乎是清一色的國外資料庫產品。
  • MyBatis怎麼連接到Mysql資料庫?
    大家知道常用埠號多少即可,第五段是你的資料庫名字,這個資料庫不是你windows,mysql.exe 這個mysql的名字,而是在你的資料庫裡面它分為很多database, 這裡寫database的名字,千萬不要寫mysql。oracle也一樣。
  • 在linux或unix伺服器上安裝、使用MySQL的注意事項
    在linux或unix伺服器上安裝、使用MySQL的注意事項,西崑雲需要的朋友可以參考下,使用windows伺服器的朋友可以到s.jb51.net下載相關軟體  一、怎麼樣取得最新版本的MySQL?
  • mysql學習詳記六&&關鍵字執行順序&mysql內置函數
    也就是說mysql內部有一定的解析順序,解析順序select優先於having。在這裡我個人認為是mysql可能沒有將這一點做規範。Oracle中having無法使用select語句內的別名。replace into在執行的時候,首先會根據指定的主鍵或者唯一索引判斷當前表中是否存在指定的主鍵或索引,如果主鍵或唯一索引已經存在,則先將對應的索引的數據刪除,然後在索引位置插入replace into中包含的數據。如果主鍵和唯一索引沒有存在,則直接在索引位置插入replace into中包含的數據。
  • Mysql複製數據一致性解決方案
    mysql資料庫現在這麼流行,其複製組件功不可沒,雖然其它類型的關係型資料庫也有複製功能,向oracle,db2但是其複製組件沒有Mysql資料庫的複製那麼靈活,簡便,而且mysql開源,開發著可以很容易的就開發出第三方mysql資料庫複製中間件,比較有名的像阿里的DTS。
  • 使用Navicat Premium工具快速遷移數據方法 適用於mysql及mssql...
    前言:在工作中,經常遇到將mysql或mssql資料庫從其他伺服器轉移到新伺服器,一般常規操作方法是在原來資料庫處導出,然後在新的資料庫中導入,這種方法也是可以的,但數據會下載到本地進行中專,下面介紹不用將數據下載到本地中專方法。