本文为墨天轮数据库管理服务团队第185期技术分享,内容原创,作者为技术顾问杨明翰,如需转载请联系小墨(VX:modb666)并注明来源。如需查看更多文章可关注【墨天轮】公众号。
1、Linux 升级清单
升级前评估
- 确认版本与配置:mysqld --version、备份/etc/my.cnf与所有conf.d片段。
- 认证兼容性:应用端优先支持caching\_sha2\_password;如暂需旧方案,在[mysqld]可临时加mysql\_native\_password=ON。
- 架构检查:外键是否引用非唯一/部分索引;是否存在非整数类型的AUTO\_INCREMENT。
备份策略:
- 逻辑备份:mysqldump --all-databases --routines --events --triggers --single-transaction --master-data=2 > /backup/mysql-$(date +%F).sql
- 物理备份:停库后打包datadir(如/var/lib/mysql):tar czf /backup/datadir-$(date +%F).tar.gz /var/lib/mysql
停库与切换
停止服务:sudo systemctl stop mysqld(或mysql、mysql.service,视安装源)
确认端口释放:ss -lntp | grep :3306 无进程为宜
配置官方仓库(选择8.4 LTS轨道)
RHEL/CentOS/Oracle Linux(DNF/YUM):
- 安装APT配置包(版本号依发行版变化):wget https://dev.mysql.com/get/mysql-apt-config\_*.deb && sudo dpkg -i mysql-apt-config\_*.deb
- 选择MySQL Server & Cluster: 8.4-lts(如需,运行sudo dpkg-reconfigure mysql-apt-config调整轨道)
- 更新索引:sudo apt-get update
Debian/Ubuntu(APT):
- 安装社区repo:sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el$(rpm -E %rhel)-1.noarch.rpm
- 禁用创新/8.0,启用8.4 LTS:sudo dnf config-manager --disable mysql-innovation-community mysql80-community && sudo dnf config-manager --enable mysql-8.4-lts-community
- 更新缓存:sudo dnf makecache
执行升级
- RHEL系:sudo dnf upgrade mysql-server(或sudo yum upgrade mysql-server)
- Debian系:sudo apt-get install --only-upgrade mysql-server
- 如数据目录或服务名自定义,核对单元文件与datadir一致
启动与校验
- 启动服务:sudo systemctl start mysqld
- 查看错误日志:journalctl -u mysqld -n 200 或数据目录中的*.err
- 校验升级历史:数据目录新建/更新mysql\_upgrade\_history(8.4新增),作为升级记录
基础健康检查:
- 连接测试:mysql -uroot -p -e "SELECT VERSION();"
- 认证测试:使用应用客户端进行连接验证
- 性能基线:针对关键SQL做延迟与吞吐对比
兼容性调优
- 替换脚本:将FLUSH HOSTS替换为TRUNCATE TABLE performance\_schema.host\_cache
- 按工作负载评估默认值变化:例如innodb\_adaptive\_hash\_index、innodb\_flush\_method=O\_DIRECT、innodb\_io\_capacity=10000、innodb\_log\_buffer\_size=64M、temptable\_max\_ram等
- 如需兼容旧客户端,[mysqld]临时设mysql\_native\_password=ON并制定迁移计划
回滚预案
- LTS系列内支持就地降级到其他8.4.x;跨系列回退需逻辑备份恢复
- 保留原包与备份,在严重问题时停库回滚到8.0并恢复备份
2、外键清理脚本草案(检测并生成建议)
目标:找出引用的父表列未具备“完全匹配的唯一索引”的外键,并输出建议创建唯一键与重复值检查语句
检测与建议生成
-- 列出引用父表列未匹配任何唯一索引(主键/唯一键)的外键
WITH fk_cols AS (
SELECT
CONSTRAINT_SCHEMA, CONSTRAINT_NAME,
TABLE_SCHEMA, TABLE_NAME,
REFERENCED_TABLE_SCHEMA AS R_SCHEMA,
REFERENCED_TABLE_NAME AS R_TABLE,
REFERENCED_COLUMN_NAME AS R_COL,
ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA ISNOT NULL
),
fk_groups AS (
SELECT
CONSTRAINT_SCHEMA, CONSTRAINT_NAME, R_SCHEMA, R_TABLE,
GROUP_CONCAT(CONCAT('`',R_COL,'`') ORDERBY ORDINAL_POSITION) AS R_COLS
FROM fk_cols
GROUPBY CONSTRAINT_SCHEMA, CONSTRAINT_NAME, R_SCHEMA, R_TABLE
),
uniq_idx AS (
SELECT
TABLE_SCHEMA, TABLE_NAME, INDEX_NAME,
GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`') ORDERBY SEQ_IN_INDEX) AS U_COLS
FROM INFORMATION_SCHEMA.STATISTICS
WHERE NON_UNIQUE =0
GROUPBY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME
)
SELECT
fg.CONSTRAINT_SCHEMA, fg.CONSTRAINT_NAME, fg.R_SCHEMA, fg.R_TABLE, fg.R_COLS,
CONCAT(
'/* REVIEW */ ALTER TABLE `', fg.R_SCHEMA, '`.`', fg.R_TABLE,
'` ADD UNIQUE KEY `uk_for_', fg.CONSTRAINT_NAME, '` (', fg.R_COLS, ');'
) AS suggest_add_unique,
CONCAT(
'/* CHECK DUPLICATES */ SELECT ', REPLACE(fg.R_COLS,'`',''),
', COUNT(*) FROM `', fg.R_SCHEMA, '`.`', fg.R_TABLE,
'` GROUP BY ', REPLACE(fg.R_COLS,'`',''), ' HAVING COUNT(*)>1 LIMIT 10;'
) AS check_duplicates
FROM fk_groups fg
LEFTJOIN uniq_idx ui
ON ui.TABLE_SCHEMA = fg.R_SCHEMA AND ui.TABLE_NAME = fg.R_TABLE AND ui.U_COLS = fg.R_COLS
WHERE ui.INDEX_NAME ISNULL
ORDERBY fg.R_SCHEMA, fg.R_TABLE, fg.CONSTRAINT_NAME;使用说明:
- 先执行查询,确认每条建议的唯一键是否符合业务含义。
- 先运行CHECK DUPLICATES语句检查是否存在重复值;如有重复,需先清洗数据或改造外键设计,再执行ADD UNIQUE KEY。
- 对高并发/大表,建议在低峰期执行DDL,或采用在线DDL方案。
3、AUTO\_INCREMENT 清理脚本草案(检测并生成建议)
目标:找出非整数类型的AUTO\_INCREMENT列并输出建议(转换为整数或移除该属性)
检测与建议生成
-- 检测非整数类型的AUTO_INCREMENT列
SELECT
TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE,
CONCAT(
'/* OPTION A: convert to BIGINT */ ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME,
'` MODIFY `', COLUMN_NAME, '` BIGINT NOT NULL AUTO_INCREMENT;'
) AS suggest_convert_to_bigint,
CONCAT(
'/* OPTION B: remove AUTO_INCREMENT */ ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME,
'` MODIFY `', COLUMN_NAME, '` ', UPPER(DATA_TYPE), ' NOT NULL;'
) AS suggest_remove_auto_increment
FROM INFORMATION_SCHEMA.COLUMNS
WHERE EXTRA LIKE'%auto_increment%'
AND DATA_TYPE NOTIN ('tinyint','smallint','mediumint','int','bigint')
ORDERBY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;使用说明:
- 如该列为“业务浮点字段”而误设为AUTO\_INCREMENT,优先移除该属性(Option B)。
- 如该列充当“主键/代理键”,建议改为整数类型(Option A),并确保:
- 列为主键或具备唯一约束
- 下游引用与应用代码兼容整数ID
- 对于类型变更可能的溢出与精度问题需评估;迁移前可用SELECT MAX(col)评估安全范围。
4、额外建议
将上述检测查询加入升级前检查环节,并把生成的建议语句按业务重要性与低峰窗口分批执行。
在预生产环境先做一次完整演练:执行备份、停库、升级、DDL整改、回归测试、性能对比,最终形成可复用的变更流水线。
升级后关注数据目录中的mysql\_upgrade\_history记录,纳入配置与审计流程。
墨天轮从乐知乐享的数据库技术社区蓄势出发,全面升级,提供多类型数据库管理服务。墨天轮数据库管理服务旨在为用户构建信赖可托付的数据库环境,并为数据库厂商提供中立的生态支持。
墨天轮数据库服务官网:https://www.modb.pro/service
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。