SymmetricDS问题排查方法

登录到SymmetricDS的Web控制台,如下图:

上图中红色的一行,表示节点OfficeTest_14531出现了些问题,Status值为“Batch Error”。

发送包错误诊断

 

点击左边的“Outgoing Batches”,可以看到从中央节点(regsvr)往外发的数据包。在Status栏选择“Error”,Node Id栏输入“OfficeTest_14531”,回车即可看到regsvr节点发往OfficeTest_14531节点的所有出问题的Batch,下图中显示目前有一个Batch出现了问题。

上图中,前两列分别为Batch Id和Node Id,把这两个值设置到下列SQL语句的batch_id和node_id条件值上,如下:

select * from sym_data where data_id in select failed_data_id from sym_outgoing_batch where batch_id=2283383 and node_id=OfficeTest_14531);

因为上面这个Error表示的是从regsvr节点到OfficeTest_14531节点的同步出了问题,而regsvr节点安装的时候选择的数据库名称为symmetricds,这时候我们连接到数据库symmetricds,然后执行上面的SQL语句,看看具体的信息。一般来说,一个batch失败的原因主要有以下几个:

  1. 目标数据库有一列为非空值,而源数据库这一列可为空值,源数据改变后同步到目标数据库时,这个列的值为空;
  2. 外键约束,目标数据库有外键约束,阻止了插入或删除,源数据可能没有这个外键;
  3. 目标数据库表的某些列的值类型和源数据库表不一样,比如目标数据库中这个列值为tiny(4),源数据库中这个列值类型为int(11),当传过来的值超过tiny(4)的范围时,数据插入会失败;
  4. 目标数据表不存在;
  5. 网络异常,目标节点已离线;
  6. 磁盘写错误,一般是空间使用完了;

具体到上面这个错误,可以看到是sym_console_user表同步的问题,这个表包含了用户登录到Web控制台的相关信息。如果能确定这个数据不是特别重要,或者在之后也会重传,可以点击右上方的“change”按钮,然后点击“Ignore Batch”将这个Batch忽略掉。对于重要的数据,最好等待底层条件(如网络异常)恢复后自动重试。

接收包错误诊断

 

上面是针对出去的Batch,进来的Batch需要选择左边的“Incomming Batches”。进来的Batch出错,sym_data和sym_data_event表没有相关信息可以查询,这时候需要查看的是sym_incoming_error表,可以使用下面的语句,batch_id和node_id请使用相应的实际值。

select * from sym_incoming_error where batch_id=’2283383′ and node_id=’OfficeTest_14531′;

这个查询返回的信息大致如下:

  1. 列TARGET_TABLE_NAME表示哪个数据库表参与了数据变化;
  2. EVENT_TYPE表示事件类型,分别为Update [U]、Insert [I]、Delete [D];
  3. OLD_DATA和ROW_DATA,分别表示旧数据和新数据;
  4. COLUMN_NAMES表示表的所有列;
  5. PK_COLUMN_NAMES表示表的主键名称;

通过上面这些信息,大概可以判断是哪里出了问题。

如果想要完全忽略一个Batch,可以通过执行下列SQL语句,只是简单把其Status字段设置为“OK”:

update sym_outgoing_batch set status=’OK’ where batch_id=’XXXXXX’

因为一个Batch可能包含多条数据更改,如果只是想忽略Batch中的某一条数据,可以将该数据从sym_data_event表中删除,下次这个Batch重试时将不包含该数据,SQL语句如下:

delete from sym_data_event where batch_id=’XXXXXX’ and data_id=’YYYYYY’

发表评论

电子邮件地址不会被公开。