MyISAM 在高併發寫入場景下易發生表級鎖定,導致請求超時返回 502。轉換為支援行級鎖、事務的 InnoDB 是標準解決方案。本文提供零停機風險的分步遷移流程。
mysqldump -d -u username -p database_name > table_structure.sql
# -d / --no-data:僅匯出結構
# Linux/macOS 使用 sed 就地替換
sed -i 's/MyISAM/InnoDB/g' table_structure.sql
sed -i 's/ENGINE=MyISAM/ENGINE=InnoDB/g' table_structure.sql # 兼容不同寫法
# Windows 可用 Notepad++ / PowerShell 替換
# PowerShell: (Get-Content table_structure.sql) -replace 'MyISAM','InnoDB' | Set-Content table_structure.sql
驗證: grep -n "InnoDB" table_structure.sql 確認無殘留 MyISAM。
mysql -u root -p -e "CREATE DATABASE database_new CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p database_new < table_structure.sql
驗證引擎:
mysql -u root -p database_new -e "SHOW TABLE STATUS;" | grep Engine
mysqldump -t -u username -p database_name > table_data.sql
# -t / --no-create-info:僅匯出資料
mysql -u root -p database_new < table_data.sql
大量資料建議:
split -l 10000 table_data.sql part_ 並行導入SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 導入後恢復max_allowed_packet、innodb_log_file_sizeMySQL 5.6+ 支援在線 DDL,小表可直接轉換:
ALTER TABLE table_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
限制: 大表執行時間長、佔用臨時空間、仍有短暫元數據鎖。核心業務大表建議採用上述「雙寫/遷移切換」方案。
[mysqld]
innodb_buffer_pool_size = 物理記憶體 60-80%
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
max_connections = 2000