我这里复现了这个问题,手工用 lightning tidb 模式导入报错的表仍存在这个报错,分析后是源库中部分行存在乱码字段,怀疑是半个字符导致的,备份的文件中也会把乱码导出,使用 update set col1=substr(col1,1,18) 后修复。
报错
[image]
notepad 工具打开报错行整理后
[image]
hexdump 的输出
[image]
修复过程
[image]手工用 dumpling 备份有类似的现象吗?有没有可能是连接时长的防火墙的问题。
用 explain analyze 分别看一下“正确“和”不确认“结果的执行计划。
把 raft 选举和改为在 PD 上的 etcd 选主,各有优势。pd 选主就和 ticdc 一样,高可用架构简单,对成员数量没有要求。raft 选举最小成员要求3个,优势就是和 pd 解耦可以独立,比如可以实现一个更高层次的流量调拨,多个机房的 TICDC 复制链路的上下游可以做访问控制。
权限和多机房的场景都很有现实意义。权重是 LB 的标配功能。用户有多机房的场景,可能需要多 VIP,类似 ticdc 的 cluster-id 功能,及 tidb server label 的位置“感知”,进而和 tikv server label 的 closest-replica 配置就实现流量在…
TiProxy 管理 VIP 能力是线下部署比较期望的一种能力。
不过集成 keepalived 是不是不太好的一个选择,vrrp 协议是不是太重了,新一代的 MySQL 集群管理软件都不太使用 keepalived。用 raft leader 实现一个 VIP 管理能力是不是更好?
#!/bin/bash
执行查询语句,并将结果存储到数组中
result=($(mysql -h tidb-ip -P 4000 -u root -p’’ -N -e “select TIDB_TABLE_ID from information_schema.tables where TABLE_SCHEMA=‘your_schema’”))
遍历数组
for item in “${result[@]}”
do
AUTO_ID_CACHE=$(curl -s
http://tidb-ip:status-port/schema?table_id=${item} 2>/dev/null…
K8S 环境建议使用 BACKUP CRD 的方式进行备份。
不支持自增跳变。需要改 Auto cache id。
update 带有两次列运算时行为不一致。UPDATE h
SET
h.lock_qty = h.lock_qty + 3,
h.usedable_qty=h.onhand_qty - h.lock_qty // 在mysql中用的是上面h.lock_qty = h.lock_qty + 3后的值, 而在tidb中用的更新前的值
提示的 collation 不支持,比如 mysql 8 默认的 collation utf8mb4_0900_ai_ci。
除了一个会话内相同操作多次,基本上 conn id + job id 可以定位分段的唯一执行。
BTW: K8S 环境的 POD 日志,最好用其他手段持久化一下。
还有看一下,tidb.log 在 duplicate key 报错期间的上下日志。
日志不太全,还是得看一下两个 batch 语句 start a Non-transactional DML做为起始时间 ,最后一个 jobid 做为结束时间 。
admin show ddl jobs 的 truncate 时间 ,看一下各个时间 有没有交叉。
应该还是遗留数据的问题,从切分上看,没问题。batch.txt 这个子任务前后有没有别的错误。因为执行多次,可以检查一下,truncate 前是不是上一个任务是不是确认结束了。
[2023/02/23 11:57:16.391 +08:00] [INFO] [nontransactional.go:423] [“start a Non-transactional DML”] [conn=4581018440105527369] [job=“job id: 17031, estimated size: 5000, sql: INSERT INTO sbtest.sbtestbak SELECT…
能不能看一下 tidb.log ,关键字 nontransactional.go 类似这样的日志,有没有出现边界重复。
tidb.log 日志例举如下:
[2022/12/30 09:45:53.436 +08:00] [INFO] [nontransactional.go:423] [“start a Non-transactional DML”] [conn=3074535777447707195] [job=“job id: 1, estimated size: 1000, sql: INSERT INTO `test_order`.`test_order_target` SELEC…
看一下 {clustername}-tidb → query detail → Panic And Critial Error 监控期间的曲线,是否如下图有 critical 的上升?
[binlog]需要从新的 binlog 位点重新初始化。
下游清理数据后,用 start-task --remove-meta ./task.yaml 重新发起。
DB2 上就是一个只读操作, create view 不就行了。