Skip to content

OceanBase 迁移测试与验证

迁移测试是确保数据从源数据库成功迁移到 OceanBase 数据库的关键步骤,包括迁移前测试、迁移中验证和迁移后验证三个阶段,目标是验证数据完整性、一致性和业务可用性。

迁移前测试

源数据库评估

数据库结构评估

sql
-- 获取源数据库表数量
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name';

-- 获取源数据库索引数量
SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'database_name';

-- 获取源数据库存储过程和函数数量
SELECT COUNT(*) FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'database_name';

-- 获取源数据库触发器数量
SELECT COUNT(*) FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'database_name';

-- 获取源数据库视图数量
SELECT COUNT(*) FROM information_schema.VIEWS WHERE TABLE_SCHEMA = 'database_name';

数据量评估

sql
-- 获取源数据库总数据量
SELECT TABLE_SCHEMA, SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 / 1024 AS "Total Size (GB)"
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'
GROUP BY TABLE_SCHEMA;

-- 获取源数据库各表数据量
SELECT TABLE_NAME, (DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 AS "Size (MB)", TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;

性能评估

sql
-- 获取源数据库慢查询数量
SELECT COUNT(*) FROM mysql.slow_log WHERE start_time >= DATE_SUB(NOW(), INTERVAL 1 DAY);

-- 获取源数据库并发连接数
SHOW GLOBAL STATUS LIKE 'Threads_connected';

-- 获取源数据库 QPS
SHOW GLOBAL STATUS LIKE 'Queries';

迁移工具测试

工具兼容性测试

bash
# 测试 OMS 工具连接源数据库
oms_tool test-connection --source-type mysql --source-host 127.0.0.1 --source-port 3306 --source-user root --source-password password

# 测试 OMS 工具连接目标 OceanBase 数据库
oms_tool test-connection --target-type oceanbase --target-host 127.0.0.1 --target-port 2881 --target-user root --target-password password --target-tenant sys

迁移性能测试

bash
# 执行小表迁移测试
oms_tool migrate --source-type mysql --source-host 127.0.0.1 --source-port 3306 --source-user root --source-password password --source-database test_db --target-type oceanbase --target-host 127.0.0.1 --target-port 2881 --target-user root --target-password password --target-tenant sys --target-database test_db --tables "small_table1,small_table2" --log-level info

# 检查迁移性能报告
cat /home/oms/logs/performance_report.log

目标环境测试

OceanBase 集群状态测试

sql
-- 检查集群状态
SHOW CLUSTER STATUS;

-- 检查节点状态
SELECT * FROM oceanbase.GV$OB_SERVERS;

-- 检查资源池状态
SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;

-- 检查租户状态
SELECT * FROM oceanbase.DBA_OB_TENANTS;

网络连通性测试

bash
# 测试源数据库到目标数据库的网络连通性
ping -c 10 target_host

# 测试源数据库到目标数据库的端口连通性
telnet target_host 2881
telnet target_host 2883

# 测试目标数据库到源数据库的网络连通性
ping -c 10 source_host

# 测试目标数据库到源数据库的端口连通性
telnet source_host 3306

迁移中验证

数据一致性验证

实时验证

sql
-- 验证源数据库和目标数据库的表行数一致
-- 源数据库执行
SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name';

-- 目标数据库执行
SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name';

校验和验证

sql
-- 源数据库计算表校验和
CHECKSUM TABLE table_name;

-- 目标数据库计算表校验和
CHECKSUM TABLE table_name;

抽样验证

sql
-- 源数据库随机抽样
SELECT * FROM table_name ORDER BY RAND() LIMIT 100;

-- 目标数据库随机抽样
SELECT * FROM table_name ORDER BY RAND() LIMIT 100;

迁移进度监控

迁移工具监控

bash
# 查看 OMS 迁移任务状态
oms_tool list-tasks

# 查看具体迁移任务进度
oms_tool task-status --task-id task_id

# 查看迁移任务日志
oms_tool task-logs --task-id task_id --tail 100

数据库状态监控

sql
-- 检查目标数据库连接数
SHOW GLOBAL STATUS LIKE 'Threads_connected';

-- 检查目标数据库 QPS
SHOW GLOBAL STATUS LIKE 'Queries';

-- 检查目标数据库 IO 负载
SELECT * FROM oceanbase.GV$OB_SERVER_IO_STAT;

-- 检查目标数据库 CPU 负载
SELECT * FROM oceanbase.GV$OB_SERVER_CPU_STAT;

异常处理

迁移错误处理

bash
# 查看迁移错误日志
oms_tool task-errors --task-id task_id

# 重启失败的迁移任务
oms_tool restart-task --task-id task_id

# 跳过失败的表继续迁移
oms_tool skip-table --task-id task_id --table-name table_name

性能问题处理

sql
-- 调整 OceanBase 并行度
ALTER SYSTEM SET parallel_servers_target = 64;

-- 调整 OceanBase 内存配置
ALTER SYSTEM SET memory_limit_percentage = 80;

-- 调整 OceanBase IO 配置
ALTER SYSTEM SET max_io_workers = 64;

迁移后验证

数据完整性验证

全量验证

sql
-- 验证源数据库和目标数据库的表数量一致
-- 源数据库
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name';

-- 目标数据库
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name';

-- 验证源数据库和目标数据库的索引数量一致
-- 源数据库
SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'database_name';

-- 目标数据库
SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'database_name';

行级验证

sql
-- 验证表行数一致
-- 源数据库
SELECT COUNT(*) FROM database_name.table_name;

-- 目标数据库
SELECT COUNT(*) FROM database_name.table_name;

-- 验证主键唯一性
SELECT column_name, COUNT(*) FROM database_name.table_name GROUP BY column_name HAVING COUNT(*) > 1;

列级验证

sql
-- 验证列数据类型一致
-- 源数据库
DESCRIBE database_name.table_name;

-- 目标数据库
DESCRIBE database_name.table_name;

-- 验证列默认值一致
-- 源数据库
SELECT COLUMN_NAME, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

-- 目标数据库
SELECT COLUMN_NAME, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

业务功能验证

查询验证

sql
-- 执行常用业务查询
SELECT * FROM database_name.table_name WHERE condition;

-- 执行聚合查询
SELECT COUNT(*), SUM(column_name) FROM database_name.table_name GROUP BY group_column;

-- 执行连接查询
SELECT * FROM database_name.table1 t1 JOIN database_name.table2 t2 ON t1.id = t2.t1_id;

更新验证

sql
-- 执行业务更新
UPDATE database_name.table_name SET column_name = 'new_value' WHERE condition;

-- 验证更新结果
SELECT * FROM database_name.table_name WHERE condition;

插入验证

sql
-- 执行业务插入
INSERT INTO database_name.table_name (column1, column2) VALUES ('value1', 'value2');

-- 验证插入结果
SELECT * FROM database_name.table_name WHERE column1 = 'value1';

删除验证

sql
-- 执行业务删除
DELETE FROM database_name.table_name WHERE condition;

-- 验证删除结果
SELECT * FROM database_name.table_name WHERE condition;

性能验证

查询性能验证

sql
-- 执行慢查询日志分析
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

-- 执行性能测试查询
SELECT * FROM database_name.large_table WHERE condition;

-- 查看慢查询日志
SELECT * FROM mysql.slow_log WHERE start_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR);

并发性能验证

bash
# 使用 sysbench 进行并发性能测试
# 准备测试数据
sysbench --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=2881 --mysql-user=root --mysql-password=password --mysql-db=test_db --table_size=1000000 --tables=10 prepare

# 执行 read_write 测试
sysbench --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=2881 --mysql-user=root --mysql-password=password --mysql-db=test_db --table_size=1000000 --tables=10 --threads=64 --time=300 --report-interval=10 run

# 清理测试数据
sysbench --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=2881 --mysql-user=root --mysql-password=password --mysql-db=test_db cleanup

批量操作性能验证

sql
-- 执行批量插入测试
INSERT INTO database_name.table_name (column1, column2) VALUES 
('value1', 'value2'),
('value3', 'value4'),
...
('valueN', 'valueN+1');

-- 执行批量更新测试
UPDATE database_name.table_name SET column1 = CASE id 
WHEN 1 THEN 'value1' 
WHEN 2 THEN 'value2' 
... 
WHEN N THEN 'valueN' 
END WHERE id IN (1, 2, ..., N);

迁移验证工具

OMS 验证工具

数据一致性验证

bash
# 使用 OMS 进行数据一致性验证
oms_tool verify-data --source-type mysql --source-host 127.0.0.1 --source-port 3306 --source-user root --source-password password --source-database database_name --target-type oceanbase --target-host 127.0.0.1 --target-port 2881 --target-user root --target-password password --target-tenant sys --target-database database_name --tables "table1,table2"

业务功能验证

bash
# 使用 OMS 进行业务功能验证
oms_tool verify-business --target-type oceanbase --target-host 127.0.0.1 --target-port 2881 --target-user root --target-password password --target-tenant sys --target-database database_name --sql-file business_queries.sql

第三方验证工具

pt-table-checksum

bash
# 使用 pt-table-checksum 验证数据一致性
pt-table-checksum --host=source_host --user=root --password=password --databases=database_name --replicate=test.checksums

# 在目标数据库验证
pt-table-checksum --host=target_host --port=2881 --user=root --password=password --databases=database_name --replicate=test.checksums

mysqldump 对比

bash
# 源数据库导出数据
mysqldump -hsource_host -uroot -ppassword database_name table_name > source_table.sql

# 目标数据库导出数据
mysqldump -htarget_host -P2881 -uroot -ppassword database_name table_name > target_table.sql

# 对比数据文件
diff source_table.sql target_table.sql

迁移测试报告

测试报告模板

测试阶段测试项测试结果备注
迁移前测试源数据库评估通过数据库结构、数据量和性能符合迁移要求
迁移前测试迁移工具测试通过OMS 工具连接正常,性能测试通过
迁移前测试目标环境测试通过OceanBase 集群状态正常,网络连通性良好
迁移中验证数据一致性验证通过表行数、校验和和抽样验证一致
迁移中验证迁移进度监控通过迁移任务按计划进行,无严重异常
迁移中验证异常处理通过遇到的异常已妥善处理
迁移后验证数据完整性验证通过表数量、索引数量和行级验证一致
迁移后验证业务功能验证通过查询、更新、插入和删除操作正常
迁移后验证性能验证通过查询性能和并发性能符合要求

测试结果分析

  • 通过率:所有测试项的通过率,目标 100%
  • 数据一致性:源数据库和目标数据库的数据一致性,目标 100%
  • 业务可用性:迁移后业务功能的可用性,目标 100%
  • 性能指标:迁移后的性能指标,包括 QPS、响应时间和并发数

迁移回滚计划

回滚触发条件

  • 迁移后数据完整性验证失败
  • 迁移后业务功能验证失败
  • 迁移后性能指标不满足要求
  • 出现严重的数据库故障

回滚步骤

  1. 停止业务访问:暂停应用服务,停止读写操作
  2. 恢复源数据库:确保源数据库可用
  3. 回滚应用配置:将应用配置改回源数据库
  4. 恢复业务访问:启动应用服务,恢复读写操作
  5. 分析失败原因:分析迁移失败的原因,制定改进方案
  6. 重新执行迁移:根据改进方案重新执行迁移

回滚验证

sql
-- 验证源数据库状态
SHOW DATABASES LIKE 'database_name';

-- 验证源数据库表状态
SHOW TABLES FROM database_name;

-- 验证源数据库数据完整性
SELECT COUNT(*) FROM database_name.table_name;

迁移最佳实践

测试策略设计

分层测试

  • 单元测试:验证单个表或对象的迁移
  • 集成测试:验证相关表或对象的迁移
  • 系统测试:验证整个数据库的迁移
  • 性能测试:验证迁移后的性能
  • 压力测试:验证迁移后的并发性能

增量测试

  • 小表测试:先迁移小表,验证迁移流程
  • 中表测试:再迁移中表,验证迁移性能
  • 大表测试:最后迁移大表,验证迁移稳定性
  • 全量测试:最后进行全量迁移测试

验证方法选择

数据量较小的场景

  • 使用全量校验和验证
  • 使用 mysqldump 对比验证
  • 使用 pt-table-checksum 验证

数据量较大的场景

  • 使用抽样验证
  • 使用实时行数对比验证
  • 使用增量校验和验证

业务关键场景

  • 使用全量验证
  • 使用多种验证方法交叉验证
  • 进行业务功能测试

常见问题(FAQ)

Q1: 迁移测试需要多长时间?

A1: 迁移测试时间取决于数据库大小、复杂度和测试策略,一般建议:

  • 小型数据库(< 100GB):1-2 天
  • 中型数据库(100GB-1TB):3-5 天
  • 大型数据库(> 1TB):5-10 天

Q2: 如何确保迁移数据的完整性?

A2: 确保迁移数据完整性的方法:

  • 使用多种验证方法交叉验证
  • 进行全量验证和抽样验证
  • 验证表行数、校验和和数据内容
  • 进行业务功能测试

Q3: 迁移过程中遇到数据不一致怎么办?

A3: 迁移过程中遇到数据不一致的处理方法:

  1. 停止迁移任务
  2. 分析不一致原因
  3. 修复数据问题
  4. 重新执行迁移
  5. 再次验证数据一致性

Q4: 如何验证迁移后的性能?

A4: 验证迁移后性能的方法:

  • 执行慢查询日志分析
  • 使用 sysbench 进行并发性能测试
  • 执行业务查询测试
  • 监控数据库的 QPS、响应时间和资源使用

Q5: 迁移测试失败怎么办?

A5: 迁移测试失败的处理方法:

  1. 分析失败原因
  2. 修复问题
  3. 重新执行测试
  4. 如果多次失败,调整迁移方案
  5. 必要时寻求 OceanBase 技术支持

Q6: 如何编写迁移测试用例?

A6: 编写迁移测试用例的方法:

  • 覆盖所有表和对象
  • 覆盖各种数据类型
  • 覆盖各种业务场景
  • 包含正常和异常情况
  • 包含性能测试用例

Q7: 迁移后需要进行哪些验证?

A7: 迁移后需要进行的验证:

  • 数据完整性验证
  • 数据一致性验证
  • 业务功能验证
  • 性能验证
  • 并发性能验证

Q8: 如何选择合适的验证工具?

A8: 选择验证工具的依据:

  • 数据库大小
  • 迁移工具类型
  • 验证效率要求
  • 验证精度要求
  • 现有技术栈

Q9: 迁移测试需要哪些资源?

A9: 迁移测试需要的资源:

  • 测试环境(源数据库和目标数据库)
  • 迁移工具(如 OMS)
  • 验证工具(如 pt-table-checksum)
  • 测试人员
  • 时间窗口

Q10: 如何确保迁移测试的可重复性?

A10: 确保迁移测试可重复性的方法:

  • 编写详细的测试计划和用例
  • 使用自动化测试工具
  • 记录测试环境和配置
  • 保存测试数据和结果
  • 建立测试基线

迁移测试案例

案例一:Oracle 到 OceanBase 迁移测试

场景:将 500GB Oracle 数据库迁移到 OceanBase

测试步骤

  1. 源数据库评估:数据库结构、数据量和性能评估
  2. 迁移工具测试:OMS 工具连接和性能测试
  3. 目标环境测试:OceanBase 集群状态和网络连通性测试
  4. 迁移中验证:实时验证、校验和验证和抽样验证
  5. 迁移后验证:数据完整性验证、业务功能验证和性能验证

测试结果

  • 数据一致性:100%
  • 业务可用性:100%
  • 性能提升:查询性能提升 50%,并发性能提升 30%

案例二:MySQL 到 OceanBase 迁移测试

场景:将 200GB MySQL 数据库迁移到 OceanBase

测试步骤

  1. 源数据库评估:数据库结构、数据量和性能评估
  2. 迁移工具测试:OMS 工具连接和性能测试
  3. 目标环境测试:OceanBase 集群状态和网络连通性测试
  4. 迁移中验证:实时验证、校验和验证和抽样验证
  5. 迁移后验证:数据完整性验证、业务功能验证和性能验证

测试结果

  • 数据一致性:100%
  • 业务可用性:100%
  • 性能提升:查询性能提升 40%,并发性能提升 25%

迁移测试注意事项

  • 制定详细的测试计划和用例
  • 选择合适的测试环境和工具
  • 确保测试数据的代表性
  • 记录测试过程和结果
  • 及时处理测试中遇到的问题
  • 准备迁移回滚计划
  • 进行充分的性能测试
  • 验证业务功能的完整性
  • 确保数据一致性和完整性
  • 编写详细的测试报告