mycat全局表一致性检查通过内部列_mycat_op_time来实现,具体实现方式如下
1.检测全局表的内部列是否存在
checker.checkInnerColumnExist();
检测的实现是通过一个SQLJob来异步操作的,对应的SQL语句为:
select count(*) as inner_col_exist from information_schema.columns where column_name=’_mycat_op_time’ and table_name=’user’ and table_schema=’db1’;
如果返回的inner_col_exist 大于0,那么就表示存在内部列,如果等于0,那么就表示不存在内部列。
如果PhysicalDatasource上某个db的全局表没有内部列,那么将这些db记录在一个list中,然后在SQL 拦截过程中进行判断,如果是全局表,但是没有内部列,那么就输出警告,不对SQL进行拦截改写,因为该全局表没有内部列,无需改写SQL。在第一项检测完成之后,才能进行第二项检测。
2.检测全局表的记录总数
checker.checkRecordCout();
检查过程是类似的,都是通过SQLjob来完成的,只是对应的语句不一样:
select count(*) as record_count from user; (假设user表为全局表)
3.检测全局表的时间戳的最大值
checker.checkMaxTimeStamp();
检查过程是类似的,都是通过SQLjob来完成的,只是对应的语句不一样:
select max(_mycat_op_time) as max_timestamp from use