2021-05-20

数据库无缝迁移:分库分表与数据无损同步

分库分表-数据无损迁移

1、确定一个时间点(或binlog位置),在此之前的数据全量迁移,再dts中记录增量数据

2、当存量数据同步完成后,开始同步时间点之后的增量数据

3、当增量数据追上最新数据后,开始对原表和分表进行双写

4、停止增量数据同步,依靠双写保证数据一致性

5、切换读到分表上,继续进行双写,此时原表作为灾备

6、分表进行数据读写验证,无误后全量切到分表

### 出现空值的原因 - **分区首行**:在使用窗口函数 `max(edt) over(partition by id order by stt rows between UNBOUNDED PRECEDING and 1 PRECEDING)` 时,对于每个 `id` 分区内的第一行数据,`rows between UNBOUNDED PRECEDING and 1 PRECEDING` 表示从分区的起始行到当前行的前一行。由于第一行没有前一行,所以 `max(edt)` 在此情况下没有可比较的行,因此会返回空值。 - **数据本身为空**:如果在分区内除了当前行之外,其他行的 `edt` 字段值都为 `NULL`,那么 `max()` 函数在计算时会将这些 `NULL` 值排除,由于没有有效的非空值可供比较,也会返回 `NULL`。 ### 某行出现更大日期值的原因 - **数据顺序**:窗口函数是按照 `order by stt` 对分区内的数据进行排序的。如果在分区内,后面行的 `edt` 值本身就比前面行的 `edt` 值大,那么随着窗口的移动,`max(edt)` 会不断更新为更大的日期值。例如,在同一个 `id` 分区内,前面行的 `edt` 是较早的日期,而后面行的 `edt` 是较晚的日期,当窗口移动到后面行时,`max(edt)` 就会更新为这个较晚的日期。 - **数据异常**:可能是数据录入错误或者系统异常导致某行的 `edt` 值出现了不合理的大日期。例如,可能在录入促销结束日期时,输入了一个错误的未来日期。 示例代码如下,模拟了该查询过程: ```sql -- 创建示例表 CREATE TABLE test4 ( id INT, stt DATE, edt DATE ); -- 插入示例数据 INSERT INTO test4 (id, stt, edt) VALUES (1, '2023-01-01', '2023-01-10'), (1, '2023-01-15', '2023-01-20'), (2, '2023-02-01', '2023-02-10'), (2, '2023-02-15', '2023-02-20'); -- 执行查询 SELECT id, stt, edt, MAX(edt) OVER (PARTITION BY id ORDER BY stt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS maxEdt FROM test4; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值