另一種方法是使用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()轉換成如同剛才描述的非二進制字符集。
這有可能導致使用AUTOCOMMIT=1和 LOCK TABLES的應用程序死鎖。如果你的應用程序在升級之後遇到死鎖的情況,你可能需要添加innodb_table_locks=0到你的my.cnf文件。
C API 改變:
• 因為MySQL 5.0服務器有對小數類型的數據有一種新的執行功能,如果該服務器被一些仍由MySQL4.1版本的客戶程序庫鏈接而成的老版本客戶程序所使用,就會出現一個問題,如果一個客戶使用二進制客戶機程序/服務器協議來執行准備好的能產生數值結果的聲明,就會出現錯誤提示:錯誤發生的原因是4.1版本客戶程序庫並不支持在5.0版本中增加的新MYSQL_TYPE_NEWDECIMAL類型。而服務器這端,卻沒有屏蔽這種新的小數數據類型的途徑。你可以通過和來自MySQL 5.0的客戶端庫的應用程序進行重鏈接來避免這個問題。
• MYSQL結構中的再連接標志可以通過mysql_real_connect()設置為0。而只有那些在進行MySQL_real_connect()以後沒有明確的把標志設為0或1的客戶端程序才會發生變化。默認情況下自動重新連接是被認為是危險的(主要是由於表格鎖,臨時表格,用戶變量以及會話變量在重新連接後有可能被丟失)。