1. 程式人生 > >Oracle和mysql的區別

Oracle和mysql的區別

oracle和myslq的區別

一、數據庫的主要類型

數據庫類型主要可分為:網狀數據庫、關系數據庫、樹狀數據庫、面向對象數據庫。在商業中最主要的是關系型數據庫,例如:Oracle、DB2、Sybase、My SQL Server、Informax、Redis、MySQL等。



Oracle和mysql的區別

Oralce是大型數據而mysql是中小型關系型數據庫。Oralce占市場的40%而mysql占市場的20%。



一、並發性

Oracle支持大並發量和訪問量,是oltp最好的工具

並發性是oltp數據庫的最重要的特性,但並發涉及到資源的獲取、共享與鎖定。

mysql安裝後占152M而orcale占3G多,在使用和操作的時候占用機器資源性能特別多。

mysql:以表級鎖為主,對資源鎖定的粒度很大,如果一個session對一個表加鎖時間過長,會讓其他session無法更新比表中的數據。雖然InnoDB引擎的表可以用行級鎖,但這個行級鎖的機制依賴於表的索引,如果表沒有索引,或者sql語句沒有使用索引,那麽仍然使用表級鎖。

Oracle:使用行級鎖,對資源鎖定的粒度小很多,知識鎖定sql需要的資源,並且加鎖實在數據庫中數據行上,不依賴索引,所以oracle對並發性的支持要好很多。


二、一致性

oracle:oracle支持serializable的隔離級別,可以實現最高級別的讀寫一致性,每個 session提交後其他session才能看到提交的更改。Oracle通過在undo表空間中構造版多本數據庫來實現讀寫一致性,每個session查詢時,如果對應的數據塊發生變化,oracle會在undo表空間中為欸這個session構造它查詢時的舊的數據塊。


mysql:mysql沒有類似oracle的構造多版本的數據塊的機制,支持read commietd的隔離級別。一個session讀取數據時,其他session不能更改數據,但可以在表最後插入數據。

session更新數據時,要加上排它鎖,其他session無法訪問數據。


三、事務

oracle:事務便是是使數據庫從一種狀態換成位另一種狀態,這不同於文件系統,它是數據所特用的。

它的特性主要分為四個

原子性:語句級原子性,過程級原子性,事務級原子性。

一致性:狀態一致,同一事務中不會有兩種狀態

隔離性:事務鍵是互相分離互不影響(也有可能有自治事物)

持久性:事務提交了,那麽狀態就是用過就的


分布式事務:在oralce中會在一個事務中控制多個數據庫來保證數據庫中的數據的完整性,主要通過dblink。


自治事務:是獨立於務的一個子事務,它的提交與回滾不影響主事務的操作。

自治事務提供了一種用PL/SQL控制事務的新方法,可以用於:

1、頂層匿名塊

2、本地,獨立或打包的函數和過程

3、對象類型的方法

4、數據庫觸發器


mysql:事務的實現就是基於數據的引擎,不同的儲存引擎對事務的支持程度不一樣。mysql中支持事務的存儲引擎有innoDB和NDB。innoDB是mysql默認的存儲引擎,默認的隔離界別是RR,並且在RR的隔離級別下更近一步,通過多版本並發控制,解決不可重復都的問題,加上間隙鎖(並發控制)解決 幻讀問題,因此innoDB的RR隔離界別其實實現了串行化級別的效果,而且保留了比較好的並發性能。

事務的隔離性是通過鎖實現,而事務的原子性、一致性和持久性則是通過事務的日誌實現。事務就是redo和undo


分布式事務:分布式事務的實現方式有很多,既可以采用innoDB提供的原生的事務支持,也可以采用消息隊列來實現分布式事務的最終一致性。

模型分三塊:應用程序,資源管理器,事物管理器


應用程序定義了事務的邊界,指定需要做哪些事務;

資源管理器提供了訪問事務的方法,通暢一個數據庫就是一個資源管理器;

事務管理器協調 參與了全局事務中的各個事務。


分布式事務采用了兩段式提交的方式,第以階段所有的事務節點開始準備,告訴事務管理器ready。第二階段事務管理器告訴每個節點是commit還是rollback。如果有一個節點失敗,就要全局的節點全部是rollback,從此保障事務的原子性。


原子性:一個事務的執行視為一個不可分割的最小單元,事務裏面的操作,要麽全部成功執行,要麽全部失敗回滾,不可以執行其中的一部分。


一致性:一個事務的執行 不應該破壞數據的完整性


隔離性:通常來說,事務之間的行為不應該互相影響,然而實際情況中,事務相互影響的程度收到了隔離級別的影響 。


持久性:事務提交後,需要將提交的事務持久化到磁盤,即使系統崩潰,提交的數據也不應該丟失。


事務的四種隔離級別:

1.READ UNCOMMITTED(未提交讀)。在RU的隔離級別下,事務A對數據做的修改,即使沒有提交,對於事務B來說也是可見的,這種問題叫臟讀。這是隔離程度較低的一種隔離級別,在實際運用中會引起很多問題,因此一般不常用。

2.READ COMMITTED(提交讀)。在RC的隔離級別下,不會出現臟讀的問題。事務A對數據做的修改,提交之後會對事務B可見,舉例,事務B開啟時讀到數據1,接下來事務A開啟,把這個數據改成2,提交,B再次讀取這個數據,會讀到最新的數據2。在RC的隔離級別下,會出現不可重復讀的問題。這個隔離級別是許多數據庫的默認隔離級別。

3.REPEATABLE READ(可重復讀)。在RR的隔離級別下,不會出現不可重復讀的問題。事務A對數據做的修改,提交之後,對於先於事務A開啟的事務是不可見的。舉例,事務B開啟時讀到數據1,接下來事務A開啟,把這個數據改成2,提交,B再次讀取這個數據,仍然只能讀到1。在RR的隔離級別下,會出現幻讀的問題。幻讀的意思是,當某個事務在讀取某個範圍內的值的時候,另外一個事務在這個範圍內插入了新記錄,那麽之前的事務再次讀取這個範圍的值,會讀取到新插入的數據。Mysql默認的隔離級別是RR,然而mysql的innoDB引擎間隙鎖成功解決了幻讀的問題。

4.SERIALIZABLE(可串行化)。可串行化是最高的隔離級別。這種隔離級別強制要求所有事物串行執行,在這種隔離級別下,讀取的每行數據都加鎖,會導致大量的鎖征用問題,性能最差。


mysql在innodb存儲的 引擎的行級鎖的情況才支持事務。


四、數據持久化

oracle

保證提交的數據均可恢復,因為oracle把提交的sql操作線寫入了在線聯機的日誌文件中,保持到了磁盤上。如果出現數據庫或主機異常重啟,重啟後oracle可以考聯機在線日誌恢復客戶提交的數據。


mysql

默認提交sql語句,但如果更新過程中出現db或主機重啟的問題也許會丟失數據。


五、提交方式

oracle默認不自動提交,需要用戶手動提交。

mysql默認是自動提交的。


六、邏輯備份

oracle邏輯備份時不鎖定數據,且備份的數據是一致的。

mysql邏輯備份時要鎖定數據,才能保證備份數據是一致的,影響業務正常的dml使用。


七、熱備份


oracle有成熟的熱備份工具rman,熱備時,不影響用戶使用數據庫,即使備份數據庫不一致,也可以恢復時通過歸檔日誌,和聯機重做體制進一致恢復。


mysql:myisam的引擎,用myslq自帶的myslqhostcopy熱備時i,需要給表加讀鎖,影響dml操作。


innodb的引擎,它會備份innodb的表和索引,但是不會備份,frm文件用ibbackup備份文件時,會有一個日誌文件記錄備份期間的數據變化,因此可以不用鎖表,不影響其他用戶使用數據庫,但此工具是收費的。

innobackup是結合ibbackup使用的一個腳本,他會協助對,frm文件的備份


八、sql語句的擴展性和靈活性

mysql對sql語句有很多非常實用的方便擴展,比如limit功能,insert可以一次插入多行數據,select某些數據管理可以不加from

oracle在這方面感覺更加穩重傳統一些。


九、復制

oracle:既有推或拉式的傳統數據的復制,也有datagurad的雙機或多 機容災機制,主庫出現問題是,可以自動切換備庫到主庫,但配置管理叫復雜。


mysql:復制服務器的配置簡單,但主庫問題時,從庫有可能丟失一定的數據,且需要手工切換到從數據庫


十、性能診斷

oracle有各種成熟的性能診斷調優工具,能實現很多自動的分析,診斷功能,比如awr,addm、sqltrace、tkproof等。

myslq的診斷調優方法較少,主要有慢查詢日誌。


十一、權限與安全


mysql的用戶與主機有關,沒有什麽意義,另外更容易被仿冒者主機及ip有可乘之機。


oracle的權限與安全概念比較傳統,中規中矩。


十二、分區表的分區索引


oracle的分區表和分區索引功能很成熟,可以提高用戶的訪問db的體驗。


mysql的分區表還不太成熟穩定。


十三、管理工具


oracle有很多成熟的命令行,圖形界面、web管理工具、還有很多第三方的管理工具、管理極其方便高效。


mysql管理工具較少 ,在linux下的管理工具的安裝有時要安裝 額外的包,有一定的復雜性。



本文出自 “淩宇的技術博客” 博客,謝絕轉載!

Oracle和mysql的區別