近期讨论过的一些MySQL问题

来源:这里教程网 时间:2026-03-01 17:36:03 作者:

来源:MySQL数据库联盟

讨论了一些MySQL相关的问题,这里就来总结一下,大家也可以一起在留言区讨论。

1 Xtrabackup是不是一直都用的ftwrl,有没有用到backup lock

先说答案:5.6+,是ftwrl(FLUSH TABLES WITH READ LOCK),8.0是LOCK INSTANCE FOR BACKUP

判断这类问题,有两个解决思路:

一个是查看官方文档:

https://docs.percona.com/percona-xtrabackup/8.0/how-xtrabackup-works.html

有下面截图这一段:

还有一个方法:

通过实验验证,备份过程开启general log,看会执行哪些命令。

2 Orch切换主从拓扑之后,为什么找不到复制用户?

Orchestrator切换,某个从库会报错:

Fatal error: Invalid (empty) username when attempting to connect to the master server. Connection attempt terminated

查了Github的issues,发现也有人遇到同样的问题

https://github.com/openark/orchestrator/issues/323

原因:

master_info_repository 没设置成 'TABLE'

解决办法:

master_info_repository设置成table

实际在Orch的文档中也提过:

https://github.com/openark/orchestrator/blob/master/docs/install.md

但也没说不配置成table问题的严重性。

大家在使用Orch的时候,需要注意这个细节。

3 获取慢查询有哪些方案

方案一:ELK

Elasticsearch, Logstash, and Kibana

方案二:PMM

这个方案可以跳转之前的一篇文章:

PMM 监控 MySQL

方案三:ClickTail+ClickHouse+Grafana

这个方案可以跳转之前的两篇文章:

ClickTail+CH 实现 MySQL 慢查询实时展示

使用 Grafana 展示 ClickHouse 数据

4 线上有张表数据100多万,700多M,但是磁盘碎片有4个T,这种能直接drop掉吗 ?还是有什么方式可以删掉?

不能直接删除,要当成4T的表处理,给数据文件.ibd创建一个硬链接,这样drop就很快了。

过程为:

ln table_name.ibd table_name.ibd.bak

在drop表

drop table table_name;

最后再删除物理文件:

for i in `seq 4096 -1 1 ` ;   do sleep 1;  truncate  -s  ${i}G  table_name.ibd.bak; done rm  -f  table_name.ibd.bak

然,如果是云上RDS,就需要找云厂商,研究怎么安全的删除,毕竟我们不能操作机器。

5 MySQL binlog里面的时间,有些不是顺序的。一般在什么情况下发生?是因为主库并发执行的事务原因吗?

我做了一个这样的实验:

最终解析之后,就出现了下图这种情况:

Binlog记录位置靠后的,时间点还靠前。

从库其实也一样的。

也就是并发事务,先执行SQL的,后面再提交(什么时候提交,什么时候记录Binlog),可能会出现时间在前面的事务,Binlog位置在后面,看起来像乱序了。

6 keepalived+主从,如果发生了vip漂移,那老的主启动,是不是不能同步数据了,这样会不会导致数据不一致?

一般建议是keepalived+双主,也就是两套数据库互为主备,这样及时切换了,反向还是同步的,那原来的主还是一直同步新主数据的。

但是一般只建议用一个VIP,也就是只在一个主上写,另外,如果要避免主键冲突,建议是主从跳主键的形式,比如主的主键 1 3 5,从的主键 2 4 6。

当然,现在推荐使用其他两款高可用方案:

InnoDB Cluster,可以参考之前写的部署文档:InnoDB Cluster的部署;

Orchestrator,可以参考之前写的部署文档:Orchestrator实现MySQL故障切换。

相关推荐