提示:在安裝任何新版本的軟件之前,最好備份一下你的數據。盡管mysql已經最大限度的保證高質量服務,但當你使用軟件的測試發布版本時,你還是應該采取備份的方式來保護你的數據。大體來說,在從mysql從4.1升級到5.0時,你需要做得主要包括以下幾個步驟:
•這部分主要檢查稍後建立起的修改列表裡的表項,目的是為了查找其中是否存在會影響你的應用程序的表項。這裡具體要注意哪些標志著Incompatible change的選項;這些會造成與Mysql早期版本不匹配,並且應該在更新之前引起你的注意。
•閱讀MySQL 5.0的歷史進程,理解你在5.0中能夠使用的重要的新特征。可以參閱Section D.1, “Changes in release 5.0.x (Production)”
•如果你是在Windows下運行Mysql 服務器,請參閱Section 2.3.15, “Upgrading MySQL on Windows”部分。同時你也應該注意到Windows下的Mysql服務器中有兩個是重新命名的,具體可以參閱Section 2.3.9, “Selecting a MySQL Server type”
•MySQL 5.0增加了對於存儲信息的程序的支持。該項支持需要在你的mysql數據庫中的proc數據表。為了生成該文件,你應該運行mysql_fix_privilege_tables腳本,有關該腳本的描述,請參閱Section 2.10.3, “Upgrading the Grant Tables”。
•MySQL5.0添加了浏覽功能。該項支持需要在mysql數據庫中的user和db表格中添加額外的特殊權限列。為了生成這些列,你應該運行mysql_fix_privilege_tables腳本,具體的描述見Section 2.10.3, “Upgrading the Grant Tables”.
•如果你使用復制功能,請參閱Section 6.6, “Upgrading a Replication Setup”,該部分主要提供了升級你的復制設置的相關信息。
幾個可視化行為已經在MySQL 4.1和MySQL5.0之間被改變,目的是為了保證MySQL和標准SQL的兼容性。這些改變有可能影響你的應用程序。
下面的列項主要描述了有可能影響應用程序的變化,因此你應該在將MySQL更新到版本5.0之前特別注意這些列項。
幾個變化:
•不兼容變化:對於InnoDB和MyISAM表格的TEXT列中的末端空間的索引順序改變了。從版本5.0.3開始,TEXT索引被看作是末尾的填補空間部分(如同MySQL的數據類型中的char、VARCHAR和TEXT域)。如果你在文本列中有一個索引,那麼你應該在其上運行CHECK TABLE命令。如果該檢查報錯,則需重建索引:如果是一個InnoDB表格,則清除並重新裝載該表格,如果它是個MyISAM表格則運行OPTIMIZE TABLE 或者 REPAIR TABLE命令。
•不兼容變化:含有DECIMAL 列的MyISAM 和InnoDB表格將會在升級到MySQL 5.0.6後出現損壞。在更新之前,要先將這些表格采用mysqldump進行清除,同時在更新之後重新裝載它們。(當在MySQL5.0.6中生成的這些表格在較低版本如MySQL 5.0.3到 5.0.5中使用時,同樣的不匹配情況會發生)
•不兼容變化:對於MySQL 5.0.3,服務器默認不再加載用戶定義的函數除非它們除了主函數符號外至少還有一個輔助標記(例如,xxx_init或者xxx_deinit符號)。該行為可以被--allow-suspicious-udfs選項所忽略。可參閱Section 25.2.3.6, “User-Defined Function Security Precautions”.
•不兼容變化:在MySQL 5.0中更新日志將會被刪除掉。如果你事先把它激活的話,你實際上激活的是二進制日志。
•不兼容變化:對於ISAM存儲機制的支持已經被刪除掉。如果你有任何的ISAM表格,你應該在更新之前對其進行轉換。例如將一個ISAM表格轉化成使用MyISAM存儲機制,可使用以下的聲明實現:
ALTER TABLE tbl_name ENGINE = MyISAM;
你數據庫中的其他ISAM表格的處理與此相同。
•不兼容變化:在MySQL 5.0中,對於MyISAM表格的RAID選項的支持已被刪除。如果你有使用這些選項的表格,你應該在更新之前對其進行轉換。一種方法是采取mysqldump命令清除這些表格,編輯dump文件以刪除在CREATE TABLE聲明中RAID選項,同時重新加載dump文件。另一種方法是使用CREATE TABLE new_tbl ... SELECT raid_tbl聲明來制造一個新的RAID表格。然而,該聲明中的CREATE TABLE部分必須含有足夠的信息來重新生成列和索引的屬性,否則列和索引的屬性有可能丟失,而不會出現在新表格當中。可參閱Section 13.1.5, “CREATE TABLE Syntax”。
•在一個具體的數據庫中,對於RAID表格的.MYD文件存儲在數據庫目錄下,而該目錄是在名字含有兩個16進制位(即00至ff)數值的子目錄中的。在對所有使用RAID選項的表格進行轉換後,這些RAID-相關的子目錄可能依然存在但是是可以被刪除的。在證明他們確實是空的之後,可以手工將他們刪除。(如果它們非空的話,則說明有一些RAID表格尚未被轉換)。
•在MySQL 5.0.6中,存儲例程和觸發器的二進制日志已經發生了變化。這個變化主要涉及到安全,復制,數據恢復,有關這方面的討論請見Section 18.4, “Binary Logging of Stored Routines and Triggers”. 。
SQL 的變化:
•不兼容變化:在MySQL 5.0.10對於觸發器的命名空間已經改變。以前的版本中,每個表格中,觸發器的名字是唯一的。現在對於schema(數據庫)必須是唯一的。這種改變的潛在原因是DROP TRIGGER語法現在使用schema名字而不是表格名(schema在可忽略的情況下是被選擇的,即當前的schema將會被使用)。當從以前的版本MySQL 5更新到MySQL5.0.10或者更新的版本時,你必須刪除所有的觸發器並且重新生成他們,否則的話,在更新之後,DROP TRIGGER將不會起作用。為了實現這個目的,我們特別提供了以下參考步驟:
1 將MySQL版本升級至5.0.10以能夠訪問INFORMATION_SCHEMA.TRIGGERS表格中的觸發器信息(它應該對於5.0.10以前版本的觸發器同樣有效。)
2 使用下面的SELECT聲明來刪除所有的觸發器定義
SELECT CONCAT('CREATE TRIGGER ', t.TRIGGER_SCHEMA, '.', t.TRIGGER_NAME,' ', t.ACTION_TIMING, ' ', t.EVENT_MANIPULATION , ' ON ', t.EVENT_OBJECT_SCHEMA, '.', t.EVENT_OBJECT_TABLE' FOR EACH ROW ', t.ACTION_STATEMENT, '//' )
INTO OUTFILE '/tmp/triggers.sql'
FROM INFORMATION_SCHEMA.TRIGGERS AS t;
該聲明使用INTO OUTFILE,所以你必須擁有FILE權限。該文件將會被在服務器主機上生成;可以根據你的喜好,來選擇一個不同的文件名。為了絕對的安全,檢查triggers.sql文件中的觸發器定義,如果必要的話,對該文件進行一下備份。
1停止服務器同時通過刪除你數據庫目錄中所有的.TRG文件來刪除所有的觸發器。改變當前路徑到你數據庫的目錄下,同時輸入命令如下:
shell> rm */*.TRG
2啟動服務器,同時使用triggers.sql文件重新生成所有的觸發器。在本例子當中,命令如下:
1.mysql> delimiter // ; 2.mysql> source /tmp/triggers.sql // 3使用SHOW TRIGGERS聲明來檢查是否所有的觸發器成功生成。•不兼容變化:對於MySQL 5.0.15, CHAR()函數返回一個二進制字符串而不是一套連接字符集中的字符串。而一個可供選擇的USING charset語句句有可能被用來生成一個具體的字符集。同時,比256字符長的變量有可能被用來生成一個單一的字符集。這些改變有可能造成不匹配。
o CHAR(ORD('A')) = 'a' is no longer true: omysql> SELECT CHAR(ORD('A')) = 'a'; o+----------------------+ o| CHAR(ORD('A')) = 'a' | o+----------------------+ o| 0 | o+----------------------+為了進行比較,你可以通過增加一個USING語句或者對結果進行轉化在非二進制字符集中生成一個結果字符串。
mysql> SELEC CHAR(ORD('A') USING latin1) = 'a'; +-----------------------------------+ | CHAR(ORD('A') USING latin1) = 'a' | +-----------------------------------+ | 1 | +-----------------------------------+ mysql> SELECT CONVERT(CHAR(ORD('A')) USING latin1) = 'a'; +--------------------------------------------+ | CONVERT(CHAR(ORD('A')) USING latin1) = 'a' | +--------------------------------------------+ | 1 | +--------------------------------------------+oCREATE TABLE … SELECT CHAR(…)生成了VARBINARY列而不是VARCHAR列。為了生成VARCHAR列,使用USING 或者 CONVERT()來將CHAR()轉換成如同剛才描述的非二進制字符集。