在实际的应用环境中,随着业务的发展变化,数据库管理员可能会面临不同数据库的迁移,这是一个高风险的过程。资深软件架构师 Amol D. Barsagade 以从 Sybase 到 DB2 的迁移为例,详细总结了数据库迁移的最佳实践,其中分享了迁移后的检查清单。
迁移后的验证和确认检查列表包括:
- 数据库结构
- 识别来源 / 目标数据库中所有可用的对象。
- 针对来源数据库验证和确认目标数据库中的所有对象。
- 验证和确认是否遵循了规范化的流程。
- 验证和确认数据库设计。
- 验证和确认是否遵循了充分的容量规划。
- 验证和确认一次数据冗余检查。
- 验证和确认系统和它的环境。
- 验证和确认数据库增长。
- 验证和确认安全设计。
- 验证和确认系统日志的结构。
- 验证和确认事务日志的结构。
- 验证和确认并发性控制。
- 表
- 验证和确认目标数据库中的表总数。
- 验证和确认表名称。
- 针对来源目标数据库表验证和确认每个表中的列数。
- 验证和确认每个数据类型映射和大小。
- 验证和确认用户定义的数据类型(如果存在)。
- 验证和确认默认值。
- 验证和确认空值。
- 验证和确认身份列。
- 验证和确认主键和外键约束。
- 验证和确认 FK、触发器和 SP 等对象的依赖关系。
- 验证和确认目标索引。
- 存储过程
- 针对来源数据库 SP 验证和确认 SP 总数。
- 验证和确认过程名称。
- 验证和确认是否存在任何用户定义的数据类型。
- 验证和确认输入 / 输出参数和数据类型。
- 验证和确认返回值和返回数据类型。
- 验证和确认事务模式(连锁 / 未连锁 -@@tranchained)。
- 验证和确认事务 - 开始 / 结束 / 保存 / 提交 / 回调。
- 验证和确认隔离级别 0/1/2/3。
- 验证和确认 @@transtate/@@trancount/@@isolation。
- 验证和确认锁定模式 share/exclusive。
- 验证和确认服务器 / 所有者命名约定。
- 验证和确认重新编译选项。
- 验证和确认业务逻辑。
- 验证和确认对象依赖关系。
- 验证和确认 SET NOCOUNT 打开 / 关闭、QUOTED IDENTIFIER 打开 / 关闭等。
- 验证和确认开放查询 / 链接服务器的正确实现(如果存在)。
- 验证和确认动态查询语句。
- 验证和确认 DCL 语句、GRANT 权限等(如果存在)。
- 验证和确认联结 (join) 和 DML 语句形式的各种输入的正确输出行为。
- 用户定义的函数
- 针对来源数据库 UDF 验证和确认 UDF 的总数。
- 验证和确认 UDF 名称。
- 验证和确认 I/O 参数传递。
- 验证和确认输入参数传递顺序。
- 验证和确认返回数据类型。
- 验证和确认用户定义的数据类型。
- 验证和确认对象的依赖关系。
- 验证和确认业务逻辑。
- 视图
- 针对来源数据库视图验证和确认视图总数。
- 验证和确认视图名称。
- 验证和确认视图定义的对象和来源数据库是否正确。
- 索引
- 针对来源数据库验证和确认索引总数。
- 验证和确认索引名称。
- 验证和确认目标数据库的集群化 (PK)/ 非集群化索引。
- 触发器
- 验证和确认触发器总数。
- 验证和确认触发器名称。
- 验证和确认触发器依赖关系。
- 验证和确认业务逻辑 / 触发事件。
- 验证和确认插入 / 更新 / 删除触发器。
- 验证和确认标准格式 / 最佳实践。
- 约束
- 验证和确认约束总数。
- 验证和确认约束名称。
- 验证和确认、FK、PK、检查、null 和默认约束。
- 规则
- 验证和确认规则总数。
- 验证和确认规则名称。
- 验证和确认目标数据库中的规则条件和逻辑。
- 默认设置
- 验证和确认默认设置。
- 游标
- 验证和确认游标总数。
- 验证和确认游标名称。
- 验证和确认 holdlock/noholdlock/shared。
- 验证和确认只读 / 用于更新的游标。
- 验证和确认分配和解除分配游标。
- 验证和确认 @@sqlstatus/@@rowcount。
- 验证和确认子句的流向。
- 临时表
- 验证和确认全局 / 临时表。
- 内置函数
- 验证和确认内置函数。
- 系统变量
- 验证和确认系统定义的 / 全局变量。
- 其他
- 验证和确认 Sybase 的 USE 关键字。
- 验证和确认 GO 关键字。
- 验证和确认 while 循环中的 break/continue。
- 验证和确认用于异常处理的 raiserror/@@error。
- 验证和确认转换函数。
- 验证和确认 @@error/@@transtate/@@sqlstatus/@@tranchained/@@textsize/@@rowcount。
- 数据测试
- 验证和确认来源和目标数据库中的记录总数。
- 验证和确认加载的记录是否与来源记录相同。
- 验证和确认空值和废弃的值。
- 验证和确认数据。
- 数据库性能测试
- 迁移数据库和应用程序后,检查应用程序的总体性能。使用可用的 DB2 实用程序,得出与目标 DB2 服务器等效或更好的应用程序性能。
- 表的完整性检查
- 使用 Sybase Central 对来源表进行完整性检查。
- 使用 IBM Data Studio 对目标表进行完整性检查。
- 确保来源和目标数据库中的表名称是相同的。
- 确保表具有相同的列数。
- 确保每个列的数据类型与来源表中相同,或者兼容来源数据类型。
- 对于 char 和 varchar 等数据类型,确保大小正确。
- 对于 decimal 和 numeric 等数据类型,确保比例是正确的。
- 确保拥有列 null/not null/default values。
- 确保设置了检查约束,如果它存在。
- 确保设置了表的主要约束,如果它存在。
- 确保设置了表的外键约束,如果它存在。
- 确保所有索引都已正确的顺序创建。
- 确保表和它的索引已在各自的表空间中创建。
- 确保表为各个用户设置了正确的访问权限。
- 确保身份列已正确复制到目标数据库中。
- 确保它的名称相同。
- 确保它拥有相同或兼容的数据类型。
- 确保它以正确的初始值开头。
- 确保它拥有相同的增量值。
- 确保它的下一个值与预期的值相同。
- 序列的完整性检查:
- 确保序列是使用相同名称创建的。
- 确保序列拥有相同或兼容的数据类型。
- 确保开始值和结束值已适当提及(如果存在)。
- 确保增量值是正确的。
- 确保与序列关联的触发器已正确创建(如果存在)。
- 视图的完整性检查:
- 确保视图名称是正确的。
- 确保视图拥有相同的列数。
- 确保视图列数据类型相同或兼容。
- 确保视图列名称是相同的。
- 确保视图定义是正确的。
- 确保存在依赖于视图的表。
- 确保视图为各个用户提供了相同的访问权限。
- 主键的完整性检查:
- 确保数据库中存在表和相应的字段。
- 确保字段是使用目标数据库中的
not null
属性创建的。 - 确保主键名称是正确的。
- 外键的完整性检查:
- 确保目标数据库中存在基础表和相应的数据类型。
- 确保目标数据库中存在参考表。
- 确保外键名称是正确的。
- 索引的完整性检查:
- 确保目标数据库中存在该表和相应的字段。
- 确保字段列表和它们的顺序相同。
- 确保索引已以正确的顺序创建(升序 / 降序或允许逆向扫描)。
有关更具体的检查清单和数据库迁移的最佳实践,读者可以查看 Amol D. Barsagade 的系列文章。
评论