Windows Server 2019升级MariaDB11.4.13实操步骤

为什么要升到 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 是升级前复制的完整目录,改回名字就能直接用。

小结

整个升级最核心的三句话:

  1. 先用独立端口做冒烟测试,加 --no-defaults 绕开全局配置干扰
  2. bin 用新的,data 用旧的,这一步搞反就是数据全丢
  3. 改 my.ini 千万别用记事本,BOM 会让你在 1067 上浪费半天

最后提醒一句:升级是优化不是救命。10.11 支持到 2028 年,如果中途下载或解压反复出问题,随时可以停,没有任何损失。

分享到:

用微信扫一扫,分享给朋友


发布日期:

所属分类: SEO 网站运营 标签: