任務背景:將線上環境 MySQL 5.5 (Windows) 的完整資料遷移至測試環境 MySQL 5.1 (Linux)。資料庫包含大量二進位資料、視圖、函數、觸發器,且存在歷史亂碼問題。
先後使用 Navicat Premium、SQLyog 進行匯出/匯入,雖然匯出成功,但匯入總是中斷報錯。主要原因推測為:
mysqldump.exe -uroot -proot --default-character-set=utf8 \
--opt --extended-insert=false --triggers -R --hex-blob -x house > backup.sql
關鍵參數說明:
--hex-blob:二進位欄位以十六進位導出,避免編碼問題--triggers -R:包含觸發器與預存程序/函數--extended-insert=false:單行 INSERT,利於除錯與部分恢復-x:鎖定所有資料表,保證一致性快照mysql> source /path/to/backup.sql
匯入自訂函數時提示:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA...
臨時方案(重啟失效):
SET GLOBAL log_bin_trust_function_creators = 1;
永久方案:修改 my.cnf(或 my.ini)的 [mysqld] 區段:
[mysqld]
log_bin_trust_function_creators = 1
重啟 MySQL 服務生效。
測試伺服器運行兩個 MySQL 實例,預設 mysql 指令連到錯誤實例。
定位正確 socket:
ps aux | grep mysqld
# 找到目標實例的 --socket=/tmp/mysql.sock
指定 socket 連線:
mysql -uroot -p -P3306 -S /tmp/mysql.sock
--hex-blob 與字符集一致性得到解決mysqldump + source,參數要精準--hex-blob,字符集統一指定 --default-character-setlog_bin_trust_function_creators-S socket 指定連線目標