降級MySQL(參考MySQL官方文件)

DBA_每日記發表於2019-12-12

降級MySQL(參考MySQL官方文件)

介紹降級MySQL安裝的步驟。

降級比升級更不常見。降級通常是由於生產系統上發生相容性或效能問題而執行,並且在測試系統的初始升級驗證期間沒有發現。

與升級過程一樣,在生產系統上使用降級過程之前,請先在某些測試系統上執行並驗證它。


注意

在下面的討論中,必須使用具有管理許可權的MySQL帳戶執行的MySQL命令,在命令列中包含-u root以指定MySQL root使用者。需要root使用者密碼的命令還包括-p選項。

可以使用mysql命令列(connect as root)執行SQL語句以確保您擁有必要的許可權)。


一、開始之前

•通過備份保護資料。備份應該包括mysql資料庫,其中包含mysql系統表。


注意

以下各節中描述的降級過程假設正在使用由較新MySQL版本建立或修改的資料檔案進行降級。但是,如果升級後沒有修改資料,建議使用升級到新MySQL版本之前所做的備份來降級。


二、降級路徑

•只有在一般可用性(GA)版本之間才支援降級。

•使用邏輯降級方法支援從MySQL 5.7降級到5.6。

•不支援跳過版本的降級。例如,直接從MySQL 5.7降級到5.5。

•支援在釋出系列中降級。例如,支援從MySQL 5.7.z降級到5.7.y。還支援跳過釋出。例如,支援將MySQL 5.7.z降級為5.7.x。


三、降級注意

在從MySQL 5.7降級之前,請檢視本節中的資訊。有些專案可能需要在降級前採取行動。


1> 系統表更改

•在MySQL 5.7.13中,儲存user@host字串值的系統表列的長度增加了。在降級到以前的版本之前,請確保沒有超過以前77個字元長度限制的user@host值,並執行以下mysql系統表更改:

ALTER TABLE mysql.proc MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';

ALTER TABLE mysql.event MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';

ALTER TABLE mysql.tables_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT '';

ALTER TABLE mysql.procs_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT '';


•在MySQL 5.7.8中,MySQL使用者名稱的最大長度從16個字元增加到32個字元。在降級到以前的版本之前,請確保使用者名稱的長度不超過16個字元,並執行以下mysql系統表更改:

ALTER TABLE mysql.tables_priv MODIFY User char(16) NOT NULL default '';

ALTER TABLE mysql.columns_priv MODIFY User char(16) NOT NULL default '';

ALTER TABLE mysql.user MODIFY User char(16) NOT NULL default '';

ALTER TABLE mysql.db MODIFY User char(16) NOT NULL default '';

ALTER TABLE mysql.procs_priv MODIFY User char(16) binary DEFAULT '' NOT NULL;


•mysql 5.7.6中刪除了mysql.user系統表的Password列。所有憑據都儲存在“身份驗證字串”列中,包括以前儲存在“密碼”列中的憑據。要使mysql.user表與早期版本相容,請在降級之前執行以下更改:

ALTER TABLE mysql.user ADD Password char(41) character set latin1

collate latin1_bin NOT NULL default '' AFTER user;

UPDATE mysql.user SET password = authentication_string WHERE

LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';

UPDATE mysql.user SET authentication_string = '' WHERE

LENGTH(authentication_string) = 41 AND plugin = 'mysql_native_password';


•在MySQL 5.7.5中,幫助表和時區表從MyISAM更改為InnoDB。在降級到以前的版本之前,請通過執行以下語句將每個受影響的表更改回MyISAM:

ALTER TABLE mysql.help_category ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.help_keyword ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.help_relation ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.help_topic ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.time_zone ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.time_zone_leap_second ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.time_zone_name ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.time_zone_transition ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.time_zone_transition_type ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;


•在MySQL 5.7.6中,plugin和servers系統表從MyISAM更改為InnoDB。在降級到以前的版本之前,請通過執行以下語句將每個受影響的表更改回MyISAM:

ALTER TABLE mysql.plugin ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;

ALTER TABLE mysql.servers ENGINE='MyISAM' STATS_PERSISTENT=DEFAULT;


•mysql.user系統表中plugin列的定義在mysql 5.7中有所不同。在降級到5.6.23及更高版本的MySQL 5.6伺服器之前,請使用以下語句更改外掛列定義:

ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT 'mysql_native_password';


在降級到MySQL 5.6.22伺服器或更低版本之前,請使用以下語句更改外掛列定義:

ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin DEFAULT '';


•從MySQL 5.7.7開始,sys模式預設在資料目錄安裝期間安裝。在降級到以前的版本之前,建議您刪除sys架構:

DROP DATABASE sys;


如果要降級到包含sys架構的版本,mysql_upgrade將重新建立sys相容格式的架構。MySQL 5.6中不包含sys模式。


2> InnoDB變更

•從MySQL 5.7.5開始,FIL_PAGE_FLUSH_LSN欄位寫入每個InnoDB系統表空間檔案的第一頁和InnoDB undo表空間檔案,只寫入InnoDB系統表空間的第一個檔案(頁碼0:0)。

因此,如果您有一個多檔案系統表空間並決定要從MySQL 5.7降級到MySQL 5.6,在MySQL 5.6啟動時可能會遇到一條無效訊息,指出ibdata檔案中的日誌序列號x和y與ibu日誌檔案中的日誌序列號y不匹配。

如果遇到此訊息,請重新啟動MySQL 5.6。無效訊息不再出現。

•為了在崩潰恢復期間簡化InnoDB表空間,MySQL 5.7.5引入了新的重做日誌記錄型別。此增強更改重做日誌格式。從MySQL 5.7.5或更高版本執行in-place降級,使用innodb_fast_shutdown設定0或1執行完全關閉。

使用innodb_fast_shutdown=0緩慢關機是建議的in-place降級步驟。

•MySQL 5.7.8和5.7.9撤消日誌可能包含有關空間列的資訊不足(錯誤21508582)。在執行從MySQL 5.7.10或更高版本到MySQL 5.7.9或更早版本的in-place降級之前,使用innodb_fast_shutdown=0來清除撤消日誌,

執行一個緩慢的關閉。使用innodb_fast_shutdown=0緩慢關機是建議的in-place降級步驟。

•MySQL 5.7.8撤消日誌可能包含有關虛擬列和虛擬列索引的資訊不足(錯誤21869656)。在執行從MySQL 5.7.9或更高版本到MySQL 5.7.8或更早版本的in-place降級之前,使用innodb_fast_shutdown=0來清除撤消日誌,

執行一次慢速關閉。使用innodb_fast_shutdown=0緩慢關機是建議的in-place降級步驟。

•從MySQL 5.7.9開始,第一個重做日誌檔案(ib_logfile0)的重做日誌頭包含一個格式版本識別符號和一個文字字串,用於標識建立重做日誌檔案的MySQL版本。此增強更改重做日誌格式。

為了防止舊版本的MySQL在MySQL 5.7.9或更高版本中建立的重做日誌檔案上啟動,已更改重做日誌檢查點頁面的校驗和。因此,在執行就地降級之前,必須執行MySQL的慢速關閉(使用innodb_fast_shutdown=0),

並刪除重做日誌檔案(ib_logfile*檔案)。建議使用innodb_fast_shutdown=0緩慢關機並刪除重做日誌檔案,以執行in-place降級。


3> 記錄更改

•在MySQL 5.7.5及更高版本中,對將伺服器錯誤日誌傳送到syslog的支援與舊版本不同。如果使用syslog並降級到早於5.7.5的版本,則必須停止使用相關的mysqld系統變數,

而是使用相應的mysqld_safe命令選項。假設通過在選項檔案的[mysqld]組中設定這些系統變數來使用syslog:


要降級,請刪除這些設定並在[mysqld_safe]選項檔案組中新增選項設定:

降級後不能使用沒有相應mysqld_safe選項的syslog相關係統變數。


4> SQL更改

•觸發器可以具有觸發器事件(INSERT、UPDATE、DELETE)和操作時間(BEFORE、AFTER)的不同組合,但MySQL 5.7.2之前不能有多個觸發器具有相同的觸發器事件和操作時間。

MySQL 5.7.2解除了這個限制,允許使用多個觸發器。這一變化意味著降級。


•如果將支援多個觸發器的伺服器降級到不支援多個觸發器的舊版本,則降級會產生以下效果:對於每個具有觸發器的表,所有觸發器定義都保留在該表的.TRG檔案中。

但是,如果有多個觸發器具有相同的觸發器事件和操作時間,則伺服器在觸發器事件發生時僅執行其中一個觸發器。


•如果在降級之後新增或刪除了表的觸發器,伺服器將重寫表的.TRG檔案。重寫後的檔案在觸發器事件和動作時間的組合中只保留一個觸發器。

要避免這些問題,請在降級之前修改觸發器。對於每個觸發器事件和操作時間組合具有多個觸發器的表,請按如下所示將每個這樣的觸發器集轉換為單個觸發器:

1.對於每個觸發器,建立一個包含觸發器中所有程式碼的儲存過程。使用NEW和OLD訪問的值可以使用引數傳遞給例程。如果觸發器需要來自程式碼的單個結果值,則可以將程式碼放入儲存的函式中,並讓函式返回該值。

如果觸發器需要來自程式碼的多個結果值,則可以將程式碼放入儲存過程並使用OUT引數返回值。

2.刪除表的所有觸發器。

3.為呼叫剛建立的儲存例程的表建立一個新觸發器。此觸發器的效果與它替換的多個觸發器的效果相同。


四、在Unix/Linux上降級基於二進位制和包的安裝的MySQL

本節介紹如何在Unix/Linux上降級MySQL二進位制和基於包的安裝。描述了in-place和邏輯降級方法。


1> In-Place Downgrade

in-place降級涉及關閉新的MySQL版本,用舊的MySQL二進位制檔案或包替換舊的MySQL版本,並在現有的資料目錄上重新啟動舊的MySQL版本。

對於同一釋出系列內的GA釋出之間的降級,支援就地降級。MySQL APT、SLES和Yum儲存庫安裝不支援就地降級。


注意

對於某些Linux平臺,從RPM或Debian軟體包安裝MySQL包括用於管理MySQL伺服器啟動和關閉的systemd支援。在這些平臺上,未安裝mysqld_safe。

在這種情況下,請使用systemd來啟動和關閉伺服器,而不要使用以下說明中使用的方法。

執行in-place降級:


1.複習“開始前”中的資訊。

2.如果在InnoDB中使用XA事務,在降級之前執行XA RECOVER以檢查未提交的XA事務。如果返回結果,則通過發出XA commit或XA rollback語句來提交或回滾XA事務。

3.通過將innodb_fast_shutdown設定為0,將MySQL配置為執行慢速關閉。例如:

mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0" 

在緩慢關閉的情況下,InnoDB會在關閉之前執行完全清除和更改緩衝區合併,以確保資料檔案在不同版本之間的檔案格式差異時完全準備好。

4.關閉更新的MySQL伺服器。例如:

mysqladmin -u root -p shutdown

5.在緩慢關閉之後,從資料目錄中刪除InnoDB重做日誌檔案(ib_log file*檔案),以避免與重做日誌檔案格式更改相關的降級問題,這些更改可能在兩個版本之間發生。

rm ib_logfile*

6.通過將較新的二進位制檔案或包替換為較舊的二進位制檔案或包,將MySQL二進位制檔案或包降級。

7.使用舊的資料目錄啟動舊的(降級的)MySQL伺服器。例如:

mysqld_safe --user=mysql --datadir=/path/to/existing-datadir

8.執行mysql_升級。例如:

mysql_upgrade -u root -p

mysql_upgrade檢查所有資料庫中的所有表是否與當前版本的mysql不相容,如果發現問題,將嘗試修復這些表。

9.關閉並重新啟動MySQL伺服器,以確保對系統表所做的任何更改生效。例如:

mysqladmin -u root -p shutdown

mysqld_safe --user=mysql --datadir=/path/to/existing-datadir



2> 邏輯降級

邏輯降級包括使用MySQL dump轉儲新MySQL版本中的所有表,然後將轉儲檔案載入到舊MySQL版本中。

對於同一版本系列內的不同版本之間的降級以及降級到以前的版本級別,都支援邏輯降級。僅支援在一般可用性(GA)版本之間降級。


注意

對於某些Linux平臺,從RPM或Debian軟體包安裝MySQL包括用於管理MySQL伺服器啟動和關閉的systemd支援。在這些平臺上,未安裝mysqld_safe。在這種情況下,請使用systemd來啟動和關閉伺服器,


執行邏輯降級:


1.複習“開始前”中的資訊。

2.轉儲所有資料庫。例如:

mysqldump -u root -p

--add-drop-table --routines --events

--all-databases --force > data-for-downgrade.sql

3.關閉更新的MySQL伺服器。例如:

mysqladmin -u root -p shutdown

4. 要初始化MySQL 5.7例項,請使用mysqld和--initialize或--initialize-insecure選項。

mysqld --initialize --user=mysql

5.使用新的資料目錄啟動舊的MySQL伺服器。例如:

mysqld_safe --user=mysql --datadir=/path/to/new-datadir

6.將轉儲檔案載入到舊的MySQL伺服器中。例如:

mysql -u root -p --force < data-for-upgrade.sql

7.執行mysql_升級。例如:

mysql_upgrade -u root -p

mysql_upgrade檢查所有資料庫中的所有表是否與當前版本的mysql不相容,如果發現問題,將嘗試修復這些表。

8.關閉並重新啟動MySQL伺服器,以確保對系統表所做的任何更改生效。例如:

mysqladmin -u root -p shutdown

mysqld_safe --user=mysql --datadir=/path/to/new-datadir


五、降級故障排除

如果從一個版本系列降級到另一個版本系列,則表儲存格式中可能存在不相容。在這種情況下,使用mysqldump在降級之前轉儲表。

降級後,使用mysql或mysqlimport重新載入轉儲檔案以重新建立表。

降級時向下不相容表格式更改的典型症狀是無法開啟表。在這種情況下,使用以下步驟:

1.停止降級到的舊MySQL伺服器。

2.重新啟動要降級的新MySQL伺服器。

3.通過使用mysqldump建立轉儲檔案,轉儲舊伺服器無法訪問的任何表。

4.停止較新的MySQL伺服器並重新啟動較舊的伺服器。

5.將轉儲檔案重新載入到較舊的伺服器中。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69950231/viewspace-2668165/,如需轉載,請註明出處,否則將追究法律責任。

相關文章