OceanBase教程FG066-OceanBase数据迁移方案实战
本文档风哥主要介绍OceanBase数据库数据迁移方案相关知识,包括OceanBase数据迁移概念、OceanBase迁移类型、OceanBase迁移挑战、OceanBase迁移规划、OceanBase离线迁移、OceanBase在线迁移、OceanBase增量同步等内容,风哥教程参考OceanBase官方文档数据迁移、OMS等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 OceanBase数据迁移概念
数据迁移是将数据从一个存储系统迁移到另一个存储系统的过程,包括结构迁移、全量迁移、增量同步等阶段。更多视频教程www.fgedu.net.cn
- 结构迁移:迁移表结构、索引、约束等
- 全量迁移:迁移历史数据
- 增量同步:同步增量数据
- 数据校验:验证数据一致性
- 切流:切换业务流量
1.2 OceanBase迁移类型
1. 按业务影响分类
┌─────────────────┬─────────────────────────────────────┐
│ 类型 │ 特点 │
├─────────────────┼─────────────────────────────────────┤
│ 离线迁移 │ 业务停机,一次性迁移 │
│ 在线迁移 │ 业务不停机,平滑迁移 │
│ 增量迁移 │ 先全量后增量,最终一致 │
└─────────────────┴─────────────────────────────────────┘
2. 按数据源分类
┌─────────────────┬─────────────────────────────────────┐
│ 类型 │ 说明 │
├─────────────────┼─────────────────────────────────────┤
│ MySQL迁移 │ 从MySQL迁移到OceanBase │
│ Oracle迁移 │ 从Oracle迁移到OceanBase │
│ OB迁移 │ OceanBase集群间迁移 │
│ 异构迁移 │ 其他数据库迁移到OceanBase │
└─────────────────┴─────────────────────────────────────┘
3. 按迁移范围分类
– 全库迁移:整个数据库迁移
– 单表迁移:单个表迁移
– 分区迁移:按分区迁移
– 租户迁移:整个租户迁移
1.3 OceanBase迁移挑战
1. 数据量大
– TB级甚至PB级数据
– 迁移时间长
– 网络带宽限制
2. 业务连续性
– 不能长时间停机
– 需要在线迁移
– 数据一致性要求
3. 数据一致性
– 源库和目标库一致
– 增量数据不丢失
– 校验机制完善
4. 回滚能力
– 迁移失败回滚
– 业务回切能力
– 数据恢复方案
5. 性能影响
– 源库性能影响
– 目标库性能影响
– 网络带宽占用
Part02-生产环境规划与建议
2.1 OceanBase迁移规划
1. 迁移评估
– 数据量评估
– 表结构评估
– 依赖关系评估
– 业务影响评估
2. 迁移方案设计
– 选择迁移类型
– 确定迁移工具
– 制定迁移计划
– 设计回滚方案
3. 迁移时间窗口
– 业务低峰期
– 预留缓冲时间
– 分阶段迁移
– 应急预案
4. 迁移团队
– DBA团队
– 开发团队
– 业务团队
– 运维团队
2.2 OceanBase资源规划
1. 源库资源
– CPU:预留20%用于迁移
– 内存:预留20%用于迁移
– 磁盘:预留迁移日志空间
– 网络:预留迁移带宽
2. 目标库资源
– OceanBase集群:3节点以上
– 存储:预留50%增长空间,风哥提示:。
– 内存:根据数据量配置
– 网络:万兆网络
3. 迁移工具资源
– OMS服务器:16核64G
– 中间件服务器:8核32G
– 存储:SSD 500GB
– 网络:千兆以上
4. 网络资源
– 源库到目标库:专线或高速网络
– 带宽:根据数据量计算
– 延迟:< 10ms
- 稳定性:99.9%
2.3 OceanBase风险规划
1. 风险识别
┌─────────────────┬──────────┬─────────────────────────────┐
│ 风险项 │ 等级 │ 应对措施 │
├─────────────────┼──────────┼─────────────────────────────┤
│ 数据丢失 │ 高 │ 备份、校验、回滚 │
│ 迁移失败 │ 中 │ 重试、分阶段、回滚 │
│ 性能影响 │ 中 │ 限流、监控、调整 │
│ 网络中断 │ 中 │ 断点续传、重试 │
│ 数据不一致 │ 高 │ 校验、修复、重传 │,学习交流加群风哥微信: itpux-com。
└─────────────────┴──────────┴─────────────────────────────┘
2. 应急预案
– 数据备份恢复
– 迁移工具重启
– 网络故障处理
– 业务回切流程
3. 回滚方案
– 数据回滚
– 配置回滚
– 业务回切
– 通知机制
Part03-生产环境项目实施方案
3.1 OceanBase离线迁移
1. 迁移前准备
– 停止业务写入
– 备份源库数据
– 检查目标库环境
– 准备迁移工具
2. 结构迁移
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
— 创建目标表
CREATE TABLE fgedudb.fgedu_order (
order_id BIGINT PRIMARY KEY,
user_id BIGINT,
amount DECIMAL(18,2),
order_status TINYINT,学习交流加群风哥QQ113257174。
create_time TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_create_time (create_time)
) PARTITION BY HASH(order_id) PARTITIONS 16;
”
3. 数据导出
$ mysqldump -h192.168.1.100 -P3306 -uroot -p fgedudb fgedu_order \
–no-create-info –extended-insert > /backup/orders.sql
# 或使用SELECT INTO OUTFILE
$ mysql -e “SELECT * INTO OUTFILE ‘/tmp/orders.csv’
FIELDS TERMINATED BY ‘,’
FROM fgedudb.fgedu_order;”
4. 数据导入
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p < /backup/orders.sql
# 或使用LOAD DATA
$ obclient -e "LOAD DATA INFILE '/tmp/orders.csv'
INTO TABLE fgedudb.fgedu_order
FIELDS TERMINATED BY ',';"
5. 数据校验
$ obclient -e "
SELECT COUNT(*) FROM fgedudb.fgedu_order;
SELECT SUM(order_id) FROM fgedudb.fgedu_order;
"
6. 启动业务
- 验证数据完整性
- 切换业务连接
- 监控业务运行
3.2 OceanBase在线迁移
1. OMS部署
# 安装OMS
$ cd /ob/app/oms
$ ./install.sh
# 启动OMS
$ ./bin/oms.sh start
# 访问OMS控制台
http://192.168.1.200:8080
2. 创建迁移项目
– 登录OMS控制台
– 创建数据源(MySQL)
– 创建目标库(OceanBase)
– 创建迁移项目
3. 配置迁移任务
┌─────────────────────────────────────────────────────────────┐
│ 迁移配置 │
├─────────────────────────────────────────────────────────────┤
│ 源库:MySQL 192.168.1.100:3306 │
│ 目标库:OceanBase 192.168.1.101:2881 │
│ 迁移对象:fgedudb.* │
│ 迁移类型:结构+全量+增量 │
│ 并发度:16 │
│ 限速:100MB/s │
└─────────────────────────────────────────────────────────────┘
4. 启动迁移
# 在OMS控制台启动迁移任务
# 监控迁移进度
5. 数据校验
# OMS自动校验
# 或手动校验
$ obclient -e ”
SELECT
(SELECT COUNT(*) FROM fgedudb.fgedu_order) as target_count,
(SELECT COUNT(*) FROM mysql.fgedu_order) as source_count;更多学习教程公众号风哥教程itpux_com。
”
6. 业务切流
– 停止源库写入
– 等待增量同步完成
– 切换业务连接到目标库
– 启动业务
3.3 OceanBase增量同步
1. OMS增量同步配置
# 在OMS控制台配置
– 启用增量同步
– 配置同步对象
– 设置过滤规则
– 配置冲突处理
2. Canal增量同步
# 部署Canal
$ cd /ob/app/canal
$ ./bin/startup.sh
# 配置Canal
$ cat conf/example/instance.properties
canal.instance.master.address=192.168.1.100:3306
canal.instance.dbUsername=canal,from DB视频:www.itpux.com。
canal.instance.dbPassword=canal
canal.instance.connectionCharset=UTF-8
canal.instance.tsdb.enable=true
# 启动Canal实例
$ ./bin/startup.sh example
3. 消费增量数据
“`java
// Java代码消费Canal数据
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress(“192.168.1.200”, 11111), “example”, “”, “”);
connector.connect();
connector.subscribe(“fgedudb\\..*”);
while (running) {
Message message = connector.getWithoutAck(100);
long batchId = message.getId();
for (Entry entry : message.getEntries()) {
// 解析binlog
RowChange rowChange = RowChange.parseFrom(entry.getStoreValue());
for (RowData rowData : rowChange.getRowDatasList()) {
// 同步到OceanBase
syncToOceanBase(rowData);
}
}
connector.ack(batchId);
}
“`
4. 增量同步监控
#!/bin/bash
# sync_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
echo “=== Incremental Sync Monitor ===”
# 检查延迟
obclient -e ”
SELECT
source_position,
target_position,
delay_seconds
FROM oceanbase.__all_virtual_cdc_sync_stat;
”
# 检查同步速率
obclient -e ”
SELECT
sync_rate_tps,
sync_rate_mbps
FROM oceanbase.__all_virtual_cdc_sync_stat;
”
echo “==================================”
Part04-生产案例与实战讲解
4.1 OceanBase MySQL迁移案例
– 源库:MySQL 8.0
– 目标库:OceanBase 4.x
– 数据量:500GB
– 表数量:200张
– 要求:在线迁移,停机时间< 1小时 # 迁移方案 1. 迁移评估 - 数据量:500GB - 表结构:兼容度95% - 存储过程:需要改写 - 触发器:需要改写 2. 迁移步骤 Step 1: 结构迁移 $ omscli migrate-schema \ --source mysql://root:pass@192.168.1.100:3306/fgedudb \ --target oceanbase://root:pass@192.168.1.101:2881/fgedudb \ --objects "*" Step 2: 全量数据迁移 $ omscli migrate-data \ --source mysql://root:pass@192.168.1.100:3306/fgedudb \ --target oceanbase://root:pass@192.168.1.101:2881/fgedudb \ --parallel 16 \ --rate-limit 100MB # 全量迁移耗时:4小时 Step 3: 增量同步 $ omscli sync-incremental \ --source mysql://root:pass@192.168.1.100:3306/fgedudb \ --target oceanbase://root:pass@192.168.1.101:2881/fgedudb # 增量同步延迟:< 1秒 Step 4: 数据校验 $ omscli verify-data \ --source mysql://root:pass@192.168.1.100:3306/fgedudb \ --target oceanbase://root:pass@192.168.1.101:2881/fgedudb # 校验结果:100%一致 Step 5: 业务切流 - 停止源库写入 - 等待增量同步完成 - 切换业务连接 - 启动业务 # 停机时间:30分钟 3. 迁移结果 - 迁移成功:100% - 数据一致:100% - 停机时间:30分钟(符合要求) - 业务影响:无
4.2 OceanBase Oracle迁移案例
– 源库:Oracle 19c
– 目标库:OceanBase Oracle模式
– 数据量:2TB
– 表数量:500张
– 要求:分阶段迁移,业务影响最小
# 迁移方案
1. 迁移评估
– 数据类型:需要转换
– PL/SQL:需要改写
– 存储过程:需要改写
– 序列:需要调整
2. 兼容性评估
$ omscli assess-oracle \
–source oracle://system:pass@192.168.1.100:1521/ORCL \
–output /tmp/assessment_report.html
# 评估结果
– 兼容对象:85%
– 需改写:15%
– 不兼容:5%
3. 迁移步骤
Step 1: 结构迁移
# 使用OMS迁移结构
$ omscli migrate-schema \
–source oracle://system:pass@192.168.1.100:1521/ORCL \
–target oceanbase://root:pass@192.168.1.101:2881/fgedudb \
–mode oracle
Step 2: 数据类型转换
# 手动处理不兼容类型
– NUMBER -> DECIMAL
– VARCHAR2 -> VARCHAR
– CLOB -> TEXT
– BLOB -> BLOB
Step 3: 全量数据迁移
# 按模块分批迁移
Module 1: 用户模块(100GB)- 2小时
Module 2: 订单模块(500GB)- 8小时
Module 3: 日志模块(1.4TB)- 20小时
Step 4: 增量同步
$ omscli sync-incremental \
–source oracle://system:pass@192.168.1.100:1521/ORCL \
–target oceanbase://root:pass@192.168.1.101:2881/fgedudb \
–mode oracle
Step 5: 应用改造
# 修改连接串
jdbc:oracle:thin:@192.168.1.100:1521:ORCL
->
jdbc:oceanbase://192.168.1.101:2881/fgedudb?mode=oracle
# 修改SQL(不兼容部分)
– ROWNUM -> LIMIT
– SYSDATE -> NOW()
– NVL -> IFNULL
Step 6: 业务切流
– 灰度切换
– 监控业务运行
– 全量切换
4. 迁移结果
– 迁移周期:2周
– 数据一致:100%
– 业务影响:最小化
– 性能提升:30%
4.3 OceanBase跨机房迁移案例
– 源库:OceanBase 机房A
– 目标库:OceanBase 机房B
– 数据量:10TB
– 距离:1000公里
– 要求:在线迁移,数据零丢失
# 迁移方案
1. 网络规划
– 专线带宽:10Gbps
– 网络延迟:20ms
– 稳定性:99.99%
2. 迁移架构
机房A 机房B
┌──────────────┐ ┌──────────────┐
│ OB集群 │ │ OB集群 │
│ (源库) │<------>│ (目标库) │
└──────────────┘ └──────────────┘
│ │
v v
┌──────────────┐ ┌──────────────┐
│ OMS主节点 │<------>│ OMS备节点 │
└──────────────┘ └──────────────┘
3. 迁移步骤
Step 1: 部署OMS
# 机房A部署OMS主节点
$ cd /ob/app/oms
$ ./install.sh –master
# 机房B部署OMS备节点
$ ./install.sh –slave –master-ip=192.168.1.100
Step 2: 配置数据同步
$ omscli create-sync \
–source oceanbase://root:pass@192.168.1.100:2881/fgedudb \
–target oceanbase://root:pass@192.168.2.100:2881/fgedudb \
–sync-mode incremental \
–compress true \
–encrypt true
Step 3: 全量同步
# 启动全量同步
$ omscli start-sync –project fgedu_migration
# 监控进度
$ omscli show-sync –project fgedu_migration
Progress: 80%
Speed: 500MB/s
ETA: 2 hours
Step 4: 增量同步
# 全量完成后自动切换增量
Sync Mode: Incremental
Delay: < 1s
Step 5: 数据校验
$ omscli verify-sync \
--source oceanbase://root:pass@192.168.1.100:2881/fgedudb \
--target oceanbase://root:pass@192.168.2.100:2881/fgedudb
Verification: PASSED
Consistency: 100%
Step 6: 业务切流
- DNS切换到机房B
- 监控业务运行
- 确认稳定后停止机房A
4. 迁移结果
- 迁移时间:3天(全量)
- 数据延迟:< 1秒
- 数据一致:100%
- 业务影响:零中断
Part05-风哥经验总结与分享
5.1 OceanBase数据迁移最佳实践
1. 前期准备
– 充分评估数据源
– 测试兼容性
– 准备迁移环境
– 制定详细计划
2. 迁移执行
– 先结构后数据
– 分批分阶段
– 监控迁移进度
– 及时处理异常
3. 数据校验
– 行数校验
– 内容校验
– 抽样校验
– 业务校验
4. 切流策略
– 灰度切流
– 监控业务
– 准备回滚
– 快速响应
5. 后期优化
– 性能调优
– 监控完善
– 文档更新
– 经验总结
5.2 OceanBase数据校验
1. 行数校验
$ obclient -e ”
SELECT
‘Source’ as db_type,
COUNT(*) as row_count
FROM mysql.fgedu_order
UNION ALL
SELECT
‘Target’ as db_type,
COUNT(*) as row_count
FROM fgedudb.fgedu_order;
”
2. 内容校验
$ obclient -e ”
SELECT
‘Source’ as db_type,
SUM(CRC32(CONCAT(order_id, user_id, amount))) as checksum
FROM mysql.fgedu_order
UNION ALL
SELECT
‘Target’ as db_type,
SUM(CRC32(CONCAT(order_id, user_id, amount))) as checksum
FROM fgedudb.fgedu_order;
”
3. 抽样校验
#!/bin/bash
# sample_verify.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
TABLE=”fgedu_order”
SAMPLE_SIZE=1000
# 随机抽样校验
obclient -e ”
SELECT order_id, user_id, amount
FROM fgedudb.$TABLE
ORDER BY RAND()
LIMIT $SAMPLE_SIZE;
” > /tmp/target_sample.txt
mysql -e ”
SELECT order_id, user_id, amount
FROM fgedudb.$TABLE
ORDER BY RAND()
LIMIT $SAMPLE_SIZE;
” > /tmp/source_sample.txt
# 对比
if diff /tmp/source_sample.txt /tmp/target_sample.txt; then
echo “Sample verification PASSED”
else
echo “Sample verification FAILED”
fi
4. 校验报告
#!/bin/bash
# verify_report.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
echo “=== Data Verification Report ===”
echo “Table: fgedu_order”
echo “Time: $(date)”
# 行数校验
SOURCE_COUNT=$(mysql -e “SELECT COUNT(*) FROM fgedudb.fgedu_order” | tail -1)
TARGET_COUNT=$(obclient -e “SELECT COUNT(*) FROM fgedudb.fgedu_order” | tail -1)
echo “Source Row Count: $SOURCE_COUNT”
echo “Target Row Count: $TARGET_COUNT”
if [ “$SOURCE_COUNT” -eq “$TARGET_COUNT” ]; then
echo “Row Count: PASSED”
else
echo “Row Count: FAILED”
fi
echo “==================================”
5.3 OceanBase回滚方案
1. 数据回滚
# 保留源库数据
– 迁移期间不删除源库
– 保留7天以上
– 定期备份
# 数据恢复
$ mysqldump -h192.168.1.100 -P3306 -uroot -p fgedudb > /backup/rollback.sql
# 需要时恢复
$ mysql -h192.168.1.100 -P3306 -uroot -p fgedudb < /backup/rollback.sql
2. 业务回切
#!/bin/bash
# rollback.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
echo "Starting rollback..."
# 1. 停止目标库写入
obclient -e "SET GLOBAL read_only=ON;"
# 2. 检查数据一致性
# ... 校验代码 ...
# 3. 切换DNS回源库
# ... DNS切换 ...
# 4. 启动源库业务
mysql -e "SET GLOBAL read_only=OFF;"
# 5. 验证业务
# ... 验证代码 ...
echo "Rollback completed"
3. 回滚触发条件
- 数据不一致
- 业务异常
- 性能严重下降
- 迁移失败
4. 回滚演练
- 定期演练回滚
- 验证回滚流程
- 记录回滚时间
- 优化回滚方案
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
