作者:李迅鵬
前言: 公司同事訊鵬的小作,精煉而全面,。
基本上:一個(gè)是面向商業(yè)環(huán)境和用戶的付費(fèi)數(shù)據(jù)庫(kù),,講究可靠穩(wěn)定和事務(wù)ACID原則以及標(biāo)準(zhǔn)的SQL-92事務(wù)隔離級(jí)別,一個(gè)則是發(fā)硎于開源社區(qū),,伴隨web應(yīng)用的擴(kuò)展和深入而逐漸曲折發(fā)展的免費(fèi)數(shù)據(jù)庫(kù),,對(duì)事務(wù)和數(shù)據(jù)一致性沒(méi)有嚴(yán)格要求,同時(shí)也不支持海量大并發(fā)(通常情況下,,特殊的優(yōu)化情況下:在SAAC 2010上百度的劉斌同志已經(jīng)講過(guò),,12000的seqential讀QPS;6000的random讀,;以及4000的混合QPS,,還是不錯(cuò)的 所以,淘寶才在交易系統(tǒng)上使用海量oracle,同時(shí)也有大量的mysql的install base ,。,。。,。,。
正文:
近期突擊學(xué)習(xí)了mysql,應(yīng)楊毅的邀請(qǐng),,簡(jiǎn)單比較一下mysql和oracle的差別,,不當(dāng)之處歡迎大家指正。
一,、并發(fā)性
并發(fā)性是oltp數(shù)據(jù)庫(kù)最重要的特性,,但并發(fā)涉及到資源的獲取、共享與鎖定,。
mysql: mysql以表級(jí)鎖為主,,對(duì)資源鎖定的粒度很大,如果一個(gè)session對(duì)一個(gè)表加鎖時(shí)間過(guò)長(zhǎng),,會(huì)讓其他session無(wú)法更新此表中的數(shù)據(jù),。 雖然InnoDB引擎的表可以用行級(jí)鎖,但這個(gè)行級(jí)鎖的機(jī)制依賴于表的索引,,如果表沒(méi)有索引,,或者sql語(yǔ)句沒(méi)有使用索引,那么仍然使用表級(jí)鎖,。
oracle: oracle使用行級(jí)鎖,,對(duì)資源鎖定的粒度要小很多,,只是鎖定sql需要的資源,并且加鎖是在數(shù)據(jù)庫(kù)中的數(shù)據(jù)行上,,不依賴與索引,。所以oracle對(duì)并發(fā)性的支持要好很多。
二,、一致性 oracle: oracle支持serializable的隔離級(jí)別,,可以實(shí)現(xiàn)最高級(jí)別的讀一致性。每個(gè)session提交后其他session才能看到提交的更改,。oracle通過(guò)在undo表空間中構(gòu)造多版本數(shù)據(jù)塊來(lái)實(shí)現(xiàn)讀一致性, 每個(gè)session查詢時(shí),,如果對(duì)應(yīng)的數(shù)據(jù)塊發(fā)生變化,,oracle會(huì)在undo表空間中為這個(gè)session構(gòu)造它查詢時(shí)的舊的數(shù)據(jù)塊。
mysql: mysql沒(méi)有類似oracle的構(gòu)造多版本數(shù)據(jù)塊的機(jī)制,,只支持read commited的隔離級(jí)別,。一個(gè)session讀取數(shù)據(jù)時(shí),其他session不能更改數(shù)據(jù),,但可以在表最后插入數(shù)據(jù),。 session更新數(shù)據(jù)時(shí),要加上排它鎖,,其他session無(wú)法訪問(wèn)數(shù)據(jù),。
三、事務(wù) oracle很早就完全支持事務(wù),。
mysql在innodb存儲(chǔ)引擎的行級(jí)鎖的情況下才支持事務(wù),。
四、數(shù)據(jù)持久性 oracle 保證提交的數(shù)據(jù)均可恢復(fù),,因?yàn)閛racle把提交的sql操作線寫入了在線聯(lián)機(jī)日志文件中,,保持到了磁盤上, 如果出現(xiàn)數(shù)據(jù)庫(kù)或主機(jī)異常重啟,,重啟后oracle可以考聯(lián)機(jī)在線日志恢復(fù)客戶提交的數(shù)據(jù),。 mysql: 默認(rèn)提交sql語(yǔ)句,但如果更新過(guò)程中出現(xiàn)db或主機(jī)重啟的問(wèn)題,,也許會(huì)丟失數(shù)據(jù),。
五、提交方式 oracle默認(rèn)不自動(dòng)提交,,需要用戶手動(dòng)提交,。 mysql默認(rèn)是自動(dòng)提交。
六,、邏輯備份
oracle邏輯備份時(shí)不鎖定數(shù)據(jù),,且備份的數(shù)據(jù)是一致的。
mysql邏輯備份時(shí)要鎖定數(shù)據(jù),才能保證備份的數(shù)據(jù)是一致的,,影響業(yè)務(wù)正常的dml使用,。
七、熱備份 oracle有成熟的熱備工具rman,,熱備時(shí),,不影響用戶使用數(shù)據(jù)庫(kù)。即使備份的數(shù)據(jù)庫(kù)不一致,,也可以在恢復(fù)時(shí)通過(guò)歸檔日志和聯(lián)機(jī)重做日志進(jìn)行一致的回復(fù),。 mysql: myisam的引擎,用mysql自帶的mysqlhostcopy熱備時(shí),,需要給表加讀鎖,,影響dml操作。 innodb的引擎,,它會(huì)備份innodb的表和索引,,但是不會(huì)備份.frm文件。用ibbackup備份時(shí),,會(huì)有一個(gè)日志文件記錄備份期間的數(shù)據(jù)變化,,因此可以不用鎖表,不影響其他用戶使用數(shù)據(jù)庫(kù),。但此工具是收費(fèi)的,。 innobackup是結(jié)合ibbackup使用的一個(gè)腳本,他會(huì)協(xié)助對(duì).frm文件的備份,。
八,、sql語(yǔ)句的擴(kuò)展和靈活性 mysql對(duì)sql語(yǔ)句有很多非常實(shí)用而方便的擴(kuò)展,比如limit功能,,insert可以一次插入多行數(shù)據(jù),,select某些管理數(shù)據(jù)可以不加from。 oracle在這方面感覺(jué)更加穩(wěn)重傳統(tǒng)一些,。
九,、復(fù)制 oracle:既有推或拉式的傳統(tǒng)數(shù)據(jù)復(fù)制,也有dataguard的雙機(jī)或多機(jī)容災(zāi)機(jī)制,,主庫(kù)出現(xiàn)問(wèn)題是,,可以自動(dòng)切換備庫(kù)到主庫(kù),但配置管理較復(fù)雜,。 mysql:復(fù)制服務(wù)器配置簡(jiǎn)單,,但主庫(kù)出問(wèn)題時(shí),叢庫(kù)有可能丟失一定的數(shù)據(jù),。且需要手工切換叢庫(kù)到主庫(kù),。
十,、性能診斷 oracle有各種成熟的性能診斷調(diào)優(yōu)工具,能實(shí)現(xiàn)很多自動(dòng)分析,、診斷功能,。比如awr、addm,、sqltrace,、tkproof等 mysql的診斷調(diào)優(yōu)方法較少,主要有慢查詢?nèi)罩尽?/p>
十一,、權(quán)限與安全
mysql的用戶與主機(jī)有關(guān),,感覺(jué)沒(méi)有什么意義,另外更容易被仿冒主機(jī)及ip有可乘之機(jī),。 oracle的權(quán)限與安全概念比較傳統(tǒng),,中規(guī)中矩。
十二,、分區(qū)表和分區(qū)索引 oracle的分區(qū)表和分區(qū)索引功能很成熟,可以提高用戶訪問(wèn)db的體驗(yàn),。 mysql的分區(qū)表還不太成熟穩(wěn)定,。
十三、管理工具 oracle有多種成熟的命令行,、圖形界面,、web管理工具,還有很多第三方的管理工具,,管理極其方便高效,。 mysql管理工具較少,在linux下的管理工具的安裝有時(shí)要安裝額外的包(phpmyadmin, etc),,有一定復(fù)雜性,。
(本文內(nèi)容當(dāng)然不保證沒(méi)錯(cuò)和官方,有擴(kuò)展閱讀學(xué)習(xí)的同學(xué)可以移步mysql官網(wǎng)和mysql圣經(jīng) Oreilly《mysql cookbook》)
|
|