常见问题及解答
以下按照问题分类对常见问题进行描述,包括问题的现象,错误码,诊断方案以及修复方法等。
系统配置类问题
SDB_OOM(-2)
- 系统内存分配失败
- 问题诊断:出现该问题是由于系统虚拟内存分配已达到上限而触发,切换至相应的用户,可以通过 “ulimit -Sa” 进行查看,确认 “virtual memory” 的大小是否跟所有数据文件(包括索引文件、大对象文件)相接近,如果是,则需要修改该值。
- 问题修复:建议将相应用户的 “virtual memory” 设置为 “unlimited”。
SDB_DPS_FILE_SIZE_NOT_SAME(-123)、SDB_DPS_FILE_NOT_RECOGNISE(-124)
- 当前节点的同步日志大小/个数与配置文件中的大小/个数不相符,目前SequoiaDB不支持在初始化后更改同步日志文件大小和个数
- 问题修复:调整到原配置即可。若需要强行更改同步日志文件大小和个数,则首先需要确保同一分区组内的所有节点同步日志已经一致(可以通过直连节点并执行 “db.snapshot( SDB_SNAP_SYSTEM )“ 查看 “CompleteLSN”是否相同),然后停止分区组内的所有节点,并删除每一个节点上的同步日志目录(默认为 <dbpath>/replicalog),再修改到新的配置并重启节点即可。
网络问题
SDB_NETWORK(-15)、SDB_NETWORK_CLOSE(-16)
- 通信套节字关闭
- 问题诊断:
- 请检查是否配置防火墙策略;
- 请检查交换机是否配置安全策略,是否故障;
- 请检查机器网卡是否故障;
- 可以用 “ping <hostname>” 或 “telent <hostname:port>” 进行相关的测试;
- 请检查节点或客户端是否重启或关闭。
SDB_NET_CANNOT_LISTEN(-78)
- 通信监听端口冲突
- 问题诊断:查看节点的诊断日志,找到冲突的端口,并通过 “netstat -anp|grep <port>” 确认端口是否被占用。
- 问题修复:若端口被占用,则需要先停止占用该端口的进程;重启该节点。
SDB_NET_CANNOT_CONNECT(-79)
- 无法连接指定的地址
- 问题诊断:
- 通过查看节点的诊断日志,找到目的端的地址和端口信息;
- 检查目的节点是否启动;
- 检查当前节点的 “host” 配置是否正确;
- 检查当前节点和目的节点是否开启防火墙;
- 问题修复:
- 请根据上述每一步的检查进行相应的修复,并重试操作。
SDB_NET_BROKEN_MSG(-84)
- 消息格式错误或长度不正确,当前消息包最大长度为512MB
SDB_COORD_REMOTE_DISC(-134)
- 对端节点断开连接
- 问题诊断:
- 请查看该协调节点的诊断日志,找到发生错误的数据节点;检查该数据节点是否异常重启;
- 在开启 “optimeout” 配置的情况下,若对端节点在指定时间内无心跳响应,则操作也会被中断,并返回 SDB_COORD_REMOTE_DISC 错误,在这种情况下,请检查机器是否负载过高,磁盘IO过慢等。
- 问题修复:
- 若数据节点发生重启,则需要联系售后工程师进行处理。
- 若由于机器负载过高,磁盘压力大引起,则需要关闭或增大 “optimeout” 。
SDB_TOO_MANY_OPEN_FD(-255)
- 连接句柄数达到上限
- 问题诊断:出现该问题是由于进程的句柄数达到配置的上限,切换至相应的用户,可以通过 “ulimit -Sa” 进行查看,确认 “open files” 的配置是否小于当前节点所有文件数加连接数,如果是,则需要修改该值。
- 问题修复:建议将相应用户的 “open files” 设置为 “unlimited”。
节点可靠性问题
SDB_APP_FORCED(-18)
- 节点被强制退出或停止
- 问题诊断:根据节点的诊断日志,查看节点退出原因。
- 问题修复:重启对应节点。
SDB_DMS_INVALID_SU(-35)
- 节点上数据文件、索引文件或大对象文件损坏
- 问题诊断:
- 请检查磁盘是否发生故障;
- 请检查节点是否发生异常,或机器是否发生异常重启;
- 问题修复:
- 若磁盘故障,则需要更换磁盘;
- 若由于节点异常或机器重启导致,则检查故障文件大小是否小于64KB,小于则直接清除(包含该集合空间的其它文件一并清除),并重启节点; 否则需要联系售后工程师进行恢复。
SDB_DPS_CORRUPTED_LOG(-98)
- 同步日志记录损坏
- 问题诊断:请检查磁盘是否损坏
- 问题修复:系统会尝试自动修复该错误,误长时间都不能修复,则联系售后工程师进行处理。
数据可靠性问题
SDB_DMS_CORRUPTED_SME(-115)、SDB_DMS_CORRUPTED_EXTENT(-139)
- 数据文件、索引文件或大对象文件的损坏
- 问题诊断:请检查磁盘是否发生故障,机器是否强行重启,节点是否异常。
- 问题修复:发生该错误系统会尝试自动修复,若不能自动修复则需要联系售后工程师进行恢复。
SDB_CLS_FULL_SYNC(-129)
- 节点正在进行数据全量同步
- 问题诊断:引发全量同步的原因有:1)当前节点的同步的日志在其它节点中已被写脏;2)当前节点异常重启;3)发生主切换,新的主节点回滚失败(对于删除集合,删除集合空间无法进行回滚)。
- 问题修复:系统会自动修复,在全量同步完成后重试操作。
SDB_RTN_IN_REBUILD(-150)
- 节点正在进行本地数据恢复
- 问题诊断:引发本地数据恢复的原因是该分区组内所有节点都异常重启。
- 问题修复:系统会自动修复,在恢复完成后重试操作,若不能自动修复则需要联系售后工程师进行恢复。
功能问题
SDB_FNE(-4)
- 指定文件不存在
- 问题诊断:请检查操作相关的”文件”、”大对象”等是否存在。
SDB_FE(-5)
- 指定文件已存在
- 问题诊断:请检查操作相关的”文件”、”大对象”等是否存在。
- 问题修复:
- “节点启动”或”创建集合空间”发生该错误时,是由于节点异常导致的文件残留,可以对异常的文件进行清理,并重试操作。
- “创建节点”发生该错误时,可以对已残留的节点配置文件进行清理,并重试操作。
- “获取大对象”发生该错误时,可以更改本地要存储的文件名,并重试操作。
SDB_INVALIDARG(-6)
- 指定参数格式或值不正确
- 问题诊断:请查看对应节点的诊断日志,找到该参数错误的详细描述,并加以修正重试。
SDB_INTERRUPT(-8)
- 发生系统中断,异致节点退出或操作终止
- 问题诊断:“节点”发生中断退出,即为收到相应信号量(比如SIGTERM等),即外部对该节点执行”kill -15”、”sdbstop”、”service sdbcm stop”或”操作系统重启”等相应操作,节点正常停止。
SDB_NOSPC(-11)
- 磁盘空间不足
- 问题诊断:检查节点对应的数据目录、索引目录、大对象目录等的磁盘空间是否达到上限。
SDB_TIMEOUT(-13)
- 超时错误
- 问题诊断:
- 并发事务执行产生死锁
- 会话设置操作超时,可以通过 Sdb.getSessionAttr() 检查 Timeout 选项是否被设置。
- 问题修复:
- 对产生死锁的事务进行回滚操作,可参考 Sdb.transRollback()。
- 对会话设置操作超时,请参考 Sdb.setSessionAttr(),设置 Timeout 为合理的值。
SDB_DMS_NOSPC(-21)、SDB_IXM_NOSPC(-40)
- 集合空间剩余空间不足
- 问题诊断:检查当个集合空间对应文件是否达到容量上限,请参考集合空间限制。
SDB_DMS_EXIST(-22)
- 集合已存在
- 问题诊断:检查操作中的集合名是否拼写错误。
SDB_DMS_NOTEXIST(-23)
- 集合不存在
- 问题诊断:
- 检查操作中的集合名是否拼写错误;
- 使用 “db.listCollections()“ 确认该集合是否存在,若该集合存在,而其它操作依然报该错误,原因可能为:1)操作位于备节点,而备节点还未同步;2)创建该集合由于节点故障导致在实际节点上不存在。
- 问题修复:设置会话访问”主节点”的属性 “db.setSessionAttr({PreferedInstanace:”M”})“ ,并执行 “db.<cs>.<cl>.find()“ 操作进行自动重建修复。(如需要修复垂直分区中的主表报错 -23,需要为每个子表执行重建修复。)
SDB_DMS_RECORD_TOO_BIG(-24)
- 记录超过最大限制
- 问题诊断:请检查操作的记录大小是否超过记录限制。
SDB_DMS_CS_EXIST(-33)
- 集合空间已存在
- 问题诊断:请检查操作中的集合空间名是否拼写错误。
SDB_DMS_CS_NOTEXIST(-34)
- 集合空间不存在
- 问题诊断:
- 请检查集合空间名是否拼写错误;
- 使用 “db.listCollectionSpaces()” 确认该集合空间是否存在,若该集合空间存在,而其它操作仍然报该错误,原因可能为:1)操作位于备节点,而备节点还未同步;2)创建该集合空间空由于节点故障导致在实际节点上不存在。
- 问题修复:设置会话访问”主节点”的属性 “db.setSessionAttr({PreferedInstance:”M”})“,并重试该操作。
SDB_IXM_MULTIPLE_ARRAY(-37)
- 复合索引字段中数组类型过多,目前复合索引只允许1个字段为数组类型
SDB_IXM_DUP_KEY(-38)
- 与该记录相同的唯一索引值冲突,对于集合默认有 “$id” 的唯一索引
SDB_IXM_KEY_TOO_LARGE(-39)
- 通过记录生成的索引值大小超过1000字节
- 问题修复:请检查索引是否合理,建议需要建索引的字段值长度应小于128字节,从而可以达到提升性能的效果。
SDB_DMS_MAX_INDEX(-42)
- 集合的索引达到上限,单集合最大支持创建64个索引
SDB_DMS_INIT_INDEX(-43)
- 初始化索引页失败
- 问题诊断:
- 该索引在操作过程中被删除;
- 磁盘发生故障;
- 问题修复:重试操作,若故障未修复,则需要联系售后工程师进行修复。
SDB_IXM_EXIST(-46)
- 相同的索引名已存在
- 问题诊断:请检查操作中的索引名是否拼写错误。
SDB_IXM_NOTEXIST(-47)、SDB_RTN_INDEX_NOTEXIST(-52)
- 指定索引不存在
- 问题诊断:该索引在操作过程中被删除;
- 问题修复:重试操作,若故障未修复,则需要联系售后工程师进行修复。
SDB_DMS_SU_OUTRANGE(-55)
- 单节点集合空间达到上限,单节点最多支持16384个集合空间
SDB_IXM_DROP_ID(-56)、SDB_IXM_DROP_SHARD(-164)
- 系统索引不允许删除(包括 “$id”和”$shard”)
- 问题修复:若要删除 “$id” 索引,请使用 “[db.<cs>.<cl>.dropIdIndex()][dropIdIndex]“ 接口,但删除后该集合不支持”更新”和”删除”。
SDB_PMD_RG_NOT_EXIST(-59)、SDB_COOR_NO_NODEGROUP_INFO(-138)、SDB_CLS_GRP_NOT_EXIST(-154)、SDB_CLS_NO_GROUP_INFO(-167)
- 分区组不存在
- 问题诊断:请使用 “db.listReplicaGroups()“ 检查分区组是否存在。
- 问题修复:若上述检查分区组存在,请使用 “db.invalidateCache({Global:true})“ 清空所有节点的缓存,并重试操作。
SDB_PMD_RG_EXIST(-60)、SDB_CAT_GRP_EXIST(-153)
- 分区组已存在
- 问题诊断:请检查操作中的分区组名是否拼写错误。
SDB_PMD_SESSION_NOT_EXIST(-62)
- 指定会话不存在
- 问题诊断:可以通过直连该节点,并执行 “db.snapshot( SDB_SNAP_SESSIONS )“ 确认该会话是否存在。
SDB_PMD_FORCE_SYSTEM_EDU(-63)
- 系统会话不允许被强制结束
SDB_BACKUP_HAS_ALREADY_START(-67)
- 其它备份任务正在执行, 当前系统只允许同时执行一个离线备份任务
SDB_BAR_DAMAGED_BK_FILE(-70)
- 备份文件损坏
- 问题诊断:请检查磁盘是否损坏。
- 问题修复:重新执行备份,并删除该备份文件。
SDB_RTN_NO_PRIMARY_FOUND(-71)、SDB_CLS_NOT_PRIMARY(-104)
- 分区组不存在主节点
- 问题诊断:
- 检查分区组的所有节点是否都已经启动(1、在分区组所有节点都异常后,需要所有节点都启动才能选举;2、在分区组节点正常重启时,若存在节点未启动,则其它节点需要等待一定周期才能开始选举,默认时间是10分钟;3、在分区组节点正常重启时,需要有 N/2 +1 个节点成功启动才会选举)。
- 直连分区组的每一个节点,执行 “db.snapshot( SDB_SNAP_SYSTEM )“ 并查看 “IsPrimary” 是否为 “true”;
- 检查分区组的每一个节点的诊断日志,查看节点当前的错误信息。
- 问题修复:
- 若检查当前分区组存在 “IsPrimary” 为 “true” 的节点,则执行 “db.invalidateCache({Global:true})“ 清除所有缓存并重试;
- 若存在节点未启,请启动节点。
SDB_REPL_GROUP_NOT_ACTIVE(-90)
- 分区组未激活,不能被分配给域、集合空间和集合
- 问题修复:请执行 “db.getRG(<name>).start()“ 对该分区组进行激活操作。
SDB_DMS_INCOMPATIBLE_MODE(-92)
- 集合当前状态和操作不兼容
- 问题诊断:
- 执行 “db.snapshot( SDB_SNAP_COLLECTIONS )“ 查看对应集合的 “Status” 状态,或通过执行 “sdbdmsdump -d <dbpath> -o <output_file> -c <cs> -l <cl> -a dump —meta true“ 查看对应集合的 “Status”;
- 若集合状态为 “OFFLINE REORG”,则不允许从外部对该集合进行任何操作;
- 问题修复:
- 出现上述现象,系统会自行重组修复;若无法自动修复,则可以通过执行 “sdbdmsdump -d <dbpath> -o <output_file> -c <cs> -l <cl> -r mb:Flag=0“ 进行强制修复。
SDB_DMS_INCOMPATIBLE_VERSION(-93)
- SequoiaDB程序与当前的数据文件版本不兼容,当前不支持从高版本回退到低版本
- 问题修复:请更新到正确的版本。
SDB_CLS_NODE_NOT_ENOUGH(-105)
- 分区组当前激活节点数不满足集合同步写幅本数要求
- 问题诊断:请检查该分区组内所有节点是否启动。
- 问题修复:启动该分区组内未启动的节点,或者通过 “db.<cs>.<cl>.alter()“ 降低集合同步写幅本数。
SDB_CLS_DATA_NODE_CAT_VER_OLD(-107)、SDB_CLS_COORD_NODE_CAT_VER_OLD(-108)
- 数据节点/协调节点编目信息过旧
- 问题修复:该错误系统会自动修复,如未能自动修复,可以通过执行 “db.invalidateCache({Global:true})“ 清空所有节点缓存并重试。
SDB_APP_INTERRUPT(-116)
- 当前操作被中断
- 问题诊断:请检查 节点是否正在停止,通讯是否中断,机器是否重启,以及是否有其它人员对该会话进行”强制中断”。
- 问题修复: 重试操作。
SDB_CAT_AUTH_FAILED(-128)
- 该节点在编目中未配置,鉴权失败
- 问题诊断:请检查是否更改节点的主机名或服务名。
- 问题修复:暂时不允许修复节点主机名,请改回原主机名即可。
SDB_CAT_NO_NODEGROUP_INFO(-133)
- 没有可用分区组
- 问题诊断:请检查是否创建分区组并激活。
SDB_CAT_NO_MATCH_CATALOG(-135)
- 不能匹配到有效的分区信息
- 问题诊断:可以通过执行 “db.snapshot( SDB_SNAP_CATALOG )“ 查看对应集合的分区信息,并与操作的记录进行比较,确保记录能够匹配到已有的分区信息。
- 问题修复:通过 “db.<cs>.<cl>.attachCL()“持载记录对应的分区即可。
SDBCM_FAIL(-140)
- 远程节点操作失败
- 问题诊断:请检查 “sdbcm” 是否启动。
- 问题修复: 启动 “sdbcm”。
SDBCM_NODE_EXISTED(-145)
- 指定节点已存在
- 问题诊断:可以通过执行 “db.listReplicaGroups()“ 查看节点是否存在。
- 问题修复:若检查节点不存在,则手动停止对应机器的 “sdbcm”,并删除 “conf/local/“ 下该节点的目录,然后重启 “sdbcm” 并重试操作。
SDBCM_NODE_NOTEXISTED(-146)、SDB_CLS_NODE_NOT_EXIST(-155)
- 指定节点不存在
- 问题诊断: 可以通过执行 “db.listReplicaGroups()“ 查看节点是否存在。
SDB_LOCK_FAILED(-147)
- 加锁失败
- 问题诊断:当删除集合空间出现该错误时,是由于还有其它在该集合空间上的查询或大对象游标未关闭导致,可以查看诊断日志,找到出错的节点,并直连该节点,执行 “db.snapshot( SDB_SNAP_CONTEXTS)“ 找到对应的游标和会话。
- 问题修复:直连该节点,并且可以通过执行 “db.forceSession(<sessionID>)“ 强制终止该会话,并重试操作。
SDB_COLLECTION_NOTSHARD(-169)
- 该集合为非分区集合
- 问题修复:可以通过 “db.<cs>.<cl>.alter()“ 将该集合改为分区集合。
SDB_CL_NOT_EXIST_ON_GROUP(-172)
- 集合的指定分区不存在于指定分区组上
- 问题诊断:通过 “db.snapshot( SDB_SNAP_CATALOG )“ 查看指定集合的分区信息,确认分区信息是否正确。
SDB_MULTI_SHARDING_KEY(-174)
- 分区键含有数组,且该数组中有多个值,目前分区键中若含有数组类型,需要保证数组中只有1个元素
SDB_CLS_BAD_SPLIT_KEY(-176)
- 分区范围已经在目标分区组
- 问题诊断:通过 “db.snapshot( SDB_SNAP_CATALOG )“ 查看指定集合的分区信息,确认分区信息是否正确。
SDB_DPS_TRANS_DOING_ROLLBACK(-191)
- 节点正在执行事务回滚操作
- 问题修复:在回滚操作完成后进行重试。
SDB_QGM_AMBIGUOUS_FIELD(-194)
- 选择字段名存在冲突
- 问题修复:请对选择字段名加上来源别名。
SDB_DMS_INVALID_INDEXCB(-199)
- 该索引被删除
- 问题诊断:通过执行 “db.<cs>.<cl>.listIndexes()“ 确认该索引是否存在。
SDB_DPS_LOG_FILE_OUT_OF_SIZE(-203)
- 事务日志空间不足
- 问题修复:可以通过修复”日志文件个数”或”日志文件大小”增大日志空间,默认日志空间为1.2GB。
SDB_CATA_RM_NODE_FORBIDDEN(-204)
- 不允许删除分区组内的主节点或最后一个节点
- 问题修复:可以使用 “db.removeRG(<name>)“ 接口删除整个分区组。
SDB_CAT_RM_GRP_FORBIDDEN(-208)
- 不允许删除非空分区数
- 问题诊断:执行 “db.snapshot( SDB_SNAP_CATALOG )“ 检查各集合中的 “CataInfo” 是否包含待删除的分区组。
- 问题修复:需要确保待删除的分区组中不存在集合,可以删除对应的集合,或将该集合切分至其它分区组。
SDB_CAT_DOMAIN_NOT_EXIST(-215)、SDB_CAT_DOMAIN_EXIST(-216)
- 指定域不存在/已存在
- 问题诊断:执行 “db.listDomains()“ 检查指定域是否存在或不存在。
SDB_CAT_GROUP_NOT_IN_DOMAIN(-216)
- 指定切分的分区组不在集合空间所属域内
- 问题修复:当集合空间指定域后,其切分的分区组也必须在域内;可以通过 “domain.alter()“ 将该分组内加入域,或更改切分的分区组。
SDB_INVALID_MAIN_CL_TYPE(-244)
- 垂直分区集合分区类型不正确,垂直分区集合必须为范围分区
SDB_DMS_REACHED_MAX_NODES(-249)
- 分区组节点达到上限,分区组最多支持7个幅本
SDB_CLS_WAIT_SYNC_FAILED(-252)
- 操作等待备节点同步失败
- 问题诊断:出象该故障,为该分区组内在操作过程中出现象节点心跳中断或节点故障所致,请检查该分区组内每个节点是否正常,或发生过异常重启。
SDB_DPS_TRANS_DIABLED(-253)
- 事务未开启
- 问题修复:修改节点的配置文件,开启事务功能。
用户权限问题
SDB_PERM(-3)
- 无相应的访问权限
- 问题诊断:出现该问题,请查看对应节点的诊断日志,根据日志中的错误信息找到对应的”文件”或”目录”,并确认相应用户对该”文件”或”目录”具备读写等权限。
- 问题修复:给相应的”文件”或”目录”赋予该用户相应的权限。
SDB_AUTH_AUTHORITY_FORBIDDEN(-179)
- 数据库鉴权失败
- 问题修复:请使用正确的用户名和密码。若要取消数据库鉴权,则删除所有用户即可。
SDB_AUTH_USER_NOT_EXIST(-300)
- 用户名或密码不正确