Mysql线上问题整理

一、 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation ‘=’

问题描述:关联表查询时关联字段的排序规则不统一,导致查询报错

解决方案:
1.SQL层面
在表关联条件 ON A = B 后面加上统一的排序规则即可,如 ON A = B COLLATE ‘utf8mb4_unicode_ci’

2.表字段层面
统一关联表的两个关联字段的排序规则,如将第一张表中A字段排序规则改为 utf8mb4_unicode_ci 即可
ALTER TABLE 表名 MODIFY 字段 字段类型 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

扩展

若要修改表中所有字段的排序规则,可以采用如下方式:
1.首先需要查出表所有字段的全部信息

SHOW FULL COLUMNS FROM 表名;

在这里插入图片描述
得到该表需要修改的字段排序规则, 比如要将该表所有以utf8_general_ci排序规则的字段均更改为utf8_unicode_ci排序规则;

2.修改表字段的排序规则

SELECT CONCAT(‘ALTER TABLE ‘, TABLE_SCHEMA,’.’,TABLE_NAME, ’ MODIFY COLUMN ‘,COLUMN_NAME,’ ‘,COLUMN_TYPE,’ COLLATE utf8_unicode_ci;') ‘修正SQL’
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = ‘数据库名’ AND TABLE_NAME = ‘表名’ AND COLLATION_NAME = ‘utf8_general_ci’;

在这里插入图片描述
贴出修正SQL执行即可修改成功;

同理,若要修改表字段的字符集,采用如下方式:
先查看表的所有字段信息

select * from information_schema.COLUMNS where TABLE_NAME = ‘表名’;

在这里插入图片描述
得到字符集后,按照上述修改排序规则的修正SQL一样得到修改字符集的修正SQL(只需加上一个CHARACTER_SET_NAME = ‘修改后的字符集’ 的过滤条件),然后执行即可修改成功;

二、Azure Databricks 写数据到Mysql表,抛出异常java.sql.BatchUpdateException: Duplicate entry ‘xxx’ for key ‘PRIMARY’

问题背景:线上有一个数据迁移需求,需要用Databricks将数据保存在MySQL业务表。由于直接将数据save到业务主表存在一定的风险,所以采用先将其save到生产环境的staging临时表,然后再从临时表merge到业务主表。并且业务表的表结构存在一个主键索引和一个唯一索引以及其他普通索引,然后我这边将业务表的表结构复制为临时表的表结构(仅去掉其他普通索引,保留主键索引和唯一索引),然后在Databricks上通过spark将数据写到Mysql,Job执行一段时间后不断的出现问题标题所示的异常…

在这里插入图片描述

问题分析:Spark通过多个分区写DataFrame数据时,会根据对应数据表的各个索引进行校验,校验如果出现主键或唯一键重复了,spark执行插入操作时就会抛出Duplicate entry异常(本例中后面确认过待插入的数据确实存在唯一键重复的问题)

解决方案:
1.业务数据问题:通过移除数据表的唯一键约束,协同业务方说明重复键问题,后续删除重复数据以避免Merge业务主表时异常
2.忽略异常:可通过配置spark的option参数,如option(“ignore”,“true”)忽略重复键冲突或数据类型错误等异常信息,同时指定写入追加模式mode(“append”)配合使用忽略异常信息

扩展

Spark批量写入MySQL的注意事项:
1.可指定一定的分区提高并发度,如repartition(12),spark会给每个分区开启一个事务处理一个批次的数据
2.可指定数据写入的批次大小,如option(“batchsize”,10000),spark会往MySQL的一个事务中写入10000条数据后再commit事务,另外需要配合option(“isolationLevel”,“NONE”),即无需指定隔离级别

三、com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting…

问题背景:线上AKS某个微服务出现频繁的Pod重启现象导致影响服务业务处理功能,随后也尝试重启了一下,没有明显效果,并且查看了近两天的容器的CPU使用率和内存工作集状态,发现CPU使用率都是爆红的,但是内存工作集是正常的,于是查看了容器服务日志,发现log一直卡在com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting…不动了(显然是数据库连接池没有初始化完成)并且容器状态原因是“CrashLoopBackOff”,同时检查了连接相同库的其他微服务并没有出现频繁重启的现象
在这里插入图片描述
问题分析:可能是由于分配Pod的容器内存不足导致服务失败或运行过程中发生OOM触发AKS的Pod重启
问题排查:通过在AKS配置文件中添加从不重启策略(deployment -> podTemplate -> restartPolicy: Never)后重启服务,过一段时间后查看容器的状态为“OOMKilled”,很显然是容器分配的内存不足导致的
问题解决:将原来pod资源分配memory limits 从600Mi调整到1200Mi(deployment -> podTemplate -> resources -> limits -> cpu & memory),重启服务
在这里插入图片描述
验证服务日志:服务正常!
在这里插入图片描述
PS:感觉AKS上容器监控有点不太准,导致不能及时发现是OOM问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于MySQL线上数据库配置,以下是一些常见的配置项和建议: 1. 字符集配置: - 设置字符集为UTF-8(或者utf8mb4),以支持存储和处理各种语言的数据。 - 在my.cnf配置文件中的[mysqld]段中添加如下配置: ``` character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci ``` 2. 缓冲配置: - 配置适当的缓冲区来提高性能。常见的缓冲区包括: - key_buffer_size:索引缓冲区大小,用于存储索引数据。 - innodb_buffer_pool_size:InnoDB引擎的缓冲池大小,用于存储数据和索引。 - 根据服务器的可用内存和数据库的大小进行调整。 3. 连接和并发配置: - 配置最大连接数(max_connections)来限制同时连接到数据库的客户端数量。根据实际需求和服务器资源进行调整。 - 配置适当的线程缓冲区大小(thread_cache_size)以提高连接性能。 4. 查询优化配置: - 配置查询缓存(query_cache)来缓存查询结果,以提高性能。但请注意,对于高并发写入的场景,查询缓存可能会导致性能下降。 - 配置适当的innodb_buffer_pool_instances参数,以实现更好的并发性能。 5. 日志配置: - 配置适当的日志记录级别,以便在需要时进行故障排查和性能分析。 - 根据需要启用慢查询日志(slow query log),以帮助识别和优化性能较差的查询。 注意:以上只是一些常见的配置项和建议,具体的配置可能会根据业务需求和服务器资源进行调整。在进行任何配置更改之前,建议先备份数据库,并在测试环境中进行验证。此外,确保了解每个配置项的含义和影响,以避免潜在的问题或安全风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值