- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
对于group by聚合操作,order by 列必须在group by中出现
mysql> select name,age from test group by name,age order by name;+------+------+| name | age|+------+------+| aa|18 |+------+------+1 row in set (0.00 sec)mysql> select name,age from test group by name,age order by id;ERROR 1055 (42000): Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'test.test.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_bymysql>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 解决方案1:研发侧调整对应的SQL语句
- 解决方案2:调整MySQL5.7/8.0的sql_mode参数,保证兼容MySQL5.5的语法
2)MyISAM存储引擎的表可能存在潜在问题
解决方案:经过排查,目前线上bbs的库表均为innodb存储引擎或者memory存储引擎
3)部分SQL会出现执行计划发生改变 , 可能需要略微调整
解决方案:目前暂时没有发现 , 后续有类似SQL,可以针对性处理
4)字符集验证
MySQL5.7默认字符集是utf8字符集,如果是gbk等字符集需要调整并验证
解决方案:DBA侧保证升级过后,不会出现乱码等字符集报错信息
3、MySQL 5.7升级到MySQL8.0的补充兼容性测试:
1)表中需要包含主键
在8.0版本中会强制要求表中包含主键
2)timestamp数据类型默认值
如果表结构中有timestamp类型字段,并且设置了默认值DEFAULT CURRENT_TIMESTAMP,建议将参数设置为off:
explicit_defaults_for_timestamp=OFF(8.0默认为on)
- 1.
否则有可能会出现:Error:1048 - Column ‘createTime‘ cannot be null
3)执行计划变化
部分SQL会出现执行计划发生改变,可能需要略微调整
解决方案:跨版本升级中的SQL异常,可以通过提前交付只读实例来进行预先验证,并且抓取原库的慢日志在8.0数据库中进行回放验证
4)MySQL8.0 新增关键字(如rank) , 可能导致查询、写入失败
mysql> select rank from activity_public_log limit 1;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from activity_public_log limit 1' at line 1
- 1.
- 2.
解决方案:改写成 `rank`或者调整字段名
mysql> select `rank` from activity_public_log limit 1;
- 1.
查询方式:
select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAMEfrom information_schema.COLUMNS where COLUMN_NAME="rank";
- 1.
5)对于load权限的确认
部分业务具有导入数据的权限,在默认模板中参数secure_file_priv和local_infile是关闭的,需要和业务侧确认是否有该类需求,或者从定时任务中识别
6)存储过程权限检查
部分业务中存在存储过程时,对于存储过程的权限粒度 invoker和definer差异可能导致迁移后业务调用失败,需要在迁移中进行检查
(五)制定资源申请和回收流程
有了前面的流程支持,整个过程基本可以跑起来了,还有一个风险则是采用资源平替的方案,也就意味着今天数据库实例是业务A的主库,完成升级之后我们会让系统的同事重新格式化后交付给我们,很可能明天就变成业务B的从库了,所以资源是以资源池的形式在反复利用,对于如何申请资源和下线资源就是关键,我们制定的流程是需要至少3次审核才可以下线,而且下线的过程中还需要有一定的观察期窗口 。
为此我们也指定了专人负责制度,即最终的下线操作只能由固定的一个人来操作,他需要对下线操作做最后的审核,并且负责 。
推荐阅读
- AIGC浪潮“卷”至广告业,AI营销到底靠不靠谱?
- 深度学习算法:从模仿到创造
- Oracle 通过向量存储和全新的生成式 AI 功能,持续推动 MySQL HeatWave 创新
- Spring事务超时到底是怎么回事?
- 如何提取住房公积金 如何提取住房公积金里的钱到银行卡
- 抖音关键词优化到底怎么做?
- 睡都睡了,娃都打酱油了!到头来却没有一场婚礼,这4位女星太憋屈
- “轰油门”到底能不能除积炭?
- 如何找到适合自己的跑步配速?
- 有其父必有其子!谢霆锋被气到住院!只因儿子带回一位“老阿姨”!