升級二進制包安裝的MySQL
In-Place Upgrade(替代升級)
替代升級涉及到shutdown down舊版本的MySQL,用新版本的包替代舊版本的二進制包,用存在的數據文件目錄重啟MySQL,升級剩余需要升級的部分。
1.查看章節 ‘Before You Begin’
2.通過 ‘預先檢查環節’,確保升級准備已完成,否則升級過程會失敗
預先准備:
1)以下問題必須沒有出現 ·必須確保沒有表用到廢棄的數據類型或函數,如有使用upgrade them using REPAIR TABLE ·必須沒有單獨的.frm文件,跟.ibd文件是成對存在 ·觸發器必須是正常的 為檢查這些問題,可以執行這個命令: 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%'; 任何由上邊查詢出來的表,可以通過命令更改存儲引擎 ALTER TABLE table_name ENGINE = INNODB; 讓分區表不分區,通過命令: ALTER TABLE table_name REMOVE PARTITIONING; 3)保留字的問題 語句中使用到的保留字要用backtick[反引號]標識,才可用 4)確保在現有的mysql系統庫沒有8.0要用到的表名相同的表,如有要rename表名或刪除 查詢命令: SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql' and LOWER(TABLE_NAME) IN ( 'catalogs', 'character_sets', 'check_constraints', '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' ); 5)必須沒有表外鍵名稱超過64個字符 查詢命令: SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1), INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1) FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64); 6)必須確保升級后沒有廢棄的SQL mode系統參數,sql mode不能包含NO_AUTO_CREATE_USER,否則啟動不了; 推薦sql mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' 7)視圖的字段名超過64個字符要整改(5.7是可以達255字符長) 8)確認沒有存儲過程的 ENUM或SET 字段超過255個字符 9)確保沒有表分區在共享表空間內 查詢命令: SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single'; 從一個比較早版本的8.0版本則用這個查詢: SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single'; 移動分區到單獨表空間: ALTER TABLE table_name REORGANIZE PARTITION partition_name INTO (partition_definition TABLESPACE=innodb_file_per_table); 10)沒有查詢用到了ASC/DESC跟在group by后的從句 11)一些啟動的條件被移除了在8.0 12)區分大小寫,如要設置 lower_case_table_names=1,確保沒有大寫字符: 查看表或schema是否有大寫字符,查看命令: mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != LOWER(TABLE_NAME) AND TABLE_TYPE = 'BASE TABLE'; mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME != LOWER(SCHEMA_NAME); 假如在超出以上問題的情況下升級到8.0失敗,server會恢復對數據目錄所做的所有改變。在這種情況,刪除redo log files並重啟5.7 server用存在的數據目錄來解決錯誤。 重啟的時候會重新產生redo log文件。解決了報錯在嘗試重新進行升級。
3.假如你有用XA transactions,執行 XA COMMIT
or XA ROLLBACK
進行解決
4.假如有加密的表空間,執行 :ALTER INSTANCE ROTATE INNODB MASTER KEY;
5.設置innodb_fast_shutdown
mysql> SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown mysql> SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown,推薦 在一個fast/slow shutdown模式,undo logs和data files處於一種處理不同版本的文件格式的狀態,利於升級
6.關閉MySQL
# mysqladmin -u root -p shutdown --socket=/data/mysql/mysql.sock
7.解壓MySQL8.0二進制包
8.啟動MySQL8.0,用存在的數據目錄
# mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
當你啟動MySQL8的時候,為所有數據庫的對象升級元數據,並刪除.frm文件(記錄元數據的存儲介質)
9.在上個步驟,server升級了數據字典;現在執行剩余的升級操作:
·大於MySQL8.0.16版本,啟動MySQL時升級了數據字典並更新了各個系統庫的表、檢查各個業務庫是否兼容當前8.0版本。說人話就是第8個步驟執行完就等於升級成功(如沒有報錯)
·對於MySQL8.0.16版本之前的版本,之前以上步驟只是升級了數據字典,啟動成功之后還需執行mysql_upgrade來執行剩余的升級步驟
mysql_upgrade -u root -p
然后關閉並新啟動MySQL,確保對系統表所做的更改生效:
mysqladmin -u root -p shutdown mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
在第一次啟動MySQL8.0時你會注意到錯誤日志有忽略未升級的表,如果mysql_upgrade執行成功,第二次啟動的時候就沒有這樣的錯誤了
Logical Upgrade(邏輯升級)
1.查看信息章節,Section 2.11.1, “Before You Begin”.
2.導出數據
mysqldump -u root -p
--add-drop-table --routines --events
--all-databases --force > data-for-upgrade.sql
注釋:--routines and --events是導出存儲過程,--all-databases會把mysql系統庫也導出來
有創建虛擬列(generated column)的要規避,避免導入出現語法錯誤
3.導入上個步驟的dump文件到新的MySQL實例(即MySQL8.0版本)
mysql -u root -p --force < data-for-upgrade.sql
4. 執行一些剩余的升級操作
- 在MySQL8.0.16或更高版本,關閉server,再重啟server帶 --upgrade=FORCE條件來執行剩余的升級操作
mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir --upgrade=FORCE &
帶着--upgrade=FORCE重啟,server做一些mysql升到mysql8所需的改動,也做一些performance_schema、information_schema、sys和業務庫到mysql8版本的兼容問題
- 在MySQL8.0.16之前的版本
升級
# mysql_upgrade -u root -p
重啟生效
# mysqladmin -u root -p shutdown
# mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir &
5.注意是否需要刪除MySQL系統庫的event和proc表
DROP TABLE mysql.event;
DROP TABLE mysql.proc;