本文介绍开发过程中常见的问题及答案。

写入和查询

  • Q:如何从Flink写入数据到AnalyticDB MySQL版

    A:更多详情,请参见Flink AnalyticDB MySQL Connector

  • Q:如何处理IN条件过大的问题?
    A:AnalyticDB MySQL版内部对于IN条件的个数有限制,默认为2000,您也可以根据需求进行调整。
    set adb_config max_in_items_count=3000
  • Q:为什么会发生查询结果跳变?
    A:在确认数据没有更新的情况下,可能导致查询结果跳变的原因如下:
    • 没有排序的LIMIT。AnalyticDB MySQL版是分布式数据库,查询在多个节点多线程执行,如果某些线程返回了满足LIMIT的行数,查询即终止,所以没有排序的LIMIT的查询结果是一个随机的过程,内部无法保证固定的线程返回结果。
    • 带分组的聚合查询,如果SELECT字段中的某个字段没有聚合函数,也没有出现在GROUP BY字段中,那么这个字段将随机返回一个值。

    若仍有问题,请提交工单联系技术支持。

  • Q:如何配置查询超时?
    A:您可以为单个查询或全集群所有查询配置查询的超时时间(单位为ms),语法示例如下:
    • 单个查询生效。
      /*query_timeout=xxxx*/select count(*) from t;
    • 全集群所有查询生效。
      set adb_config query_timeout=xxx;
  • Q:为什么执行计划里的表扫描行数累加不等于query的总扫描行数?

    A:一般是由于创建了复制表导致的,复制表在AnalyticDB MySQL版的每个后台节点都保存一份,当查询复制表时,复制表的查询会在进行扫描量统计时进行重复统计。

  • Q:AnalyticDB MySQL版是否支持全文索引?

    A:支持。

  • Q:查询结果以JSON格式返回时,IN操作符指定的值的个数有限制吗?

    A:AnalyticDB MySQL版3.1.4以及3.1.4之前的版本有限制,不能超过16。3.1.4以后的版本没有限制。

    集群的版本号查询语句如下:
    select adb_version();
  • Q:ERROR 1815 (HY000): [20034, XXX] : Left side of logical expression must evaluate to a boolean这种报错应该怎么处理?

    A:需要把OR改成 ||。

  • Q:AnalyticDB MySQL版显示的时间被截断是什么原因?

    A:可以先通过MySQL客户端进行验证,如果MySQL客户端显示正常,那么需要定位用户使用的其他客户端软件对返回结果是否做过特殊处理。

  • Q:aes_encrypt内置函数使用会报错是什么原因?
     SELECTCONVERT(AES_DECRYPT(AES_ENCRYPT('ABC123','key_string'),'key_string'),char(10));
    A:aes_encrypt(varbinary x, varchar y) // 入参类型是varbinary,所以SQL需要修改为:
    SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT(CAST('ABC123' AS VARBINARY), 'key_string'), 'key_string'),char(10)); 
  • Q:AnalyticDB MySQL版是否支持OSS上经过gzip压缩后的csv文件做为外表数据源?

    A:支持,需要compress_type外表定义加上compress_type=gzip。

  • Q:没有设置主键(primary key)的表,用insert overwrite into插入,会出现重复数据,原因是什么?

    A:无主键的表不能支持自动去重的。

  • Q:DTS同步数据提示max_allowed_packet大小超限应该怎么办?

    A:默认值是128MB,用户如果有特殊需求需要调大,请提交工单

  • Q:使用easyswoole PHP开发框架时,连接RDS没有问题,但是连接不上AnalyticDB MySQL版是什么原因?

    A:原因是PreparedStatement不支持show语句。

  • Q:在MySQL中可以使用查询语句select * from table group by key,在AnalyticDB MySQL版中查询报错 Column 'XXX' not in GROUP BY clause,是什么原因?

    A:目前不支持这种分组查询时展示所有字段的查询,需要把列名显式地写出来。如
    select nation.name from nation group by nation.nationkey
  • Q:是否支持UDF?

    A:您可以使用AnalyticDB MySQL版中Spark的UDF功能。

  • Q:如何使用命令查看当前库里running的导入任务?

    A:可以使用如下命令进行查询:
    select * from INFORMATION_SCHEMA.kepler_meta_async_jobs where status = "RUNNING"
  • Q:是否支持insert on duplicate key?

    A:AnalyticDB MySQL版目前只支持常数和values(column)的赋值方法,暂时不支持表达式。

  • Q:是否支持在UPDATE语句中使用Join?

    A:目前暂不支持。

  • Q:创建表后为什么看不到分区信息?

    A:创建了分区表后,需要执行BUILD TABLE语句才能看到分区信息。

  • Q:集群的最大连接数是多少?

    A:最大连接数是5000。请参考约束和限制

  • Q:监控界面看到热数据使用量比总数据使用量还多,是什么原因?

    A:AnalyticDB MySQL版集群中包含多个存储节点,磁盘数据使用量是指单个存储节点的最大磁盘使用量,热数据使用量是指所有存储节点的磁盘数据使用量之和。

表结构

  • Q:如何修改二级分区表生命周期(lifecycle)?

    A:您可以使用如下语句进行修改:
    ALTER TABLE db_name.table_name partitions N;
  • Q:AnalyticDB MySQL版是否支持修改分布字段和分区字段?

    A:不支持。如需修改分布字段和分区字段,您可以尝试如下办法:先创建临时表,并通过INSERT INTO SELECT命令把原表数据导入到临时表。删除原表后,使用正确的分布字段或者分区字段建表,再次使用INSERT INTO SELECT把临时表数据导入到新建的表。

  • Q:创建OSS外表时应该选择内网地址还是公网地址?

    A:需要选择内网地址,因为对于AnalyticDB MySQL版的OSS外表,后台节点是通过内网而非公网访问OSS。

  • Q:如何DROP索引?

    A:请参考ALTER TABLE

集群信息获取

  • Q:如何获取主账号或子账号的AccessKeyId和AccessKeySecret信息?
    A:操作步骤如下:
    • 主账号
      1. 使用主账号登录阿里云控制台
      2. 将鼠标放在右上方的用户名区域,在弹出的快捷菜单中选择AccessKey管理
      3. 系统弹出安全提示对话框,单击继续使用AccessKey,页面显示AccessKeyIdAccessKeySecret
    • 子账号
      1. 登录RAM控制台
      2. 单击用户名进入用户管理页面,找到页面下端的用户AccessKey
  • Q:如何监控磁盘水位?

    A:您可以通过云监控为预留模式下的集群配置磁盘监控告警,当磁盘水位(磁盘使用率)大于或等于90%时,为保护集群正常运行,系统将拒绝您的写数据请求,即写入数据报错,读数据不受影响。

    说明 弹性模式无需配置磁盘监控告警。

    为防止磁盘使用率达到磁盘安全水位,需要您配置监控报警,提前发出报警通知,让您及时知晓磁盘水位并管理磁盘空间,保证业务正常运行。更多信息,请参见设置报警规则

  • Q:连接数突然增高,如何检查是当前哪个用户或客户端IP的连接数?

    A:您可以在诊断与优化 > 连接信息页签下,查看用户连接数客户端IP连接数的统计信息。

    连接信息
  • Q:如何检查表的大小等信息?

    A:您可以在集群监控信息页的表信息统计页签下查看表大小等信息。

    表统计信息
  • Q:表个数的上限是多少?

    A:更多详情,请参见约束和限制

其它

  • Q:AnalyticDB MySQL版支持在SQL里设置变量吗?

    A:不支持。

  • Q:AnalyticDB MySQL版升级需要多久,会对业务造成影响吗?

    A:升级耗时一般从半小时到2小时不等,具体时间和集群规模和数据量相关。升级过程中可能导致连接出现闪断,客户端需要有重试机制,如果是对查询失败非常敏感的业务,建议在夜间或者业务低峰期进行。

  • Q:如何停止异步导入导出任务?
    A:您可以在诊断与优化页的导入/导出任务页签下到目标异步任务,查看该异步任务的异步任务名,然后运行CANCEL JOB "${异步任务名}"语句取消该异步任务。更多关于异步导入导出任务的详情,请参见异步提交导入导出任务异步任务名