Oracle和MySQL的數據導入,差別為什麼這麼大

2020-12-09 楊建榮的資料庫筆記

這是學習筆記的第 2182篇文章

經常會有一些朋友諮詢我一些資料庫的問題,我注意到一個很有意思的現象,凡是數據導入的問題,基本上都是Oracle類的,MySQL類的問題腦子裡想了下竟然一次都沒有。

我禁不住開始思考這個未曾注意的問題:

為什麼Oracle導入數據會碰到很多的問題?

我們來梳理一下這個問題,分別從導出導入的方式來聊聊。

首先Oracle導出的文件格式就沒打算讓你拿來即用,導出文件叫做dump,換句話說可以理解這是一個二進位文件。當然實際上這個文件還是有很多的方式去抓取一些關鍵的信息,比如dump頭部的信息可以通過strings來解析得到,我甚至在多年前碰到一個比較棘手的問題,DBA直接vim修改dump文件,這個操作風險和成本是比較高的。

導出有哪些工具呢,主要有exp,expdp這兩個工具,expdp的導出性能相對來說可以更加充分利用系統資源,導出的效率更高。exp相對來說對於一些小表還是比較省事的,expdp的導出是基於服務端模式的,也就是你需要做一些資料庫層的配置才可以,這無疑增加了一些技術門檻。

不知道大家注意到一個問題沒有,那就是Oracle提供了SQL*Loader的工具導入,但是卻沒有一直提供一種簡單有效的導出csv的工具,在導出的時候算是各路英雄漢使盡各種技藝,結合數據字典,結合文本過濾來完成。

MySQL的導出方法相對比較簡單,設計思路很有意思,導出的文件就是可以直接打開,可以直接修改的SQL文件。這個設計在很多應用場景中簡直絕了,對於開發同學是非常友好的。

導出工具原生的有mysqldump,新版本的是mysqlpump(總體感覺性價比不是很高),當然還有一些補充的第三方工具,比如mydumper之類的。

所以導出這件事情,對於開發同學本身是有一個門檻的,而且在隔行如隔山的情況下,很多同學使用expdp導出的時候都一頭霧水。從安全性來看,這個二進位文件是原汁原味的,從靈活性來看,MySQL基於SQL文本的方式是比較便捷。

導出的部分其實不是最主要的,產生隔閡最大的是導入的部分,也是提出問題最多的。

MySQL有什麼數據導入工具,可以理解沒有,就是SQL文本,你想怎麼執行都可以。包括工具mysqldump,mysqlpump導出的文件都是如此,mydump有個配套的myloader算是一個小小的例外。

Oracle有什麼導入工具,有,而且是配套的,exp對應imp,expdp對應impdp

常見的數據導入問題有:

1)提示用戶創建失敗,導入失敗

2)提示表空間不存在,導入失敗

3)導入時如果創建的數據文件空間不足,導入失敗

4)導入時的用戶權限不足,導入失敗

所以我要導入一個dump文件,如果是exp導出的,解析成本還算低一些。

而如果是expdp導出的,通常很多開發同學都會一臉懵逼。

1)導入要輸入一個目錄,什麼是目錄,不是系統目錄嗎?

2)如果資料庫用戶已經存在,已經存在10張表,導入的時候默認會直接忽略這10章表,除非你手工刪除或者選擇額外的選項,比如replace或者truncate等。

3)表空間源端和目標端環境不一致,要想知道到底有哪些表空間不一致,解析dump文件實話說不是很方便,有一個高級選項是remap_tablespaces

4)數據導入之後,業務同學發現有些表還是訪問不了,不好,需要重新分配下權限。

通常來說,如果要導入一個dump,在Oracle側其實是一件很嚴肅的事情,我們需要創建目錄:

create directory dump_data as '/data/dump_data';

grant read,write on directory dump_data to xxxx;

配置表空間存儲,有哪些表空間,哪些表空間需要映射,在數據導入之前,這些信息其實是不好提取的。我通常採用的方式是做下預導入,就是找個乾淨的環境,然後默認選項導入,看看哪些表空間報錯,哪些用戶報錯,把這些信息提取出來,然後重新拼接一個導入命令。

在這個基礎上我去構建相關的表空間和數據文件的細節。

對於數據文件,我不大喜歡自動擴展的方式,而是喜歡預創建出來,然後加上自動擴展。

最後就是文件導入

impdp system/xxxx directory=dump_data dumpfile=test.DMP logfile=impdp_test.log remap_tablespace=TEST_DATA1:DATA,TEST_DATA2:DATA,TEST_INDEX1:IDX,TEST_INDEX2:IDX

對於Oracle DBA來說,這應該是再正常不過的事情了,而且有很多地方要做到細緻周到的多,但是這樣一個過程對於一個外行來說,成本就很高了。

總是有一種感覺,Oracle就像汽車裡面的寶馬一樣,操控性很好,提供了很多專業有效的管理方式。

而Oracle的角色通常都是百GB起,TB上下,這樣的數據量管理,就得適配出各種工具特點和特性。我覺得這些工具一直在追求的是更加高效和安全,可能從這個角度理解,Oracle的維護管理模式是需要專人來完成的。

MySQL的管理方式很適合網際網路這種變化快,而且數據量相對要小一些的環境。在易用性和學習門檻方便簡直是做到了極致,比如你要到處一些有特色的insert語句(比如按照主鍵排序,顯示完全列名等),都可以通過mysqldump很容易實現。

相關焦點

  • 將數據從MySQL遷移到Oracle的注意事項
    按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。 Oracle移植到mysql注意事項 客戶用的資料庫是mysql,而研發好的產品支持oracle,我們必須把資料庫環境從oracle移植到mysql。
  • mysql和oracle語法異同
    一、mysql裡的ifnull(a,b)對應oracle的nvl(a,b);二、日期比較:mysql: 可以用Date類型的日期進行比較時間比較。oracle:必須用to_date()函數和to_char()函數配合轉換成統一格式的日期字符串,然後進行比較。
  • 實戰 | MySQL數據備份、恢復
    數據恢復方式1.3.1. 資料庫或者數據表誤刪除情況這種情況幾乎不可見,生產環境中一般用戶是沒有drop權限的,不會對數據表和資料庫產生破壞。如果真實發生了,可以參考以下方式恢復:將 binlog 和上一次的備份結果拷貝到測試機器,將資料庫恢復到drop語句之前的一次事務狀態,並通過mysqldump將誤刪除的資料庫或者數據表導出,並導入生產環境的主庫。1.3.2.
  • 為什麼以阿里為代表的大廠都傾向去Oracle而使用MySQL?
    > 我們都知道mysql是開源的,也就是說完全免費,而oracle價格不菲,如果再考慮到搭載oracle的伺服器和存儲設備的話,那直接可以看見的成本差距確實很大,這是現實。就好比要給這輛在高速公路上的汽車換個引擎,車還不能熄火,這個事情本身的難度和風險就是很大的。技術成本: 主要有幾個方面,業務不能停,數據一致性,大量的業務可能面臨解耦,重構等等,這些做完整體架構可能都變天了,這個是需要大量開發人員費時費力還不一定就能百分百做好的事兒。
  • 如何向mysql導入數據
    一、導入.sql文件1.mysql命令導入數據基本語法:mysql -h伺服器地址 -u用戶名 -p 資料庫名< 要導入的資料庫文件路徑例:導入G:/mydb.sql2.source命令導入數據基本語法:source 資料庫文件路徑;例:導入G:/mydb2.sql二、導入
  • Centos下Oracle如何impdp和expdp導入導出和nmon數據採集
    Centos7.6下Oracle11g數據泵導入導出一、準備工作:1、第一步:在伺服器上創建真實的目錄[oracle@centos7 ~]$ suPassword:[root@centos7 oracle]# mkdir -p /db_backup/dpump_dir[root@centos7
  • MySQL數據導入Hive-Java
    SqoopSqoop並不在這篇文章的範圍內,拿出來說的原因是,公司數據研發部門是通過Sqoop將資料庫數據導入到Hive中,其原理是將資料庫數據導入到HDFS中臨時存儲, 然後在將文件導入到Hive中,最終刪掉臨時存儲的文件。
  • 如何將Oracle遷移至mysql?
    1)下載Navicat Premium版本,Navicat for mysql只支持連接mysql資料庫。如果需要支持oracle連接,還需要配置OCI,選擇工具—選項—OCI,選擇對應路徑下文件:配置完成後關閉Navicat再重新打開。
  • mysql資料庫導入和導出
    以下的文章主要介紹的是MySQL導入sql 文件,即MySQL資料庫導入導出sql 文件的實際操作步驟,我們主要是將其分成5大步驟對其進行講述。步驟如下:一.mysql的命令行模式的設置:首先,安裝mysql資料庫,若是手動安裝,請將路徑添加進環境變量,如下桌面->我的電腦->屬性->環境變量->新建->PATH=「;path\MySQL\bin;」其中path為mysql的安裝路徑。
  • 這是一篇長篇入門級資料庫講解:oracle資料庫數據導入導出步驟
    oracle資料庫數據導入導出步驟(入門)說明:1.資料庫數據導入導出方法有多種,可以通過exp/imp命令導入導出,也可以用第三方工具導出,如:plsql2.如果熟悉命令查詢磁碟空間是否足夠大 執行df -h或者df -H命令進行查詢,若可用空間不足則更換新的目標環境再繼續其他操作。[oracle@orac ~]$ df -h3.
  • Mysql百萬數據量級數據快速導入Redis
    前言隨著系統的運行,數據量變得越來越大,單純的將數據存儲在mysql中,已然不能滿足查詢要求了,此時我們引入Redis作為查詢的緩存層,將業務中的熱數據保存到Redis,擴展傳統關係型資料庫的服務能力,用戶通過應用直接從Redis中快速獲取常用數據,或者在交互式應用中使用Redis保存活躍用戶的會話,都可以極大地降低後端關係型資料庫的負載,提升用戶體驗。
  • sqoop的使用之導入到hive和mysql
    承接上一篇文檔《sqoop的使用之import導入到HDFS》mysql導入數據到hive中該如何做呢?>查看mysql元數據信息發現新建的庫表都沒有難道沒有使用mysql的元資料庫?於是重新初始化bin/schematool -dbType mysql –initSchema出現derby信息,還是舊信息我的配置沒有起作用?為什麼會有元資料庫呢?說明之前是對的,仔細核對了一遍,發現是配置文件被我改動的問題。
  • 使用Navicat將Oracle資料庫導入到Mysql中
    Cannot load OCI DLL問題,讓Navicat成功連接Oracle資料庫,將Oracle資料庫導入到一.下載和激活Navicat 省略二.查看Oracle版本需要根據Oracle的版本和位數,確定下載OCI接口文件,否則將不會生效(關鍵)!
  • IT運維基礎篇之oracle sqlldr數據批量導入,比plsqldev還簡單
    在oralce中導入數據的方式有很多,比如:PL/SQL文本導入器、對表forupdate之後直接複製粘貼等等,導入方式有很多,今天我們介紹另一種大批量數據導入方式:sqlldr,具體其用法可以上網查找,不詳細介紹,這裡我們通過一個例子演示給大家。
  • Oracle DBLINK MySQL實施步驟
    妹子鎮樓資料庫版本:Oracle11g+MySQL5.7所需文件: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
  • MySQL與oracle資料庫的一些區別
    【IT168 技術】1、 組函數用法規則  mysql中組函數在select語句中可以隨意使用,但在oracle中 如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者是group by子句中的列 否則報錯。
  • 為什麼銀行單位幾乎都用Oracle,而網際網路單位幾乎都不用Oracle?
    這種情況都是行業應用特性和資料庫自身對應特性決定的。Oracle是付費閉源大型資料庫。我們可以理解為大而全的資料庫,它可以支持很大的並發,很大的訪問量,目前是OLTP聯機事務處理過程最好的工具。而Mysql等是開源免費的中小型資料庫,還是有很大不同的。
  • MySQL導入導出
    導出、導入表中的記錄語句:(1)從DB中導出到文件mysql>select * into outfile '/home/outfilename.txt' fromdbtest;(2)從文件導入到DBmysql>load data infile '/home/outfilename.txt ' into table
  • 選擇pgsql還是mysql?
    引言:關係型資料庫的使用場景中,mysql這麼好用,為什麼要考慮pgsql?看完這篇文章也許你會有不同的想法。概述:mysql出現在1994年,現在所有權歸屬oracle,創始人現在又發布了新的免費開源資料庫MariaDB,現在開源關係型資料庫領域,mysql使用確實是最廣泛的,官方說許多世界上最大、發展最快的組織都在使用mysql。
  • Mysql複製數據一致性解決方案
    mysql資料庫現在這麼流行,其複製組件功不可沒,雖然其它類型的關係型資料庫也有複製功能,向oracle,db2但是其複製組件沒有Mysql資料庫的複製那麼靈活,簡便,而且mysql開源,開發著可以很容易的就開發出第三方mysql資料庫複製中間件,比較有名的像阿里的DTS。