升级到MySQL 8.0?这些 Tips 必Get

51CTO官方

141
0

2024/04/23

MySQL凭借着极其优秀的性能、可靠性和易用性,已成为基于Web应用程序排名靠前的开源数据库。随着时间的推移, MySQL 5.7 的时代即将圆满落幕, 2023年10月31日MySQL 5.7 将终止官方支持和更新。之后,Oracle官方将不再为MySQL 5.7提供漏洞修复和安全补丁。MySQL 8.0则风风火火的走到了舞台中央, 开始了它的精彩表演。

图片

不升级到MySQL 8.0?  5.7真出了问题, 这个锅谁来背?! 升级迫在眉睫, 那么升级过程中有哪些必须Get的Tips知识点呢? 敲黑板,知识点!

Tips-1: 简单的升级预检查

MySQL Shell 是与 MySQL一起使用的流行工具,它完美的集成在了 Oracle 云基础设施 (OCI) 的MySQL Database Service(MDS)中。它的功能非常强大, 整个升级迁移过程中会多次用到它。

在升级MySQL的时候,需要确认版本间的差异, 查阅Release Notes, Reference等文档来确定比如参数的变动,关键字的变化, 缺省的字符集的异同等等, 然后根据这些差异来调整对应的参数和库表结构,整个过程在没有MySQL Shell之前是比较繁琐的。

现在我们有了新的选择, 通过使用MySQL Shell让升级预检查更加简单,这个检查有两种不同的调用入口, 可以根据需要选择其中的任意一种。

方式一: 使用System Shell调用入口

$ mysqlsh – util checkForServerUpgrade user@localhost:3306 –target-versinotallow=8.0.33 –output-format=JSON
--config-path=/etc/my.cnf

方式二: 使用MySQL Shell调用入口

mysqlsh>util.checkForServerUpgrade('user@example.com:3306',{"password":"password","targetVersion":"8.0.33", "configPath":"/etc/my.cnf"})

生成的报告中会明确列出正常的数据库对象和参数以及哪些对象, 哪些参数或哪些关键字需要调整。下面的例子中可以看到dbtest.system这张表的json_table, cube列名与8.0中的保留关键字 ”JSON_TABLE”, ”CUBE”相冲突。需要修改dbtest.system这张表的列名后才能升级迁移到MySQL 8.0。

The MySQL server at example.com:3306, version
5.7.33-enterprise-commercial-advanced - MySQL Enterprise Server - Advanced Edition (Commercial),
will now be checked for compatibility issues for upgrade to MySQL 8.0.29...
1) Usage of old temporal type
No issues found
2) Usage of db objects with names conflicting with new reserved keywords
Warning: The following objects have names that conflict with new reserved keywords.
Ensure queries sent by your applications use `quotes` when referring to them or they will result in errors.
dbtest.System - Table name
dbtest.System.JSON_TABLE - Column name
dbtest.System.cube - Column name
……

Tips-2: 在线快速切换

MySQL 5.7升级迁移到8.0有online和offline两种方式, 如果业务对停机窗口不敏感,那就用简单可靠的offline模式: 测试通过后, 停止应用服务, 将数据从5.7导出,然后导入8.0.启动连接到8.0的应用; 否则建议使用GoldenGate对MySQL 5.7进行Online模式的快速升级切换。

图片

Oracle GoldenGate软件, 支持跨平台跨版本数据复制, 其基本工作方式是, 捕获源端MySQL 5.7数据库的日志,存入数据队列,并加密压缩后路由传输到目标端, 交付到目标端的MySQL 8.0数据库内。从源端到目标端的数据变化可以准实时的进行捕获, 传输, 交付, 一旦两端的数据追平后, 数据库可以随时快速切换到8.0版本, 如果有问题, 还可以通过回写通道进行回退操作。

图片

Tips-3: 更快的转储速度

MySQL Shell 的导出导入的速度更快、并且与 OCI 完美兼容(块存储、MDS 授权、自动创建主键等)。

MySQL Shell在数据导出导入时, 可以自定义并发的线程个数, 以加快数据转储的速度,减少移动数据所消耗的时间, 同等配置的条件下, MySQL Shell的数据导出导入速度可以达到mysqldump的9倍左右。除此之外, MySQL Shell还可以通过参数ocimds来进行备份集与MySQL Database Service的兼容性检查。

数据导出

util.dumpSchemas(['testdb'],'/bak',{"threads":4,ocimds:true, howProgress:true,maxRate:"200M",compatibility: ["strip_definers", "strip_restricted_grants","skip_invalid_accounts"]})

数据导入

util.loadDump("/bak", {dryRun: false, showProgress: true, threads: 8, waitDumpTimeout: 300, ignoreVersion: true})

图片

Tips-4: 增强的安全性

MySQL 8.0的默认身份验证机制从之前MySQL 5.7的 mysql_native_password 更新到了现在的 caching_sha2_password。mysql_native_password使用的是基于 SHA1 算法,这种算法简单并且相同的密码拥有相同的哈希值, 很容易被解,开 有安全隐患。   caching_sha2_password身份验证机制升级为更安全的SHA256算法, round次数从原来的2次提升为5000次, 密码值为Salt后的值, 即使两个不同用户的密码相同,保存在计算机中的哈希值也不同。从而提高了安全性,与此同时使用缓存来加快用户的身份验证过程。

如果客户端因为应用的限制暂时无法升级, 在连接时报错, 可以通过如下命令临时调用mysql_native_password的验证方式创建用户, 赋于合适权限后连接到数据库。

CREATE USER <username>@'<host>' IDENTIFIED WITH mysql_native_password BY '<password>’;
GRANT <privileges> ON <dbname>.* to < username >@'<host>';


内容来源于:​升级到MySQL 8.0?这些 Tips 必Get

代理合作
关注微信

扫一扫关注我们

客服投诉