暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

MySQL 版本升级心得

原创 Hulong Cui 2022-07-15
4006

对于数据库软件来说,使用一段时间后,不可避免的要进行升级。这种升级主要是应对各种 安全漏洞,提高性能,新功能,bug等问题。对于热门的MySQL数据库,升级应该怎样应对。

为什么要升级

1)基于安全考虑(安全漏洞)

2)基于性能和 稳定性考虑:
MGR复制 ,并行复制writeset 等功能, 性能提升

3)新的功能:
Hash join ,窗口函数,DDL即时,json 支持, MGR复制 ,直方图 等

4)运维规划:原始环境中版本太多,为统一管理版本。

5)版本bug:
5.7.高版本, 或 8.0版本基本已到稳定期。

6)版本生命周期(8年)
image.png

升级场景

对于不同的场景,可以分为小版本升级,大版本升级,特点如下:
1) 同一个版本内容,指最后小序列升级。一般修复bug,添加一些功能点。 比如:5.7.X中 5.7.21 升级到 5.7.30。

  • 不改变数据文件,升级速度快;
  • 不可以跨操作系统,不可以跨大版本;
  • 方式上in-place upgrade小版本升级方法;应对 5.7.x内;

2)跨大版本进行5.7.X 到 8.0.X 本身体系架构有很大的变化。

  • 适合不同操作系统的MySQL升级,升级速度慢;
  • logical upgrade可跨机器、可跨操作系统。 跨平台 比如:Linux→Win,CentOS→麒麟V10;
  • 搭建高配置从库,安装新版本MySQL,配置从库同步;
  • 通过第三方工具,导出导入;

升级方案

在MySQL升级中,基本有三种方案可供参考:
image.png

1.搭建高版本从库

搭建一个全新的高版本从库。需要准备新的硬件 或则 原用选项的从库。
image.png

MySQL支持从一个版本系列复制到更高版本系列。例如,可以从运行MySQL 5.6的源复制到运行MySQL 5.7的副本,从运行MySQL 5.7的源复制到运行MySQL 8.0的副本,以此类推。但是,如果源使用语句或依赖于在副本上使用的MySQL版本中不再支持的行为,那么从旧源复制到新副本时可能会遇到困难。例如,MySQL 8.0不再支持超过64个字符的外键名称。

image.png

2.In-Place Upgrade

安装新的mysql软件,利用mysql_upgrade脚本来完成系统表的升级。从库先升级,之后切换主库。
需要兼容性测试。

  • 新版本的安装包替代老版本安装包
  • mysql_upgrade命令方式 (8.0 mysqld --upgrade)
  • 在线升级,主节点切换确保session kill 掉
    image.png

3.逻辑导入导出

采用mysqldump,mysqlpump,mydumper,navicate等工具
1.先导入表结构
2.之后导入数据
3.用户表
4.存储过程,触发器,视图,event 等
5.blob,text,bit字段导入之后需要注意
image.png

4. MySQL5.7 到8.0滚动升级

Mysql8.0还是提供了很多方便,不像之前一样5.6升级5.7那样,可以通过mysql shell进行确认。
在MySQL 8中mysql_upgrade客户端现已弃用。升级客户端执行的操作现在由服务器完成。
使用较旧的数据目录启动新的 MySQL 二进制文件。自动修复用户表。升级后不需要重新启动。
image.png
image.png
备注:5.7升级8.0还是新鲜的方式。但还是非常实用。

升级注意

image.png

  • 1.innodb_fast_shutdown参数:
    0 :完成所有的 full purge 和 merge insert buffer 操作(如:做 InnoDB plugin 升级时)
    1 :默认,不需要完成上述操作,但会刷新缓冲池中的脏页
    2 :不完成上述两个操作,而是将日志写入日志文件,下次启动时,会执行恢复操作 recovery
    没有正常地关闭数据库(如:kill 命令)/innodb_fast_shutdown=2 时,需要进行恢复操作。

  • 2.rpm安装和tar安装区别:
    rpm路径是固定的,所以在一个系统上只能安装一个mysql版本。

  • 3.字符集,排序顺序,大小写敏感需要更改注意

  • 4.mysql_upgrade
    -s, --upgrade-system-tables
    Only upgrade the system tables, do not try to upgrade the data.
    -f, --force
    Force execution of SQL statements even if mysql_upgrade has already been executed for the current version of MySQL.

  • 5.升级之后驱动JDBC版本问题, mysql一些中间件 比如:1.5mycat兼容性问题:
    https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html
    image.png

升级检查

不是升级完,就可以,还需要进行检查工作:

  • 1.升级完成,重启数据库:是否能正常启动
  • 2.检查升级结果:select version();
  • 3.时间是否正常获取
  • 4.Blob,text,字段检查:容易截断 丢失数据
  • 5.存储过程,触发器,event 能否执行检查,define用户
  • 6.高可用切换演练
  • 7.业务用户是否能正常访问

升级Error,Waring处理

mysql的error日志检查是必不可少的过程。下面列了一些错误记录:

1)innodb-file-format-check

[Warning] /usr/local/mysql-5.7/bin/mysqld: ignoring option ‘–innodb-file-format-check’ due to invalid value ‘Barracuda’
innodb-file-format-check 5.7不存在,需要注释掉,配置参数。

2)Storing MySQL user name or password &found a zombie dump thread

[Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the ‘START SLAVE Syntax’ in the MySQL Manual for more information.
[Note] While initializing dump thread for slave with UUID , found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(2508)

MASTER_HEARTBEAT_PERIOD参数导致: #方法1:复制进程信息处理 change master to MASTER_HEARTBEAT_PERIOD =30; #方案2:也可通过设置slave_net_timeout = 3600秒来解决问题 set global slave_net_timeout=3600;

3)Cannot Setup server variables.

如果执行mysql_upgrade过程中出现如下错误,说明权限导致,在my.cnf中加入:skip-grant-tables跳过就行了,执行完成后再去掉.
image.png

4)时间字段

1.timestamp字段默认值问题

Error Code: 1048. Column ‘create_time’ cannot be null explicit_defaults_for_timestamp=on下 不允许null值。

2.TIMESTAMP 范围:‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’

5)过滤[Warning] 信息

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set. [Warning] InnoDB: Using innodb_file_format is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html

对于timestamp defaults,innodb_file_format 都是未来版本废弃的参数

6)mysql8.0 小版本升级

[ERROR] [MY-011091] [Server] Data dictionary upgrade prohibited by the command line option '--no_dd_upgrade'. [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

回退方案

回退方案是为了应急而制定,确保数据不丢失。
1.升级前进行备份
2.binlog切记不要进行清除和删除,必要时要做好备份。
3.滚动升级应急处理方式:
从库升级过程中出现,升级无法进行的时候,不进行升级,保持原状。观察并解决问题,之后持续进行升级操作。

升级准备事项

有一句话说的好,那就是不打无准备之仗,这就告诉了不论做什么事情都要提前做好准备。升级也需要准备工作:
1)测试库升级,应用验证
2)数据库升级,末知问题发生
3)my.cnf配置信息调整
4)不兼容的操作方法,影响复制
5)一个平稳的过滤,列如先升级一个从库,到所有从库
6)最少停机时间,同样生产数据恢复到环境,进行模拟升级,评估时间
7)怎样进行数据验证:行数,表的数量 等等
8)考虑回滚方案
9)数据库备份
10)操作命令文档&步骤 准备

总结

版本升级,不是简单的事情。需要花费一定的精力计划,还需要各方面协调好。
准备工作必不可少,做事提前准备,很有必要,这样可以让事情做得更完美,做到不论碰到什么事情都能应对好。

最后修改时间:2022-12-27 13:29:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
2人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论