MySQL 8.0:字符集從 utf8 轉換成 utf8mb4的遷移方法【轉】


整理 MySQL 8.0 文檔時發現一個變更:

默認字符集由 latin1 變為 utf8mb4。想起以前整理過字符集轉換文檔,升級到 MySQL 8.0 后大概率會有字符集轉換的需求,在此正好分享一下。

當時的需求背景是:

部分系統使用的字符集是 utf8,但 utf8 最多只能存 3 字節長度的字符,不能存放 4 字節的生僻字或者表情符號,因此打算遷移到 utf8mb4。

遷移方案一

1. 准備新的數據庫實例,修改以下參數:

    [mysqld]

    ## Character Settings

    init_connect='SET NAMES utf8mb4'

    #連接建立時執行設置的語句,對super權限用戶無效

    character-set-server = utf8mb4

    collation-server = utf8mb4_general_ci

    #設置服務端校驗規則,如果字符串需要區分大小寫,設置為utf8mb4_bin

    skip-character-set-client-handshake

    #忽略應用連接自己設置的字符編碼,保持與全局設置一致

    ## Innodb Settings

    innodb_file_format = Barracuda

    innodb_file_format_max = Barracuda

    innodb_file_per_table = 1

    innodb_large_prefix = ON

    #允許索引的最大字節數為3072(不開啟則最大為767字節,對於類似varchar(255)字段的索引會有問題,因為255*4大於767)

 

 

 

2. 停止應用,觀察,確認不再有數據寫入

可通過 show master status 觀察 GTID 或者 binlog position,沒有變化則沒有寫入。

3. 導出數據

先導出表結構:

 

mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql

 

 

 

后導出數據:

 

mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql

 

 

 

4. 修改建表語句

修改導出的表結構文件,將表、列定義中的 utf8 改為 utf8mb4

5. 導入數據

先導入表結構:

 

mysql -u -p testdb < /backup/testdb.sql

 

 

 

后導入數據:

 

mysql -u -p testdb < /backup/testdata.sql

 

 

 

6. 建用戶

查出舊環境的數據庫用戶,在新數據庫中創建

7. 修改新數據庫端口,啟動應用進行測試

關閉舊數據庫,修改新數據庫端口重啟,啟動應用

遷移方案二

1. 修改表的字符編碼會鎖表,建議先停止應用

2. 停止 mysql,備份數據目錄(也可以其他方式進行全備)

3. 修改配置文件,重啟數據庫

 

    [mysqld]

    ## Character Settings

    init_connect='SET NAMES utf8mb4'

    #連接建立時執行設置的語句,對super權限用戶無效

    character-set-server = utf8mb4

    collation-server = utf8mb4_general_ci

    #設置服務端校驗規則,如果字符串需要區分大小寫,設置為utf8mb4_bin

    skip-character-set-client-handshake

    #忽略應用連接自己設置的字符編碼,保持與全局設置一致

    ## Innodb Settings

    innodb_file_format = Barracuda

    innodb_file_format_max = Barracuda

    innodb_file_per_table = 1

    innodb_large_prefix = ON

    #允許索引的最大字節數為3072(不開啟則最大為767字節,對於類似varchar(255) 字段的索引會有問題,因為255*4大於767)

 

 

 

4. 查看所有表結構,包括字段、修改庫和表結構,如果字段有定義字符編碼,也需要修改字段屬性,sql 語句如下:修改表的字符集:

 

alter table t convert to character set utf8mb4;

 

 

 

影響:拷貝全表,速度慢,會加鎖,阻塞寫操作

修改字段的字符集(utf8mb4 每字符占 4 字節,注意字段類型的最大字節數與字符長度關系):

 

alter table t modify a char CHARACTER SET utf8mb4;

 

 

 

影響:拷貝全表,速度慢,會加鎖,阻塞寫操作

修改 database 的字符集:

 

alter database sbtest CHARACTER SET utf8mb4;

 

 

 

影響:只需修改元數據,速度很快

5. 修改 JDBC url characterEncoding=utf-8

 

轉自

知數堂-技術分享 | MySQL 8.0:字符集從 utf8 轉換成 utf8mb4 https://mp.weixin.qq.com/s/p-aooa7WRDSPK6wCaqVy6w


免責聲明!

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



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