外观
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.checksumsmysqldump 对比
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、响应时间和并发数
迁移回滚计划
回滚触发条件
- 迁移后数据完整性验证失败
- 迁移后业务功能验证失败
- 迁移后性能指标不满足要求
- 出现严重的数据库故障
回滚步骤
- 停止业务访问:暂停应用服务,停止读写操作
- 恢复源数据库:确保源数据库可用
- 回滚应用配置:将应用配置改回源数据库
- 恢复业务访问:启动应用服务,恢复读写操作
- 分析失败原因:分析迁移失败的原因,制定改进方案
- 重新执行迁移:根据改进方案重新执行迁移
回滚验证
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: 迁移过程中遇到数据不一致的处理方法:
- 停止迁移任务
- 分析不一致原因
- 修复数据问题
- 重新执行迁移
- 再次验证数据一致性
Q4: 如何验证迁移后的性能?
A4: 验证迁移后性能的方法:
- 执行慢查询日志分析
- 使用 sysbench 进行并发性能测试
- 执行业务查询测试
- 监控数据库的 QPS、响应时间和资源使用
Q5: 迁移测试失败怎么办?
A5: 迁移测试失败的处理方法:
- 分析失败原因
- 修复问题
- 重新执行测试
- 如果多次失败,调整迁移方案
- 必要时寻求 OceanBase 技术支持
Q6: 如何编写迁移测试用例?
A6: 编写迁移测试用例的方法:
- 覆盖所有表和对象
- 覆盖各种数据类型
- 覆盖各种业务场景
- 包含正常和异常情况
- 包含性能测试用例
Q7: 迁移后需要进行哪些验证?
A7: 迁移后需要进行的验证:
- 数据完整性验证
- 数据一致性验证
- 业务功能验证
- 性能验证
- 并发性能验证
Q8: 如何选择合适的验证工具?
A8: 选择验证工具的依据:
- 数据库大小
- 迁移工具类型
- 验证效率要求
- 验证精度要求
- 现有技术栈
Q9: 迁移测试需要哪些资源?
A9: 迁移测试需要的资源:
- 测试环境(源数据库和目标数据库)
- 迁移工具(如 OMS)
- 验证工具(如 pt-table-checksum)
- 测试人员
- 时间窗口
Q10: 如何确保迁移测试的可重复性?
A10: 确保迁移测试可重复性的方法:
- 编写详细的测试计划和用例
- 使用自动化测试工具
- 记录测试环境和配置
- 保存测试数据和结果
- 建立测试基线
迁移测试案例
案例一:Oracle 到 OceanBase 迁移测试
场景:将 500GB Oracle 数据库迁移到 OceanBase
测试步骤:
- 源数据库评估:数据库结构、数据量和性能评估
- 迁移工具测试:OMS 工具连接和性能测试
- 目标环境测试:OceanBase 集群状态和网络连通性测试
- 迁移中验证:实时验证、校验和验证和抽样验证
- 迁移后验证:数据完整性验证、业务功能验证和性能验证
测试结果:
- 数据一致性:100%
- 业务可用性:100%
- 性能提升:查询性能提升 50%,并发性能提升 30%
案例二:MySQL 到 OceanBase 迁移测试
场景:将 200GB MySQL 数据库迁移到 OceanBase
测试步骤:
- 源数据库评估:数据库结构、数据量和性能评估
- 迁移工具测试:OMS 工具连接和性能测试
- 目标环境测试:OceanBase 集群状态和网络连通性测试
- 迁移中验证:实时验证、校验和验证和抽样验证
- 迁移后验证:数据完整性验证、业务功能验证和性能验证
测试结果:
- 数据一致性:100%
- 业务可用性:100%
- 性能提升:查询性能提升 40%,并发性能提升 25%
迁移测试注意事项
- 制定详细的测试计划和用例
- 选择合适的测试环境和工具
- 确保测试数据的代表性
- 记录测试过程和结果
- 及时处理测试中遇到的问题
- 准备迁移回滚计划
- 进行充分的性能测试
- 验证业务功能的完整性
- 确保数据一致性和完整性
- 编写详细的测试报告
