這是bbs.csdn.net上某網友的提問,起初覺得挺簡單,但最終也搞了3個小時才獲得完整答案。個人從中獲得不少知識,於是寫出來與各位分享。
BDB引擎介紹
Sleepycat Software給MySQL提供Berkeley DB事務性儲存引擎。這個儲存引擎典型被簡稱為BDB。對BDB儲存引擎的支援包括在MySQL源碼分發版裡,在MySQL-Max二進位分發版裡被啟用。
BDB表可能有一個更大的崩潰倖存機會,並且也具有對事務COMMIT和ROLLBACK操作的能力。MySQL源碼分發版和被補丁過可以與MySQL一起工作的BDB分發版一起提供。你不能使用一個未補丁過的BDB版本與MySQL一起工作。。
我們在MySQL AB上與Sleepycat緊密合作工作以保持MySQL/BDB介面的品質在高水平。(即使Berkeley DB其本身是非常能經受考驗和非常可靠的。MySQL介面仍然被認為是第三等品質的。我們將繼續改善和最佳化它)。
當它達到對所有涉及BDB表的問題的支援之時,我們答應負責協助我們的使用者定位問題並建立可重複產生的測試案例。任何這樣的測試案例被轉交給Sleepycat,它反過來協助我們找到並解決問題。因為這是一個二階段的操作,任何關於BDB表的問題我們可能要花比對其它儲存引擎稍微更長一點的時間來解決它。可是,我們期望這個過程沒有顯著的困難,因為Berkeley DB 代碼本身被用在MySQL之外許多的應用中。
要獲得關於Berkeley DB的一般資訊,請訪問Sleepycat網站,http://www.sleepycat.com/。
我的配置
在我的機器上安裝了Xampp套裝,最初是用來運行BugFree,配置MySQL 5.0.18。這個Xampp版本是ApacheFriends XAMPP (basic package) version 1.5.1,你可以到網上擷取更新的版本。
第1次嘗試使用
將mysqld註冊為服務並啟動,用mysql串連進入資料庫,然後在test庫下建立一個BDB的表。通常情況下建立會成功,但實際上該表未真正套用BDB引擎。
mysqld --install # 將mysqld安裝為服務
net start mysql # 啟動mysql服務
mysql -r root -p # 在命令列下登入mysql伺服器
use test # 使用mysql下的test資料庫
create table testbdb (id int) type=BDB; # 建立BDB表
在information_schema資料庫中查詢該表的引擎時,其結果為NULL。顯然這種情況下無法建立BDB表。
select table_name, engine from tables where table_schema = 'test';
第2次嘗試
依據上面的做法重來,不過將mysqld-max-nt註冊為服務。嗯,此時又可以建立BDB表了。難道只有mysqld-max和mysqld-max-nt才能支援BDB資料庫引擎嗎?
第3次嘗試
難道只有mysqld-max才能支援BDB資料庫引擎嗎?於是我查了下mysqld的協助(mysqld --verbose --help),發現mysqld用--bdb參數是可以支援BDB的。於是我將mysql/bin目錄下的5個伺服器程式全部列舉出來,分別以標準模式啟動。結果發現mysqld、mysqld-nt是不支援BDB的。
D:Xamppxamppmysqlbin>mysqld --bdb --standalone
070429 9:53:40 [Warning] this binary does not contain BDB storage engine
D:Xamppxamppmysqlbin>mysqld-nt --bdb --standalone
070429 9:58:01 [Warning] this binary does not contain BDB storage engine
而其他幾個伺服器程式則可以使用BDB資料庫引擎,而且不用配置my.ini指令碼。不過,這並不是說mysqld重新設定了my.ini指令碼(即在my.ini中的[mysqld]中增加bdb),然後註冊為服務後就能支援bdb,如果你真那麼做——服務將不能啟動,而且會給你返回一個1067的錯誤。
請注意上面的Warning資訊,即“此二進位版本不包括BDB引擎”,那麼你不管怎麼配mysqld和my.ini,都不能使用BDB引擎的。
小結
因此,Windows XP、MySQL 5.0.18的情況下伺服器程式mysqld和mysqld-nt是不支援BDB資料庫引擎的,因此若要支援應選擇mysqld-max或mysqld-max-nt為服務。此外,要查看當前資料庫支援哪些引擎,可以使用show engines命令。舉例如下:
mysql> show engines;
+------------+---------+----------------------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+----------------------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
| BerkeleyDB | NO | Supports transactions and page-level locking |
| BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | YES | Archive storage engine |
| CSV | NO | CSV storage engine |
| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables |
| FEDERATED | NO | Federated MySQL storage engine |
| MRG_MYISAM | YES | Collection of identical MyISAM tables |
| ISAM | NO | Obsolete storage engine |
+------------+---------+----------------------------------------------------------------+
後經搜尋發現BDB資料庫引擎已被Oracle收購,並將其納入自己嵌入式資料庫的產品線。而這明顯和mysql有衝突,故而mysql不再從底層支援BDB資料庫引擎,轉而使用外掛程式的形式。而此點,則可在《mysql 5.1參考手冊-中文版》裡查到,章節為<第16章:編寫自訂儲存引擎>。