一、背景
当用户的系统需要从一个数据库迁移到另外一个数据库的时候,需要对用到的SQL进行语法改写以适应新的数据库系统,而不同的数据库之间存在一些特性差异例如命名空间问题,本方案的应用可以解决不同数据库上关于命名空间的差异性问题。
二、存在的问题
当用户的系统需要从一个数据库迁移到另外一个数据库的时候,需要对数据库的命名空间进行兼容性处理,以避免数据操作错误。以MySQL系统迁移到PostgreSQL数据库为例,MySQL可以进行跨database的操作,而PostgreSQL则无法进行跨database的操作,这个时候如果MySQL用户存在跨database操作的需求,例如将数据归档存储到其它数据库,则默认命名空间行为无法实现。
由于不同数据库命名空间之间的差异性问题,如果不进行兼容性处理,会造成一些正常的操作在迁移后无法操作或者操作失败的问题,影响用户使用。
例如在MySQL中很常见的跨数据库数据归档,即把本database的数据迁移到另外一个database,在PostgreSQL中就无法直接做到,因为PostgreSQL不支持跨database操作,如果不对命名空间进行兼容性处理,则用户需要修改应用程序来适应这个问题。
三、解决方案
本方案提出一种建立数据库命名空间映射关系的方式,在创建连接以及建立数据结构、增删改查、响应的时候对命名空间按映射关系进行修正,以达到命名空间兼容的目标。
为了解决数据库命名空间的兼容性问题,首先在创建数据表的时候,将原本属于目标数据库a下的数据表b,创建为默认数据库下的二级命名空间a的数据表b,这一步可以由数据库兼容服务在接收到建表DDL的时候通过改写实现,完成数据结构的命名空间映射。
接下来在所有DML中,通过数据库兼容服务将涉及到的未指定命名空间的表,修改其命名空间为用户当前连接指定的数据库,以修正数据来源,即完成命名空间映射,用户可以提交在其看来是跨database操作的SQL。
四、优点
与用户人工修改应用程序SQL实现兼容相比,本方案的实施使得用户完全不需要对应用程序进行命名空间方面的兼容性改造而进行直接迁移,大大减轻了用户的工作量。
与其它厂商直接修改数据库的语法解析模块相比,本方案的实施使得数据库引擎的研发和升级完全不受影响,大大减轻了语法兼容部分的维护的工作量。