- 精通MySQL 8(視頻教學版)
- 劉華貞
- 1855字
- 2019-11-22 18:46:04
1.7 MySQL的升級和降級
升級是常用的操作,可以修補版本出現的漏洞。進行升級操作時,比較穩妥的做法是,先在測試環境進行測試,確保過程順利,再到生產環境進行操作。
降級并不常用,使用降級通常是由于兼容性或性能問題。
1.7.1 升級MySQL
1. 升級方法
MySQL推薦兩種升級方式:就地升級和邏輯升級。就地升級需要關閉舊版本的MySQL,替換當前的二進制文件或包,然后在現有的數據目錄上重啟MySQL,并運行mysql_upgrade。邏輯升級需要使用備份或導出語句從舊版本的MySQL中導出SQL語句,然后安裝新版本,在新版本的基礎上執行導出的SQL語句。
提示
使用舊版本導出的SQL語句在新版本中可能會報錯,所以請預先使用checkForServerUpgrade腳本進行檢查,使邏輯升級能夠順利進行。
2. 升級路線
MySQL支持從5.7版本升級到8.0,僅限于正式發行版,即GA版。
MySQL支持逐級升級,不可跳級。例如,要想升級到MySQL 8,必須先升級到5.7版本,5.6版本無法直接升級到8版本。
一旦發行系列到達穩定版狀態,正式發行版之間可以直接進行升級。例如,MySQL 8.0.x可升級至8.0.y,也可升級至8.0.z。
MySQL 8.0.11是MySQL 8.0發行系列的第一個正式發行版本。
3. 升級前的準備
首先需要備份當前數據庫和日志文件。備份內容應包含mysql系統數據庫,涵蓋MySQL數據字典表和系統表。
MySQL 8包含一個全局數據字典。在之前的MySQL版本中,字典數據存儲在元數據文件和非事務的系統表中。將MySQL 5.7升級到8時,需將數據目錄從基于文件的結構升級到基于數據字典的結構。
升級前需檢查版本之間的兼容問題,重點檢查新特性、過時或廢棄特性以及一些影響應用的改變,在升級前后及時處理以確保應用正常運行。
4. 驗證MySQL 5.7升級到8前的先決條件
(1)確保沒有使用過時的數據類型、函數和單獨的frm文件的數據庫表、非本地分區的InnoDB引擎表以及沒有定義的觸發器。檢查命令如下:
mysqlcheck -u root -p --all-databases --check-upgrade
(2)確保已分區的數據庫表使用的存儲引擎都支持本地分區。檢查命令如下:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
上述語句中查詢出的數據庫表可通過兩種方式進行修正,將存儲引擎改為InnoDB或移除表的分區。命令如下:
#設置表的存儲引擎為InnoDB ALTER TABLE table_name ENGINE = INNODB; #移除表分區 ALTER TABLE tablename REMOVE PARTITIONING;
(3)確保MySQL 5.7版本中mysql系統數據庫中的表名與MySQL 8數據字典的表名不重復。檢查命令如下:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql' and LOWER(TABLE_NAME) IN ( 'catalogs', 'character_sets', 'collations', 'column_statistics', 'column_type_elements', 'columns', 'dd_properties', 'events', 'foreign_key_column_usage', 'foreign_keys', 'index_column_usage', 'index_partitions', 'index_stats', 'indexes', 'parameter_type_elements', 'parameters', 'resource_groups', 'routines', 'schemata', 'st_spatial_reference_systems', 'table_partition_values', 'table_partitions', 'table_stats', 'tables', 'tablespace_files', 'tablespaces', 'triggers', 'view_routine_usage', 'view_table_usage' );
(4)確保外鍵限制名稱均不超過64個字符。檢查命令如下:

(5)確保數據庫表或程序使用單獨的枚舉或設置列元素的長度不超過255個字符或1020個字節。
(6)確保本地的MySQL 5.7版本中未使用在MySQL 8中已不再提供支持的特性。
5. 就地升級
(1)參考第三條中升級前的準備,做好準備工作。
(2)關閉MySQL 5.7服務。
(3)替換二進制文件或安裝包。
(4)啟動MySQL 8服務,使用現有的數據目錄,參考命令如下:
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir
(5)MySQL 8.0服務啟動成功之后,運行如下命令:
mysql_upgrade -u root -p
這個命令可以檢查當前數據庫中所有不兼容的表。
(6)關閉并重啟服務,確保所有更改已生效。參考命令如下:
mysqladmin -u root -p shutdown mysqldsafe --user=mysql --datadir=/path/to/existing-datadir
6. 升級問題
(1)在MySQL 5.7中,frm表文件和InnoDB數據字典模式不匹配會導致升級失敗。
(2)如果出現mysqld服務無法啟動的情況,檢查是否存在舊的配置文件。
(3)如果升級后客戶端程序編譯報錯,檢查一下是否使用了舊的頭文件或庫文件。
(4)如果升級后自定義函數名稱與新版本的函數名稱重復,那么自定義函數將無法被使用,需要使用DROP FUNCTION命令移除函數后再使用CREATE FUNCTION命令重新創建不重名的函數。
1.7.2 降級MySQL
目前,無法從MySQL 8降級到MySQL 5.7。唯一可選的方案是,在MySQL 5.7升級到8之前存儲備份數據。所以,升級前務必對數據進行備份。
1.7.3 重建或修復表或索引
由于MySQL處理數據類型和字符集方式的改變,以及使用CHECK TABLE、mysqlcheck和mysql_upgrade命令時提示必須要修復和升級表,這就需要重建或修復表或索引。
1. 轉儲或重載表方法
如果因為不同版本的MySQL在二進制(就地)升級或降級后無法處理數據庫表而重建,就必須使用dump-and-reload方法。升級或降級之前,先轉儲數據庫表,然后在升級或降級完成之后重載這些表。
如果只使用dump-and-reload方法重建索引,可在升級或降級之后再進行轉儲。
CHECK TABLE操作提示需要升級表而進行InnoDB表重建,需要使用mysqldump命令建立轉儲文件,并使用mysql命令重載該文件,可參考如下命令:
mysqldump dbname tablename > dump.sql mysql dbname < dump.sql
如果要重建數據庫中的所有表,參考命令如下:
mysqldump db_name > dump.sql mysql db_name < dump.sql
如果要重建所有數據庫中的所有表,參考命令如下:
mysqldump --all-databases > dump.sql mysql < dump.sql
2. 更改表方法
使用ALTER TABLE語句將表設定為其已擁有的存儲引擎。例如,某個表的存儲引擎為InnoDB,可使用如下命令:
ALTER TABLE tablename ENGINE = InnoDB;
如果更改前不確定表的存儲引擎,就應先使用SHOW CREATE TABLE語句查看。
3. 修復表方法
REPAIR TABLE方法只適用于MyISAM、ARCHIVE和CSV表。
如果表檢查操作提示存在腐敗或需要升級,此時可使用REPAIR TABLE語句,例如:
REPAIR TABLE tablename;
mysqlcheck --repair為修復表提供更方便的方法,可以添加--databases或--all-databases選項分別修復特定數據庫或所有數據庫中的所有表,參考命令如下:
mysqlcheck --repair --databases db_name ... mysqlcheck --repair --all-databases
1.7.4 將MySQL數據庫復制到另一臺機器
如果需要在不同機器之間傳遞數據庫,要使用mysqldump生成包含SQL語句的文件,然后將該文件傳輸到目標機器上,并使用MySQL客戶端導入該文件。
復制數據庫到另一臺機器最便捷的方法是在源數據庫機器上運行如下命令:
mysqladmin -h 'other_hostname' create db_name mysqldump db_name | mysql -h 'other_hostname' db_name
其中,other_hostname代表目標數據庫的IP地址或域名。
如果在目標機器上獲取遠程的數據庫并復制過來,可使用如下命令:
mysqladmin create db_name mysqldump -h 'other_hostname' --compress db_name | mysql db_name
也可以通過命令將源數據庫存儲到壓縮文件中,然后將壓縮文件傳輸到目標機器上,在目標機器上運行命令將數據解壓到數據庫中,參考命令如下:
mysqldump --quick dbname | gzip > dbname.gz mysqladmin create db_name gunzip < db_name.gz | mysql db_name
另外,也可以通過mysqldump和mysqlimport命令來傳輸數據庫。這種方式適合大數據量傳輸。首先在源數據庫機器上創建文件目錄,用以存放數據庫文件,然后將這些文件傳輸到目標機器上,并在目標機器上裝載這些文件,命令如下:
#源數據庫機器執行命令 mkdir DUMPDIR mysqldump --tab=DUMPDIR db_name #目標機器執行命令 mysqladmin create db_name # create database cat DUMPDIR/*.sql | mysql db_name # create tables in database mysqlimport db_name DUMPDIR/*.txt # load data into tables
提示
不要忘記復制MySQL系統數據庫,并且在復制完成后執行mysqladmin flush-privileges命令,以便服務器重新裝載授權信息。
- HTML5+CSS3+JavaScript從入門到精通:上冊(微課精編版·第2版)
- iOS面試一戰到底
- 嵌入式軟件系統測試:基于形式化方法的自動化測試解決方案
- 數據結構和算法基礎(Java語言實現)
- Amazon S3 Cookbook
- Mastering macOS Programming
- The DevOps 2.4 Toolkit
- concrete5 Cookbook
- Learn React with TypeScript 3
- Apache Mahout Clustering Designs
- 小程序,巧應用:微信小程序開發實戰(第2版)
- 零基礎學HTML+CSS
- Learning C++ by Creating Games with UE4
- Microsoft HoloLens By Example
- Learning Cocos2d-JS Game Development