鸿蒙开发者必修:MySQL运维设计实战
|
跟老板拍桌子。 去年春晚那会儿,MySQL 从凌晨两点开始丢连接,不是崩,是“礼貌性失联”——客户端收不到 ErrCode,只看见 read timeout,像被温柔掐断气管。我查 binlog 指针位置,发现主库在写,从库在假装同步,而鸿蒙那边发来的请求里还夹着个 timestamp=1704067200000 的 header,我盯着它看了四分钟,没敢动。这不是数据库问题,这是协议层在和我们打哑谜。 我说“鸿蒙开发者必修:MySQL运维设计实战”,不是夸它讲得多好,是说它活下来了——优胜劣汰。去年十二月我们上线的 HarmonyOS App,连着两周半夜三点收到 DTS 同步延迟报警,PM 冲进来问“是不是你们改了索引”,后端刚开口说“没动 DDL”,我顺手点开他本地 MySQL 客户端窗口,发现 history 里有条 set session sql_mode='';他根本不知道自己在干啥。但那个课里第十七页右下角,印着一行灰字:“客户端 sql_mode 与服务端不一致时,INSERT ... ON DUPLICATE KEY UPDATE 可能静默降级为 INSERT IGNORE”。就这一句,没人讲原理,就一句结果。我们当天下午全组把 .my.cnf 改了,删了三行注释,加了一行 explicit_defaults_for_timestamp=ON。真管用。 我原以为鸿蒙只管 UI 层的 LiveData 和 DataAbility 跳转顺序,结果他们连 mysql_config_editor 的 credential path 权限校验逻辑都抄进了 devicemodel 仓库的 configloader 里。我翻 commit 记录看到有个提交标题写着“Fix: prevent connection leak when host resolves to IPv6 but bind-address is IPv4”,作者是个叫 ChenX 的前端,签名底下还带了个 emoji —— ????。我点开 diff,发现他在 connection pool 初始化前多塞了一个 getaddrinfo() 预检,而这个预检……根本没用。但他写的注释里写着“参考 MySQL 8.0.33 Client Library 实现”,我去翻 C++ client source,果然有这玩意。只是人家放在 debug build 下。他给搬进 release 了。可我没法说他错——因为确实没炸。 桌面那个没关的录屏还在跑,画面左下角显示 02:17:43,音轨里是我自己的声音:“你先别 reset slave,等等看 relay_log_pos 是不是卡在 event header。” 声音很稳,其实我左手在抖。Lighthouse 跑分截图发到群里没人回,是下午三点发的,群里最后一条是前端发的 GIF:一只猫按键盘,字幕是“DDL 执行中,请稍候”。没人笑,也没人问怎么了。 CDN 账单这事得提一嘴。上个月账单暴涨四倍,不是缓存击穿,是鸿蒙客户端发的 /api/v1/query?_cache_bypass=true 带了 38 个 query param,其中 17 个是 UUID 格式但值全一样,我们 Nginx 日志里搜出来一共 247 万次。排查到第三天,后端才想起来——这是他们调用 DataAbility.query 时传进来的 Bundle 参数,自动序列化成 URL Query,且默认开启 force-encode。我跟产品吵完那晚,坐在工位上把 mysqltuner.pl 改了两行,让它也扫 URI 长度分布。现在每晚 1 点半跑一次,结果邮件发到 ops 邮箱,但没抄 PM。这事我说不准,可能他们根本不需要知道。
文章配图,仅供参考 对面工程师换了一根充电线,白的,不是原来那根黑的。他插上之后笔记本风扇声小了半档。我就盯着那接口看了十秒,忽然意识到:他们连 mysql.sock 路径都能配成 /data/data/ohos.app.db/mysqld.sock,凭什么不能把 socket buffer size 默认设成 256KB?这个我敢打包票——他们就是试出来的。去年双十一压测时,有人手动 dd if=/dev/zero of=/dev/shm/mysql.sock bs=256k count=1024,然后发现握手延迟掉了十八毫秒。没人记文档,但代码里埋着注释:“@see test_buffer_size_tuning_on_harmonyos_arm64_v3”。 勾选合并请求的时候,我点了三次确认:第一次弹窗提醒“包含未审核 SQL Review”,我点忽略;第二次弹窗说“目标分支保护规则将被绕过”,我输密码;第三次直接跳 GitHub Actions,跑的不是 CI,是他们自建的 mysql-schema-compat-checker —— 它会真连测试库,用 explain format=json 把 CREATE TABLE 语句过一遍,看 key_len 是不是超过三百七十二 KB。这玩意没开源,但我们能看日志。它失败了两次,一次是 enum 字段用了中文枚举值(‘已支付’、‘已发货’),另一次是 timestamp 默认值写了 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,而鸿蒙 SQLite runtime 不支持双 CURRENT_TIMESTAMP。这两处都没进 prod,但……谁在 review?不是 DBA,是那个叫 ChenX 的前端。他 PR 描述里写:“fix schema compat: move status enum to int, drop double ts default.” 就这一句,没截图,没链接,没 reference。我点了 approve,手有点黏。 中午我倒了水,纸杯沿上有个指印,浅褐色,应该是咖啡渍干了。水烧开的时候我手机震了一下,是后端发来消息:“root 密码更新了,新密码是 root+harmony+v3。” 我回了个 OK,没问他为什么非得加 v3。v3 是什么?API 版本?内核版本?还是他们上周重装开发机时顺手改的 BIOS 设置?我不知道。但我知道今天不能再用旧密码连 staging,不然 show processlist 里全是 Sleep 状态却占着 thread_id 不放的连接。这事我就不深挖了。 所以你看,“鸿蒙开发者必修:MySQL运维设计实战”,它根本不是课。它是张罚单,贴在 DevOps 流水线最后一道 gate 上。你不修 schema 兼容,它不让你 deploy;你不压 query string 长度,它不给你 cache hit;你不把 sql_mode 对齐,它让你的 Upsert 在凌晨三点默默吞掉一百三十万条订单。优胜劣汰。就这么简单。至于剩下那些事——比如为啥我们的慢查日志里开始出现 / harmony-data-ability-sync / 这种 hint,比如为什么 mysqld 重启后第一个 error log 总是 Warning: InnoDB: page_cleaner: 1000ms intended loop took 4321ms,比如为什么昨天凌晨五点,从库突然开始执行 SET TIMESTAMP=0;——这些,我还没想好要不要修。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


网站卡顿根因揭秘:多媒体运维避坑指南
MySQL高可用架构实战:20年经验打造自动容灾方案
运维新手必避的5大服务器配置坑,第3个90%人中招
Windows多媒体站点权限配置:9年容器运维工程师的一键落地方案
5年运维实战:建站资源优化,首屏快3倍、存储省70%
边缘计算运维驱动营销与运营双轮提效37%
网站运维者必知的5大云安全防护盲区