OceanBase教程FG069-OceanBase迁移一致性校验实战
本文档风哥主要介绍OceanBase数据库迁移一致性校验相关知识,包括OceanBase一致性校验概念、OceanBase一致性类型、OceanBase校验方法、OceanBase校验规划、OceanBase行数校验、OceanBase内容校验、OceanBase校验和校验等内容,风哥教程参考OceanBase官方文档数据迁移、数据校验等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 OceanBase一致性校验概念
一致性校验是验证源库和目标库数据是否一致的过程,是数据迁移的关键环节。更多视频教程www.fgedu.net.cn
- 数据完整性:验证数据行数是否一致
- 数据准确性:验证数据内容是否一致
- 迁移质量:评估迁移成功率
- 业务保障:确保业务数据正确
- 风险控制:及时发现数据问题
1.2 OceanBase一致性类型
1. 结构一致性
– 表结构一致
– 索引一致
– 约束一致
– 默认值一致
2. 数据一致性
– 行数一致
– 内容一致
– 校验和一致
– 统计信息一致
3. 业务一致性
– 关联数据一致
– 汇总数据一致
– 业务规则一致
4. 一致性级别
┌─────────────────┬──────────┬─────────────────────────────┐
│ 级别 │ 精度 │ 适用场景 │
├─────────────────┼──────────┼─────────────────────────────┤
│ 行数校验 │ 低 │ 快速检查 │
│ 抽样校验 │ 中 │ 大数据量 │
│ 全量校验 │ 高 │ 关键数据 │
│ 校验和校验 │ 高 │ 全量数据 │
│ 业务校验 │ 最高 │ 最终确认 │
└─────────────────┴──────────┴─────────────────────────────┘
1.3 OceanBase校验方法
1. 行数校验
– COUNT(*)对比
– 快速检查
– 精度较低
2. 内容校验
– 抽样对比
– 全量对比
– 精度较高
3. 校验和校验
– MD5校验
– CRC32校验
– SUM校验
– 精度最高
4. 业务校验
– 关联查询
– 汇总对比
– 业务规则验证
5. 工具校验
– OMS自动校验
– pt-table-checksum
– 自定义脚本
Part02-生产环境规划与建议
2.1 OceanBase校验规划
1. 校验时机
– 全量迁移完成后
– 增量同步稳定后
– 切流前最终校验
– 切流后业务校验
2. 校验范围
– 全库校验:所有表
– 重点表校验:核心业务表
– 抽样校验:大数据量表
3. 校验资源
– CPU:预留20%
– 内存:预留20%
– 网络:预留带宽
– 时间:预留充足时间
4. 校验计划
┌─────────────────┬──────────┬─────────────────────────────┐
│ 阶段 │ 校验方式 │ 时间窗口 │
├─────────────────┼──────────┼─────────────────────────────┤
│ 全量完成后 │ 行数+抽样│ 2小时 │
│ 增量稳定后 │ 抽样 │ 30分钟 │
│ 切流前 │ 全量 │ 4小时 │
│ 切流后 │ 业务 │ 持续 │
└─────────────────┴──────────┴─────────────────────────────┘
2.2 OceanBase校验工具
1. OMS校验
– 自动校验,风哥提示:。
– 增量校验
– 差异修复
2. pt-table-checksum
– Percona工具
– 在线校验
– 并行校验
3. 自定义脚本
– 灵活定制
– 批量执行
– 结果统计
4. 工具对比
┌─────────────────┬──────────┬──────────┬─────────────────┐
│ 工具 │ 速度 │ 精度 │ 适用场景 │
├─────────────────┼──────────┼──────────┼─────────────────┤
│ OMS │ 快 │ 高 │ 在线迁移 │
│ pt-table-checksum│ 中 │ 高 │ MySQL迁移 │
│ 自定义脚本 │ 可调 │ 可调 │ 灵活场景 │
└─────────────────┴──────────┴──────────┴─────────────────┘
2.3 OceanBase校验策略
1. 分层校验
– 第一层:行数校验(快速),学习交流加群风哥微信: itpux-com。
– 第二层:抽样校验(中等)
– 第三层:全量校验(详细)
– 第四层:业务校验(最终)
2. 重点表优先
– 核心业务表优先
– 数据量小的表优先
– 关键配置表优先
3. 并行校验
– 多表并行
– 多线程并行
– 分区并行
4. 差异处理
– 记录差异
– 分析原因
– 修复数据
– 重新校验
Part03-生产环境项目实施方案
3.1 OceanBase行数校验
1. 单表行数校验
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
— 目标库行数
SELECT COUNT(*) FROM fgedudb.fgedu_order;
”
+———-+
| COUNT(*) |
+———-+,学习交流加群风哥QQ113257174。
| 10000000 |
+———-+
$ mysql -h192.168.1.100 -P3306 -uroot -p -e ”
— 源库行数
SELECT COUNT(*) FROM fgedudb.fgedu_order;
”
+———-+
| COUNT(*) |
+———-+
| 10000000 |
+———-+
# 行数一致
2. 批量行数校验
#!/bin/bash
# row_count_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
TABLES=”fgedu_order fgedu_user fgedu_product fgedu_log”
SOURCE_HOST=”192.168.1.100″
TARGET_HOST=”192.168.1.101″
echo “=== Row Count Verification ===”
echo “Time: $(date)”
echo “”
for TABLE in $TABLES; do
SOURCE_COUNT=$(mysql -h$SOURCE_HOST -e “SELECT COUNT(*) FROM fgedudb.$TABLE” | tail -1)
TARGET_COUNT=$(obclient -h$TARGET_HOST -e “SELECT COUNT(*) FROM fgedudb.$TABLE” | tail -1)
if [ “$SOURCE_COUNT” -eq “$TARGET_COUNT” ]; then
STATUS=”PASSED”
else
STATUS=”FAILED”
fi
echo “Table: $TABLE”,更多视频教程www.fgedu.net.cn。
echo ” Source: $SOURCE_COUNT”
echo ” Target: $TARGET_COUNT”
echo ” Status: $STATUS”
echo “”
done
echo “================================”
3. 行数校验报告
Table: fgedu_order
Source: 10000000
Target: 10000000
Status: PASSED
Table: fgedu_user
Source: 5000000
Target: 5000000
Status: PASSED
Table: fgedu_product
Source: 100000
Target: 100000
Status: PASSED
3.2 OceanBase内容校验
1. 抽样内容校验
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
— 目标库抽样
SELECT order_id, user_id, amount, order_status
FROM fgedudb.fgedu_order
WHERE order_id % 1000 = 0
ORDER BY order_id
LIMIT 100;
” > /tmp/target_sample.txt,更多学习教程公众号风哥教程itpux_com。
$ mysql -h192.168.1.100 -P3306 -uroot -p -e ”
— 源库抽样
SELECT order_id, user_id, amount, order_status
FROM fgedudb.fgedu_order
WHERE order_id % 1000 = 0
ORDER BY order_id
LIMIT 100;
” > /tmp/source_sample.txt
# 对比
$ diff /tmp/source_sample.txt /tmp/target_sample.txt
# 无输出表示一致
2. 全量内容校验
#!/bin/bash
# full_content_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
TABLE=”fgedu_order”
BATCH_SIZE=10000
OFFSET=0
MISMATCH=0
while true; do
# 获取一批数据
SOURCE_DATA=$(mysql -e ”
SELECT order_id, user_id, amount, order_status
FROM fgedudb.$TABLE
ORDER BY order_id
LIMIT $BATCH_SIZE OFFSET $OFFSET;from DB视频:www.itpux.com。
“)
TARGET_DATA=$(obclient -e ”
SELECT order_id, user_id, amount, order_status
FROM fgedudb.$TABLE
ORDER BY order_id
LIMIT $BATCH_SIZE OFFSET $OFFSET;
“)
if [ -z “$SOURCE_DATA” ]; then
break
fi
if [ “$SOURCE_DATA” != “$TARGET_DATA” ]; then
MISMATCH=$((MISMATCH + 1))
echo “Mismatch at offset $OFFSET”
fi
OFFSET=$((OFFSET + BATCH_SIZE))
echo “Checked $OFFSET rows, mismatches: $MISMATCH”
done
echo “Total mismatches: $MISMATCH”
3. 关键字段校验
$ obclient -e ”
SELECT
‘Source’ as source,
SUM(order_id) as sum_id,
SUM(amount) as sum_amount,
COUNT(DISTINCT user_id) as distinct_users
FROM mysql.fgedudb.fgedu_order
UNION ALL
SELECT
‘Target’ as source,
SUM(order_id) as sum_id,
SUM(amount) as sum_amount,
COUNT(DISTINCT user_id) as distinct_users
FROM fgedudb.fgedu_order;
”
3.3 OceanBase校验和校验
1. MD5校验
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
— 目标库MD5
SELECT
MD5(GROUP_CONCAT(
order_id, user_id, amount, order_status
ORDER BY order_id
SEPARATOR ‘|’
)) as checksum
FROM fgedudb.fgedu_order;
”
+———————————-+
| checksum |
+———————————-+
| a1b2c3d4e5f678901234567890abcdef |
+———————————-+
$ mysql -h192.168.1.100 -P3306 -uroot -p -e ”
— 源库MD5
SELECT
MD5(GROUP_CONCAT(
order_id, user_id, amount, order_status
ORDER BY order_id
SEPARATOR ‘|’
)) as checksum
FROM fgedudb.fgedu_order;
”
+———————————-+
| checksum |
+———————————-+
| a1b2c3d4e5f678901234567890abcdef |
+———————————-+
# MD5一致
2. CRC32校验
$ obclient -e ”
SELECT
SUM(CRC32(CONCAT(order_id, ‘|’, user_id, ‘|’, amount))) as crc_sum
FROM fgedudb.fgedu_order;
”
+————+
| crc_sum |
+————+
| 1234567890 |
+————+
$ mysql -e ”
SELECT
SUM(CRC32(CONCAT(order_id, ‘|’, user_id, ‘|’, amount))) as crc_sum
FROM fgedudb.fgedu_order;
”
+————+
| crc_sum |
+————+
| 1234567890 |
+————+
3. 批量校验和校验
#!/bin/bash
# checksum_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
TABLES=”fgedu_order fgedu_user fgedu_product”
echo “=== Checksum Verification ===”
for TABLE in $TABLES; do
SOURCE_SUM=$(mysql -e ”
SELECT SUM(CRC32(CONCAT_WS(‘|’, *)))
FROM fgedudb.$TABLE;
” | tail -1)
TARGET_SUM=$(obclient -e ”
SELECT SUM(CRC32(CONCAT_WS(‘|’, *)))
FROM fgedudb.$TABLE;
” | tail -1)
if [ “$SOURCE_SUM” = “$TARGET_SUM” ]; then
STATUS=”PASSED”
else
STATUS=”FAILED”
fi
echo “Table: $TABLE – $STATUS”
done
echo “===============================”
Part04-生产案例与实战讲解
4.1 OceanBase全量校验案例
– 数据量:1TB
– 表数量:100张
– 要求:全量校验,100%一致
# 校验方案
1. 校验脚本
#!/bin/bash
# full_verification.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
DB_NAME=”fgedudb”
REPORT_FILE=”/tmp/verification_report_$(date +%Y%m%d_%H%M%S).txt”
echo “=== Full Verification Report ===” > $REPORT_FILE
echo “Database: $DB_NAME” >> $REPORT_FILE
echo “Time: $(date)” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 获取所有表
TABLES=$(obclient -e ”
SELECT table_name
FROM information_schema.tables
WHERE table_schema = ‘$DB_NAME’;
” | tail -n +2)
TOTAL_TABLES=0
PASSED_TABLES=0
FAILED_TABLES=0
for TABLE in $TABLES; do
TOTAL_TABLES=$((TOTAL_TABLES + 1))
echo “Verifying table: $TABLE”
# 行数校验
SOURCE_COUNT=$(mysql -e “SELECT COUNT(*) FROM $DB_NAME.$TABLE” | tail -1)
TARGET_COUNT=$(obclient -e “SELECT COUNT(*) FROM $DB_NAME.$TABLE” | tail -1)
if [ “$SOURCE_COUNT” -eq “$TARGET_COUNT” ]; then
# 校验和校验
SOURCE_SUM=$(mysql -e ”
SELECT SUM(CRC32(CONCAT_WS(‘|’, *)))
FROM $DB_NAME.$TABLE;
” | tail -1)
TARGET_SUM=$(obclient -e ”
SELECT SUM(CRC32(CONCAT_WS(‘|’, *)))
FROM $DB_NAME.$TABLE;
” | tail -1)
if [ “$SOURCE_SUM” = “$TARGET_SUM” ]; then
STATUS=”PASSED”
PASSED_TABLES=$((PASSED_TABLES + 1))
else
STATUS=”FAILED (checksum)”
FAILED_TABLES=$((FAILED_TABLES + 1))
fi
else
STATUS=”FAILED (row count)”
FAILED_TABLES=$((FAILED_TABLES + 1))
fi
echo “Table: $TABLE – $STATUS” >> $REPORT_FILE
done
echo “” >> $REPORT_FILE
echo “Summary:” >> $REPORT_FILE
echo ” Total: $TOTAL_TABLES” >> $REPORT_FILE
echo ” Passed: $PASSED_TABLES” >> $REPORT_FILE
echo ” Failed: $FAILED_TABLES” >> $REPORT_FILE
echo ” Success Rate: $((PASSED_TABLES * 100 / TOTAL_TABLES))%” >> $REPORT_FILE
echo “Report saved to: $REPORT_FILE”
2. 校验结果
Summary:
Total: 100
Passed: 100
Failed: 0
Success Rate: 100%
# 全量校验通过
4.2 OceanBase抽样校验案例
– 数据量:10TB
– 表数量:500张
– 要求:抽样校验,快速验证
# 校验方案
1. 抽样校验脚本
#!/bin/bash
# sample_verification.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
DB_NAME=”fgedudb”
SAMPLE_RATE=0.01 # 1%抽样
REPORT_FILE=”/tmp/sample_verification_$(date +%Y%m%d_%H%M%S).txt”
echo “=== Sample Verification Report ===” > $REPORT_FILE
echo “Database: $DB_NAME” >> $REPORT_FILE
echo “Sample Rate: ${SAMPLE_RATE}%” >> $REPORT_FILE
echo “Time: $(date)” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 获取大表列表
LARGE_TABLES=$(obclient -e ”
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema = ‘$DB_NAME’
AND table_rows > 1000000
ORDER BY table_rows DESC;
” | tail -n +2)
for TABLE_INFO in $LARGE_TABLES; do
TABLE=$(echo $TABLE_INFO | cut -d’|’ -f1)
ROWS=$(echo $TABLE_INFO | cut -d’|’ -f2)
SAMPLE_SIZE=$(echo “$ROWS * $SAMPLE_RATE” | bc | cut -d’.’ -f1)
echo “Verifying table: $TABLE (rows: $ROWS, sample: $SAMPLE_SIZE)”
# 随机抽样校验
SOURCE_SAMPLE=$(mysql -e ”
SELECT order_id, user_id, amount
FROM $DB_NAME.$TABLE
ORDER BY RAND()
LIMIT $SAMPLE_SIZE;
” | md5sum)
TARGET_SAMPLE=$(obclient -e ”
SELECT order_id, user_id, amount
FROM $DB_NAME.$TABLE
ORDER BY RAND()
LIMIT $SAMPLE_SIZE;
” | md5sum)
if [ “$SOURCE_SAMPLE” = “$TARGET_SAMPLE” ]; then
STATUS=”PASSED”
else
STATUS=”FAILED”
fi
echo “Table: $TABLE – $STATUS” >> $REPORT_FILE
done
echo “Report saved to: $REPORT_FILE”
2. 抽样结果
Table: fgedu_order – PASSED (sample: 100000 rows)
Table: fgedu_log – PASSED (sample: 50000 rows)
Table: fgedu_user – PASSED (sample: 10000 rows)
# 抽样校验通过
4.3 OceanBase增量校验案例
– 在线迁移
– 增量同步中
– 需要持续校验
# 校验方案
1. 增量校验脚本
#!/bin/bash
# incremental_verification.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
DB_NAME=”fgedudb”
CHECK_INTERVAL=300 # 5分钟
echo “=== Incremental Verification ===”
echo “Started at: $(date)”
echo “Press Ctrl+C to stop”
echo “”
while true; do
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE=”/tmp/incr_verify_$TIMESTAMP.log”
echo “[$TIMESTAMP] Checking…”
# 检查最近5分钟的数据
SOURCE_COUNT=$(mysql -e ”
SELECT COUNT(*) FROM $DB_NAME.fgedu_order
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 5 MINUTE);
” | tail -1)
TARGET_COUNT=$(obclient -e ”
SELECT COUNT(*) FROM $DB_NAME.fgedu_order
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 5 MINUTE);
” | tail -1)
if [ “$SOURCE_COUNT” -eq “$TARGET_COUNT” ]; then
echo “[$TIMESTAMP] PASSED – Source: $SOURCE_COUNT, Target: $TARGET_COUNT” >> $LOG_FILE
else
echo “[$TIMESTAMP] FAILED – Source: $SOURCE_COUNT, Target: $TARGET_COUNT” >> $LOG_FILE
echo “ALERT: Data mismatch detected!” | mail -s “Verification Alert” dba@fgedu.net.cn
fi
sleep $CHECK_INTERVAL
done
2. 监控结果
[20240120_100000] PASSED – Source: 1000, Target: 1000
[20240120_100500] PASSED – Source: 1200, Target: 1200
[20240120_101000] PASSED – Source: 1100, Target: 1100
# 增量校验正常
Part05-风哥经验总结与分享
5.1 OceanBase一致性校验最佳实践
1. 分层校验
– 第一层:行数校验(快速筛选)
– 第二层:抽样校验(中等精度)
– 第三层:校验和校验(高精度)
– 第四层:业务校验(最终确认)
2. 重点优先
– 核心业务表优先
– 数据量小的表优先
– 配置表优先
3. 并行执行
– 多表并行校验
– 分区并行校验
– 合理利用资源
4. 差异处理
– 记录差异详情
– 分析差异原因
– 修复差异数据
– 重新校验确认
5. 持续监控
– 增量持续校验
– 定期全量校验
– 异常及时告警
5.2 OceanBase差异处理
1. 差异分析
#!/bin/bash
# analyze_discrepancy.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
TABLE=”fgedu_order”
# 找出差异行
mysql -e ”
SELECT order_id
FROM fgedudb.$TABLE
WHERE order_id NOT IN (
SELECT order_id FROM fgedudb.$TABLE
);
” > /tmp/missing_in_target.txt
obclient -e ”
SELECT order_id
FROM fgedudb.$TABLE
WHERE order_id NOT IN (
SELECT order_id FROM mysql.fgedudb.$TABLE
);
” > /tmp/extra_in_target.txt
# 找出内容差异
mysql -e ”
SELECT a.order_id
FROM fgedudb.$TABLE a
JOIN fgedudb.$TABLE b ON a.order_id = b.order_id
WHERE a.amount != b.amount;
” > /tmp/content_diff.txt
2. 差异修复
# 修复缺失数据
for ORDER_ID in $(cat /tmp/missing_in_target.txt); do
mysql -e ”
SELECT * FROM fgedudb.fgedu_order
WHERE order_id = $ORDER_ID;
” | obclient -e ”
INSERT INTO fgedudb.fgedu_order VALUES (…);
”
done
# 修复内容差异
for ORDER_ID in $(cat /tmp/content_diff.txt); do
mysql -e ”
SELECT * FROM fgedudb.fgedu_order
WHERE order_id = $ORDER_ID;
” | obclient -e ”
UPDATE fgedudb.fgedu_order
SET amount = …
WHERE order_id = $ORDER_ID;
”
done
3. 重新校验
# 修复后重新校验
./row_count_check.sh
./checksum_check.sh
5.3 OceanBase自动化校验
1. 定时校验任务
#!/bin/bash
# auto_verification.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# 添加到crontab
# 0 2 * * * /ob/scripts/auto_verification.sh
DATE=$(date +%Y%m%d)
REPORT_DIR=”/ob/verification_reports”
mkdir -p $REPORT_DIR
REPORT_FILE=”$REPORT_DIR/verification_$DATE.txt”
echo “=== Daily Verification Report ===” > $REPORT_FILE
echo “Date: $(date)” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 执行校验
./row_count_check.sh >> $REPORT_FILE 2>&1
./checksum_check.sh >> $REPORT_FILE 2>&1
# 发送报告
mail -s “Daily Verification Report – $DATE” dba@fgedu.net.cn < $REPORT_FILE
2. 校验监控面板
#!/bin/bash
# verification_dashboard.sh
echo "=== Verification Dashboard ==="
echo "Last Update: $(date)"
echo ""
# 显示最近校验结果
for REPORT in $(ls -t /ob/verification_reports/*.txt | head -5); do
echo "Report: $(basename $REPORT)"
grep "Success Rate" $REPORT
echo ""
done
3. 告警集成
# 校验失败时发送告警
if grep -q "FAILED" $REPORT_FILE; then
echo "Verification failed, sending alert..."
echo "Verification failed, please check $REPORT_FILE" | \
mail -s "[ALERT] Verification Failed" dba@fgedu.net.cn
fi
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
