官术网_书友最值得收藏!

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命令,以便服務器重新裝載授權信息。

主站蜘蛛池模板: 南华县| 汽车| 濮阳市| 密云县| 巴林左旗| 青田县| 株洲县| 成武县| 茌平县| 唐河县| 绩溪县| 邵阳县| 酒泉市| 汕尾市| 绍兴市| 昭苏县| 孟州市| 耿马| 米林县| 博客| 隆回县| 泊头市| 岫岩| 志丹县| 鹿邑县| 韩城市| 保靖县| 沁水县| 漯河市| 毕节市| 佛学| 诏安县| 石河子市| 合江县| 嘉义市| 博野县| 台州市| 永泰县| 德清县| 玉山县| 淮安市|