MySQL5.7升級版本到8.0


升級二進制包安裝的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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM