本文中,我們將向讀者詳細介紹如何升級動態InnoDB Plugin和升級靜態編譯的InnoDB Plugin,以及如何轉換由1.0.2以前版本建立的壓縮表。
一、概述
得益於MySQL的外掛程式式儲存引擎體繫結構,InnoDB Plugin的升級變得非常簡單,只需關閉MySQL,替換與平台有關的可執行檔,然後重啟伺服器即可。如果您希望升級並使用現有的資料庫,那麼必須關閉MySQL,否則的話,新的外掛程式在合并緩衝的插入資料或者清空已刪記錄的時候就會出錯。如果您的資料庫中沒有任何壓縮表,在慢關機後,使用最新的InnoDB Plugin處理起資料庫來就不會遇到問題了。
然而,如果您的資料庫中含有壓縮表的話,則不適合使用InnoDB Plugin 1.0.8。因為1.0.2版本的InnoDB Plugin引入了一個不相容的特性,所以一些壓縮表可能需要重建,具體轉換步驟見後文。
當然,我們可以使用mysqldump或其他的方法來重建我們的資料庫。如果我們的資料庫較小,或者各個表之間存在許多參考條件約束的話,那麼這是一種較好的方法。
需要注意的是,如果使用InnoDB Plugin 1.0.8訪問您的資料庫的話,就不要再試圖用1.0.2之前的外掛程式來訪問它們了。
二、升級動態InnoDB Plugin
在關閉包含InnoDB Plugin的MySQL伺服器之前,我們必須啟用慢關閉功能,設定如下所示:
- SET GLOBAL innodb_fast_shutdown=0;
在MySQL伺服器在其中尋找外掛程式的目錄內,將舊InnoDB Plugin (ha_innodb_plugin.so或ha_innodb_plugin.dll)的可執行檔重新命名,以便在需要的時候可以恢複它們。過後,我們也可以刪除這些檔案。外掛程式所在的目錄是由系統變數plugin_dir指定的。預設的位置通常是在basedir指定的目錄的lib/plugin子目錄中。
首先,我們需要根據自己的伺服器平台、作業系統和MySQL版本來下載合適的程式包。然後利用相應的工具進行解壓縮,在Linux和Unix系統下通常使用tar,在Windows系統中通常使用WinZip等工具軟體。將檔案ha_innodb_plugin.so或ha_innodb_plugin.dll複製至MySQL伺服器在其中尋找外掛程式的目錄下。
啟動MySQL伺服器。如果需要的話,可以按照後文介紹的方法來轉換壓縮表。
三、升級靜態編譯的InnoDB Plugin
就像動態安裝InnoDB Plugin一樣,我們需要慢關閉MySQL伺服器。如果您的MySQL是從原始碼編譯過來並用原始碼樹中的InnoDB Plugin替換了MySQL內建的InnoDB的話,那麼實際上您就會得到一個特殊版本的包含InnoDB Plugin的mysqld可執行檔。
如果您想升級到一個動態連結的InnoDB Plugin,則需要先卸載靜態編譯的InnoDB Plugin,然後再安裝作為共用庫發行的先行編譯InnoDB Plugin。
如果您想從一個靜態編譯的InnoDB Plugin版本升級到另一個靜態編譯的InnoDB Plugin版本的話,則必須先重新構建一個mysqld可執行檔,關閉伺服器,然後替換mysqld可執行檔,再啟動伺服器。
不管怎樣,如果資料庫含有壓縮表的話,務必按照後文介紹的方法轉換壓縮表。
四、轉換由1.0.2以前版本建立的壓縮表
InnoDB Plugin的1.0.2版本引入了一個不相容的壓縮表格式。這意味著,InnoDB Plugin早期版本建立的一些壓縮表,必須使用更大的KEY_BLOCK_SIZE重新構建之後才能夠繼續使用。
升級到InnoDB Plugin 1.0.2或更高版本的時候,如果必須保持現有的資料庫的話,則需要慢關閉正在運行早先版本InnoDB Plugin的MySQL。之後,確定出哪些壓縮表需要轉換,繼而使用新版本的InnoDB Plugin升級這些表。具體操作如下所示。
下面介紹如何處理由1.0.0版本或1.0.1版本的InnoDB Plugin所建立的壓縮表。由於新版本中引入了一個不相容的特性,所以新InnoDB Plugin從壓縮表清除已刪記錄或者合并緩衝的插入記錄時,會遇到問題。然而,也不是所有的壓縮表都需要重新構建。這裡我們將為讀者介紹如何識別和處理這些需要重建的壓縮表。
如果現有的資料庫包含有之前版本InnoDB Plugin所建立的表的話,必須使用慢關閉使用舊的InnoDB Plugin的MySQL伺服器。即,在關閉InnoDB Plugin舊執行個體之前,需要設定SET GLOBAL innodb_fast_shutdown=0。
在啟動升級了InnoDB Plugin的MySQL伺服器之後,必須檢查壓縮表是否已經轉換。首先,啟用InnoDB的strict模式進行更為細緻的錯誤檢查:SET SESSION innodb_strict_mode = 1。然後,為每一個壓縮表產生一個對應的新表。我們可以通過以下步驟完成:
1. 列出壓縮表:
- SELECT table_schema, table_name
- FROM information_schema.tables
- WHERE engine=’innodb’ AND row_format=’COMPRESSED’;
2. 對於每個表,顯示其表的定義:SHOW CREATE TABLE table_schema.table_name\G
3. 使用不同的表名執行CREATE TABLE語句。
4. 如果表建立成功,刪除建立的表,繼續處理下一個壓縮表。
5. 如果表建立失敗,則嘗試用更大的KEY_BLOCK_SIZE,直到成功為止。然後刪除新創的表,使用剛才成功執行CREATE TABLE的KEY_BLOCK_SIZE對原始表執行ALTER TABLE。
如果某些特殊的表不允許增加KEY_BLOCK_SIZE,則可以用較短的列索引長度來重建表。這是因為用於索引的列首碼會佔用B樹結點中的大量空間。較短的首碼減少了索引的精選,但是索引記錄會更短,以便它們適於頁面大小。較短的首碼還意味著更多的索引項目適於B樹結點,從而提高了效率。
如果各個表之間存在參考條件約束的話,上述過程將會更加複雜,所以更好的選擇是聯合使用舊的InnoDB Plugin和mysqldump,然後用InnoDB Plugin 1.0.2把資料載入新的資料庫中。
五、小結
本文中,我們向讀者詳細介紹了如何升級動態InnoDB Plugin和升級靜態編譯的InnoDB Plugin,以及如何轉換由1.0.2以前版本建立的壓縮表。