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

本文源自:https://www.rongsoft.com/article/2020/03/121010382935/

介紹降級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.將轉儲文件重新加載到較舊的服務器中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章