OpenWrt 預設編譯的 MySQL 不包含 InnoDB 支援。本文記錄通過修改編譯配置啟用 InnoDB、調整參數適配嵌入式資源、解決閃存空間不足導致初始化失敗、掛載 USB 儲存擴容的完整過程。
feeds/oldpackages/libs/mysql/Makefile,在 --with-server 前添加 --with-innodb。feeds/oldpackages/libs/mysql/conf/my.cnf,在 [mysqld] 區添加:default-storage-engine=INNODBinnodb_file_per_table = 1innodb_flush_log_at_trx_commit = 2(減少刷盤,保護閃存壽命)start() {
local datadir=$(sed -n -e "s/^[[:space:]]*datadir[[:space:]]*=[[:space:]]*[\"']\?\([^\"']*\)[\"']\?/\1/p" /etc/my.cnf)
local mysqldatadir="/mnt/data/mysql/"
local mysqltmpdir="/mnt/data/tmp/"
local mysqlsrvdir="/srv/mysql/"
# 確保目錄存在
for d in "$mysqldatadir" "$mysqltmpdir" "$mysqlsrvdir"; do
[ -d "$d" ] || { echo "create dir $d..."; mkdir -p "$d"; }
done
[ -d "$datadir" ] || { error "datadir $datadir not exist"; return 1; }
# 首次初始化系統表
if [ ! -f "$datadir/mysql/tables_priv.MYD" ]; then
mysql_install_db --force
service_stop
/usr/bin/mysqld # 前台運行完成初始化
fi
service_start /usr/bin/mysqld
}
設備 Netgear WNDR3700v2(16MB Flash)啟動報錯:
150203 1:32:31 InnoDB: Initializing buffer pool, size = 8.0M
150203 1:32:31 InnoDB: Completed initialization of buffer pool
InnoDB: Error: auto-extending data file ./ibdata1 is of a different size
InnoDB: 64 pages (rounded down to MB) than specified in the .cnf file:
InnoDB: initial 640 pages, max 0 (relevant if non-zero) pages!
InnoDB: Could not open or create data files.
...
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Unknown/unsupported table type: INNODB
根因:InnoDB 系統表空間 ibdata1 最小需 10MB 連續空間,16MB Flash 扣除固件、內核、只讀分區後剩餘不足。
kmod-fs-vfat (FAT32)kmod-nls-cp437 kmod-nls-iso8859-1 kmod-nls-utf8 (編碼支援)kmod-usb-core kmod-usb-ohci kmod-usb-storage kmod-usb2 (USB 支援)/mnt/data,修改 my.cnf datadir=/mnt/data/mysql、tmpdir=/mnt/data/tmp。腳本中連續執行 mysql_install_db --force 緊接 mysqladmin -u root password '...' 可能失敗,因前者尚未完全退出。解決:插入 sleep 3 或輪詢檢查進程/端口就緒後再執行後續命令。