为什么要升到 11.4,这台机器上的 MariaDB 原先是 10.4,已经停止维护。10.11 支持到 2028 年 2 月,而 11.4 支持到 2029 年 5 月。既然要动一次,就直接上 11.4。
环境:Windows Server 2019 Datacenter(17763)+ XAMPP,原 MariaDB 10.11,字符集 latin1,数据目录约 260MB。
另外说明一点:官方 ZIP 包解压出来只有 bin,没有 share、没有 lib。实测服务能正常起、查询能正常返回,说明错误消息文件之类已经内置进 server.dll,不影响使用。
一、先做冒烟测试,不碰生产库
拿到新版本的 ZIP 包后,不要直接覆盖。先在独立目录、独立端口上跑一遍,确认二进制能在这个系统上启动。
初始化一个测试实例
mkdir C:\mdbtest-data C:\mariadb-11.4.13-winx64\bin\mysql_install_db.exe --datadir=C:\mdbtest-data
看到 Creation of the database was successful 即可。注意:目录必须为空,如果提示 Data directory is not empty,说明之前初始化过,换个目录或者删掉重建。
用 3307 端口启动
C:\mariadb-11.4.13-winx64\bin\mysqld.exe --no-defaults --console --datadir=C:/mdbtest-data --port=3307 --character-set-server=latin1 --collation-server=latin1_swedish_ci --max_allowed_packet=16M
这里 --no-defaults 很关键。我第一次启动时没加,直接报了这个错:
[ERROR] InnoDB: The data file '/xampp/mysql/data/ibdata1' must be writable [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. [ERROR] Unknown/unsupported storage engine: InnoDB [ERROR] Aborting
原因是机器上有个全局的 my.ini,里面写着 datadir 和 innodb_data_home_dir 指向 XAMPP 的真实数据目录,命令行参数的优先级低于它,被覆盖了。加上 --no-defaults 让 11.4 完全忽略这些配置,立刻就能起来。
另开一个命令行窗口验证:
C:\mariadb-11.4.13-winx64\bin\mysql.exe --port=3307 --protocol=TCP -u root -e "SELECT VERSION(), @@character_set_server, @@collation_server;"
返回 11.4.13-MariaDB | latin1 | latin1_swedish_ci,说明二进制没问题,可以正式替换。
二、备份:dump 失败时的替代方案
原本打算先 mysqldump 一份,但服务已经停了,dump 必然失败:
mysqldump -u root -p密码 --all-databases --routines --triggers --events --single-transaction > C:\xampp\_before114.sql mysqldump: Got error: 2002: "Can't connect to server on 'localhost' (10061)" when trying to connect
会生成一个 0 字节文件,记得删掉。
其实服务停着反而是复制数据的最佳时机——没有进程在写,复制出来的一定是干净的。直接把整个目录复制一份,这个副本比 dump 更保险(含 bin、data、配置文件全套):
xcopy C:\xampp\mysql C:\xampp\mysql_1011_backup /E /I /Y
这就是回滚保险丝。出问题把目录名改回去,30 秒恢复。
三、替换:bin 用新的,data 用你自己的
必须先停服务
不停服务直接改名会失败:
rename C:\xampp\mysql mysql_1011_old 拒绝访问。
因为 mysqld 进程占着目录。先停:
net stop mysql tasklist | findstr /i "mysqld"
确认无输出(进程真退了)再改名。
部署
mkdir C:\xampp\mysql xcopy C:\mariadb-11.4.13-winx64\bin C:\xampp\mysql\bin /E /I /Y xcopy C:\xampp\mysql_1011_old\data C:\xampp\mysql\data /E /I /Y
第三条是整个过程中最关键的一步:拷的是你原来 10.11 的 data 目录。绝对不能用新包里自带的 data,那是空的初始化数据,会把你的库全丢掉。
简单记:bin 用新的,data 用旧的。
四、my.ini 的三个坑
坑 1:记事本保存出 BOM,服务起不来
用记事本新建 my.ini 保存后,net start mysql 报 1067 进程意外终止。手工启动才能看到真实原因:
mysqld.exe --defaults-file=C:\xampp\mysql\bin\my.ini --console error: Found option without preceding group in config file: C:\xampp\mysql\bin\my.ini at line: 1 Fatal error in defaults handling. Program aborted
意思是第一行不是 [组名]。原因是记事本在文件开头加了 BOM 隐藏字节(UTF-8 的 EF BB BF 或 UTF-16),mysqld 读不出来就直接中止。
最省事的解决办法:直接把原来那份能用的 my.ini 拷回来。
copy C:\xampp\mysql_1011_old\bin\my.ini C:\xampp\mysql\bin\my.ini
如果一定要改内容,用 PowerShell 改,别用记事本(-Encoding ASCII 保证不写 BOM):
(Get-Content 'C:\xampp\mysql\bin\my.ini') -replace '/xampp/', 'C:/xampp/' | Set-Content -Encoding ASCII 'C:\xampp\mysql\bin\my.ini'
改完顺手确认第一行没坏:
Get-Content 'C:\xampp\mysql\bin\my.ini' -TotalCount 2
应该显示 [client] 和 port。
坑 2:datadir 缺盘符,mariadb-upgrade 报 UNC 路径
原配置里写的是 datadir = "/xampp/mysql/data",没有盘符。服务端启动时碰巧能补上,但 mariadb-upgrade 这个工具补不上,把它拼成了网络路径:
FATAL ERROR: Could not open or create the upgrade info file '\\xampp\\mysql\\data\\mariadb_upgrade_info' in the MariaDB Servers data directory, errno: 2 (No such file or directory)
注意开头是 \\,Windows 会当成 UNC 路径去找一台叫 "xampp" 的网上邻居,当然找不到(errno 2)。用上面的 PowerShell 命令给所有 /xampp/ 补上 C: 即可。
坑 3:废弃参数
11.4 已经移除或改名的参数,写在配置里会导致启动失败,常见的有:
innodb_additional_mem_pool_size(已移除)key_buffer(要用完整名key_buffer_size,用简写会提示 "Using unique option prefix is error-prone")query_cache_size(已废弃)
我这份配置之前升级 10.11 时已经把 innodb_log_file_size 注释掉了,侥幸躲过。另外 11.4 的官方 ZIP 不含 lib\plugin 目录,plugin_dir 那行要注释掉,否则会告警。
五、升级系统表并验证
net stop mysql net start mysql cd /d C:\xampp\mysql\bin mysql -u root -p密码 -e "SELECT VERSION(), @@character_set_server, @@collation_server;" mariadb-upgrade.exe -u root -p密码 --force
11.4 里 mariadb-upgrade 才是正主,mysql_upgrade 只是旧别名。注意最后那条单独一行输入,别跟前面的命令粘在一起,否则会被解析成一个不存在的参数。
期望输出同样是 11.4.13-MariaDB | latin1 | latin1_swedish_ci。字符集和原来一致,中文内容就不会有风险。
如果启动失败,用备份还原(30 秒回到可用状态):
copy C:\xampp\mysql\bin\my.ini.bak C:\xampp\mysql\bin\my.ini net start mysql
六、顺手把缓存池调大
原配置里有一行很致命:
innodb_buffer_pool_size = 16M
而我的 data 目录有 260MB。缓存池比数据还小,等于几乎每次查询都要读磁盘。这个值从 2012 R2 时代就没动过,WordPress 后台尤其明显。
(Get-Content 'C:\xampp\mysql\bin\my.ini') -replace 'innodb_buffer_pool_size = 16M','innodb_buffer_pool_size = 256M' | Set-Content -Encoding ASCII 'C:\xampp\mysql\bin\my.ini'
改完重启验证:
mysql -u root -p密码 -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
返回 268435456 即 256MB。注意:4GB 内存的机器上别给太大,256MB 是个平衡点。
七、回滚
跑完 mariadb-upgrade 之后,数据文件就变成 11.4 格式,10.11 不能直接读了。所以回滚要用没被动过的原始副本,而不是改名后的那个目录:
net stop mysql rename C:\xampp\mysql mysql_114_bad rename C:\xampp\mysql_1011_backup mysql net start mysql
mysql_1011_backup 是升级前复制的完整目录,改回名字就能直接用。
小结
整个升级最核心的三句话:
- 先用独立端口做冒烟测试,加
--no-defaults绕开全局配置干扰 - bin 用新的,data 用旧的,这一步搞反就是数据全丢
- 改 my.ini 千万别用记事本,BOM 会让你在 1067 上浪费半天
最后提醒一句:升级是优化不是救命。10.11 支持到 2028 年,如果中途下载或解压反复出问题,随时可以停,没有任何损失。