ODBC是一项相对比较老的技术,即开放数据库连接(Open Database Connectivity,ODBC),是为解决异构数据库间的数据共享而产生的,现已成为WOSA(The Windows Open System Architecture(Windows开放系统体系结构))的主要部分和基于Windows环境的一种数据库访问接口标准。ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。

问题

由于一些项目需要用到ODBC与MySQL交互进行数据存取,但是在数据量大的时候,无法进行写入。主要表现在以下几个方面:

  • 数据量超过几万时无法写入,清空数据表或者少量数据时可以写入
  • 数据库使用阿里云RDS(公网访问)可以写入,但是使用阿里云ECS自建MySQL无法写入(公网带宽1M)

ODBC连接访问日志错误如下:

Table('xxx').Open.error
Description: ODBC 驱动程序不支持所需的属性。
State: (null), Native: 0, Source: Microsoft OLE DB Provider for ODBC Drivers

在出现此错误时,MySQL服务器端show processlist;可以看到有select from table_name; 全表查询的日志信息.在slow_log中也能看到select from table_name的慢查询输出。而且持续输出。

问题解决思路:

1.ODBC版本问题

更换与数据库同版本的ODBC驱动程序。无效.

2.ODBC Unicode和ANSI连接方式

分别测试Unicode和ANSI连接 无效

3.MySQL服务器端variables配置问题

参照阿里云RDS variables对比重新配置,包括sql_mode,character, time_zone等。 无效.

4.怀疑RDS MySQL 8.0.18与我们自建生产环境 8.0.23版本差异问题

搭建8.0.18版本测试 无效.

5.数据库表名错误

偶然间发现如果数据库表明输入错误,ODBC错误日志也是如上同样的,打开表失败。

6.prefech参数设置

由于在slow_log中发现全表查询,因为考虑避免全表查询。所以考虑prefech参数。在ODBC连接参数页面配置prefetch,测试成功。

总结

由于数据表名错误与本现象一致,均是open table时错误,因此应该是由于没有设置prefetch参数导致全表查询,在服务器带宽太小的情况下,导致打开数据表失败。而阿里云RDS公网带宽经测试应该是大于1Mb的,所以不会出现打开表太慢的情况。

prefetch详细说明参考: https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-configuration-connection-parameters.html

When set to a non-zero value N, causes all queries in the connection to return N rows at a time rather than the entire result set. Useful for queries against very large tables where it is not practical to retrieve the whole result set at once. You can scroll through the result set, N records at a time.
This option works only with forward-only cursors. It does not work when the option parameter MULTI_STATEMENTS is set. It can be used in combination with the option parameter NO_CACHE. Its behavior in ADO applications is undefined: the prefetching might or might not occur. Added in 5.1.11.

归根结底在于ODBC在写入数据之前,要先打开表,而打开表需要prefetch一些数据,如果不指定prefetch的话,会导致全表查询,响应较慢导致打开失败。

ODBC驱动程序不支持所需的属性-诡异的ODBC连接问题
Tagged on:     

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据