江湖救急篇:slave 复制出错

本文分享了一次MySQL主从复制出现故障后的处理经验。详细介绍了如何使用sql_slave_skip_counter参数来解决复制过程中因误删临时表导致的问题,并推荐了几篇相关文章帮助理解此参数的正确用法。


事情是这样的,我们DBA组有位同学误删了备库的一个临时表,导致复制出错



老大给力,江湖救急。

关于该参数,淘宝丁奇写了篇文章还不错:MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点

还有360的杨挺也有一篇:sql_slave_skip_counter 介绍

这2篇文章看下大概理解了


最后说下,保险点的做法是 N恒等于 1,比较不容易出错 :-)


当然跳得多了主从的不一致性的gap就越大

如果对一致性要求较严格的业务不妨试下pt-table-checksum+pt-table-sync或mysqlreplsync


Good Luck!

你遇到的错误: > **类 "arduino::esp32::spi::slave::Slave" 没有成员 "setFrequency"** 是完全正确的!这是因为在当前广泛使用的 `ESP32SPISlave` 库(如 [me-no-dev/ESP32SPISlave](https://github.com/me-no-dev/ESP32SPISlave))中,**`ESP32SPISlave` 类确实没有 `setFrequency()` 成员函数**。 --- ### ❌ 为什么会出现这个问题? 你在代码中调用了: ```cpp slave.setFrequency(1000000); ``` 但查看源码可知: 👉 **ESP32 的 SPI Slave 模式下,时钟频率是由主机(Master)决定的,从机无法主动设置自己的 SPI 频率!** 也就是说: > ✅ **SPI 从机只能“跟随”主机提供的 SCK 信号,不能自己生成 SCK。因此 `setFrequency` 对从机无意义,也不支持。** 所以这个函数根本不存在于 `ESP32SPISlave` 类中,编译报错是合理的。 --- ## ✅ 正确理解与解决方案 ### ✅ 1. 删除 `setFrequency()` 调用 直接删除这一行即可: ```cpp // ❌ 错误:从机不能设置频率 slave.setFrequency(1000000); // ← 这行会报错! ``` ✅ 改为注释说明: ```cpp // 注意:SPI 从机无法设置频率,速率由主机端 SCK 决定 // 请确保主机 SPI 时钟不超过 ESP32 Slave 支持的范围(通常 ≤ 10MHz) ``` --- ### ✅ 2. 确保主机和从机工作在兼容速率 虽然从机不能设置频率,但它有一个 **最大可接受频率限制**。你需要保证: | 主机 SPI Clock | 是否推荐 | |----------------|----------| | ≤ 1 MHz | ✅ 极其稳定,强烈推荐用于调试 | | 1~4 MHz | ✅ 可靠通信 | | 8~10 MHz | ⚠️ 可能不稳定,需良好布线 | | >10 MHz | ❌ 很容易出错 | 📌 所以你应该在 **主机端控制 SPI 频率**,例如使用 Arduino Master: ```cpp // 主机示例(Arduino Uno / ESP32 Master) SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE3)); digitalWrite(SS, LOW); SPI.transfer(buffer, len); digitalWrite(SS, HIGH); SPI.endTransaction(); ``` --- ### ✅ 3. 修改后的初始化函数(去掉非法调用) ```cpp void spi_slave_server_init(void) { // 配置 SPI Slave 参数 slave.setDataMode(SPI_MODE3); // CPOL=1, CPHA=1 slave.setQueueSize(1); // 设置队列大小 slave.begin(HSPI, MY_SCK, MY_MISO, MY_MOSI, MY_CS); // 设置 CS 引脚为输入(外部控制) pinMode(MY_CS, INPUT); // 可选上拉 // pinMode(MY_CS, INPUT_PULLUP); // 创建高优先级任务处理 SPI 通信 xTaskCreate( spi_slave_task, "spi_slave_task", 10240, NULL, 3, NULL ); Serial.println("SPI Slave initialized."); Serial.println("Note: SPI frequency is controlled by MASTER, not slave."); Serial.println("Ensure master uses <= 10MHz for stability (<=1MHz recommended)."); } ``` --- ### ✅ 4. 如何提高 SPI Slave 稳定性?(替代方案) 既然不能设置频率,你可以通过以下方式提升可靠性: | 方法 | 说明 | |------|------| | 🔹 使用 MODE3 或 MODE0 | 推荐 MODE3 (`CPOL=1, CPHA=1`),最常用 | | 🔹 添加上拉电阻 | 在 SCK、CS 上加 4.7kΩ 上拉,防止浮空 | | 🔹 缩短走线距离 | 尤其高速通信时避免干扰 | | 🔹 主机加 delay | 每次 transaction 后加微小延时(如 `delayMicroseconds(10)`) | | 🔹 固定 buffer 大小 | 建议使用 64 字节对齐传输 | --- ### ✅ 补充:ESP32 SPI Slave 支持的最大速率 根据官方文档和实测数据: | 条件 | 最大稳定速率 | |------|-------------| | 开发板直连(杜邦线) | ~8–10 MHz | | PCB 良好布线 | 可达 20 MHz | | 长线或干扰环境 | 建议 ≤ 1 MHz | ⚠️ 超过极限会导致: - 数据错乱 - 接收字节数不全 - TX 缓冲错位(表现为“回传接收数据”) --- ### ✅ 总结 | 问题 | 解决方案 | |------|-----------| | `setFrequency` 不存在 | ✅ 删除该调用,它是无效且非法的 | | 从机如何控制速度? | ❌ 不能;✅ 由主机决定 | | 如何保证稳定通信? | ✅ 主机设为 1MHz~4MHz,使用 MODE3,良好接线 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值