运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR)
「 腾讯云 TDSQLMySQL 版是在 MySQL 上做了分布式改造很多同学拿单机 MySQL 的经验直接套结果路由、读写分离、分片各种踩坑。这篇把最容易被坑的 6 个场景拆开讲命令都能直接复制建议先收一份。 」一、代理管理命令的 /*proxy*/ 只用于 3 条▲ 架构图Proxy 网关 分片 读写分离对照正文TDSQL 走 Proxy 网关有些管理命令要加/*proxy*/前缀才转给 proxy 执行但不是所有命令都加。场景命令看 proxy 帮助/*proxy*/help看 proxy 配置/*proxy*/show config看 proxy 状态/*proxy*/show status坑点/*proxy*/只用于 help / show config / show status 这 3 条。像show processlist、kill id、EXPLAIN都不加前缀——EXPLAIN无需任何前缀直接写就好。有人给 EXPLAIN 也加/*proxy*/纯属多余还容易误导。二、读写分离 hint 必须加 -c否则静默失效开了读写分离后想让某条读走备库要用/*slave*/hint。但客户端默认会剥离注释场景命令保留 hint 登录mysql -c -h proxy_ip -P 3306 -u user -p读走备库SELECT /*slave*/ * FROM orders WHERE id1;坑点/*slave*/必须加-c让客户端保留注释否则被当注释过滤读写分离静默失效——你以为读走备库了其实全走主库还查不出毛病。另外/*slave*/只对 SELECT 生效写永远走主别指望拿它把写分流。「 这块路由规则也是 TDSQL 分布式运维里常考的点搞清楚 -c 和 hint 的关系能少踩很多坑。 」三、分片键 shardkey 建表定死ALTER TABLE 改不了TDSQL 是分库分表分片键是建表时定的场景命令/规则建表指定分片键CREATE TABLE t (id int, ...) shardkeyid;主键/唯一索引必须包含分片键(广播表除外)改分片键ALTER TABLE ...不支持只能重建坑点shardkey不支持用 ALTER TABLE 改想换分片键只能重新建表导数据。而且主键和唯一索引必须包含分片键广播表除外否则建不了或路由异常。建表前一定把分片键选对。四、自动读写分离事务内读走主不是 hint 失效开了自动读写分离rw_split2后有个容易误判的点现象真相事务里查的数据走了主库预期行为不是 hint 失效非事务的普通 SELECT按读写分离策略走备库坑点自动读写分离rw_split2下事务内的读默认走主库这是设计如此不是你/*slave*/失效。别一看到事务内读走主就以为分离坏了先确认是不是在事务里。五、监控盯 Threads_running别只看连接数看实例压力连接数会骗人指标含义Threads_connected当前连接总数(含空闲)Threads_running正在执行的并发数(真实压力)坑点Threads_connected高不代表有压力——大量空闲连接也会计数。真正反映数据库忙不忙的是Threads_running监控和告警盯这个才准。六、PITR 不直接改原实例要克隆新实例导回误删数据要回滚到某时间点TDSQL 的 PITR 和单机 MySQL 不一样场景做法时间点恢复(PITR)克隆一个新实例恢复到指定时间点取回数据从克隆实例抽数导回原实例坑点TDSQL 的 PITR不直接修改原实例而是克隆一个新实例恢复到目标时间点再从克隆实例把数据抽出来导回原库。别想着像单机 MySQL 那样原地闪回那是两码事。▲ 一图速查核心规则汇总建议收藏小结TDSQLMySQL 版运维记住几条**代理管理命令/*proxy*/只用于 help/show config/show status读写分离/*slave*/必须加-c且只对 SELECT 生效分片键建表定死、ALTER TABLE改不了事务内读走主不是 hint 失效监控盯Threads_runningPITR 克隆新实例导回**。命令都在上表出问题照着敲基本能救。想系统把分布式 MySQLTDSQL吃透官方文档配合认证体系走一遍体系会比零散搜博客稳很多。先收藏省得真出事现找。