本文为墨天轮数据库管理服务团队第185期技术分享,内容原创,作者为技术顾问杨明翰,如需转载请联系小墨(VX:modb666)并注明来源。如需查看更多文章可关注【墨天轮】公众号。

image.png

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

标签: none

添加新评论