一直以来,我们使用MySQL,进行版本升级,比如从5.7.11升级到5.7.12,这种小版本升级是一个很小的事情,即使升级过程中或在升级之后,想要回滚,也很方便,直接将mysql server的二进制文件替换回来即可。但是从MySQL 8.0开始,小版本升级将变得不再可逆,没有办法轻松做到从 8.0.18 回退到 8.0.17。
先来看一个例子,从8.0.17版本升级到8.0.18版本,查看mysql日志,如下:
[System] [MY-010116] [Server] /opt/mysql_templates/mysql-8P/bin/mysqld (mysqld 8.0.18) starting as process 13242
…
[System] [MY-013381] [Server] Server upgrade from '80017' to '80018' started.
…
[System] [MY-013381] [Server] Server upgrade from '80017' to '80018' completed.
…
[System] [MY-010931] [Server] /opt/mysql_templates/mysql-8P/bin/mysqld: ready for connections. Version: '8.0.18'
一切顺利,成功升级到8.0.18版本。但是我们发现升级完成之后,有一些已有的业务工作的不正常,与预期不符合,此时,我们想要回滚到8.0.17版本。使用8.0.17版本的mysql server启动数据库,发现无法启动,报错,如下:
[Server] /opt/mysql_templates/mysql-8P/bin/mysqld (mysqld 8.0.17) starting as process 26663
…
[ERROR] [MY-013171] [InnoDB] Cannot boot server version 80017 on data directory built by version 80018. Downgrade is not supported
…
[System] [MY-010910] [Server] /opt/mysql_templates/mysql-8P/bin/mysqld: Shutdown complete (mysqld 8.0.17) MySQL Community Server - GPL.
MySQL 8.0 小版本升级不支持回退:
在官方文档中已明确说明,MySQL 8.0 不支持回退到 5.7,8.0高版本不支持回退到8.0低版本,如果想回滚,需要在升级前做好备份,使用备份进行回滚。官方文档如下:
https://dev.mysql.com/doc/refman/8.0/en/downgrading.html
关于升级不可回滚的思考:
在MySQL 8.0之前,升级MySQL小版本是一件微不足道的小事情,不用担心回滚,直接替换mysql server二进制文件即可。而如今,升级MySQL8.0小版本之前,必须要做好准备:
- 做一次完全的备份,必须确认备份有效,如果数据量很大,那么回滚的耗时也将很长。
- 做小版本升级要慎重,升级之前要充分测试验证,因为一旦发现问题,小版本回滚的成本是非常高的。