简介:SAP Data Services 连接 MySQL 是数据集成工作中常见的配置场景,相关文档面向正在使用或将要使用 SAP Data Services 的 ETL 工程师、数据运维与报表开发人员,解决从零开始建立到 MySQL 数据源连接的核心问题。文档以清晰步骤展示完整流程,内容涉及数据存储创建、MySQL 类型选择、ODBC 管理配置与测试、表元数据批量导入,以及表设计与数据内容的查看验证等关键操作,同时专门强调连接前应确保 MySQL 服务已启动、版本受支持,并关注账户安全与备份恢复等细节,有助于规避常见配置错误。资源包为 1 个 docx 文件,约 1.43MB,篇幅集中、目录式步骤清晰,适合边读边操作。无论是首次配置的新手,还是需要排查连接异常的老用户,均可按图索骥。目前已有 1620 人学习下载,对于需要快速对接 MySQL 的数据集成人员是一份实用的入门参考。
1. 链接 MySQL 前的第一课:BODS 真正缺的是一个好司机
先说结论:SAP Data Services(下面统一叫 BODS)跟 MySQL 打交道,从来不靠内置直连,而是靠 ODBC 驱动这层中间人。你会发现管理控制台里填主机、端口、用户名、密码只是表面参数,真正决定能不能连上的,是驱动装没装对、位数对不对、认证协议是否匹配。这三样里任何一样不对,耐心填完所有配置后,测试连接按钮会毫不客气地甩给你一条让人摸不着头脑的报错。
这篇笔记按「先懂原理、再动手配置、最后排坑」的顺序整条链路拆开讲。适合两类人:一是正在搭数据仓库同步、报表抽取的开发者,二是负责运维 BODS 平台、被业务方追着问「怎么还不同步」的工程师。读完你能独立配好一个稳定的连接,连接串放在作业里能抗住定时任务反复跑——而不是配完测试通过、隔天就挂在凌晨两点。
2. 做之前先分清:驱动、认证协议、位数这三件事谁管谁
2.1 为什么 BODS 连 MySQL 必须先装 ODBC 驱动
BODS 的架构决定了它的数据库接入方式。它支持几十种数据源,如果每种数据库都内置一套原生协议,那这个产品光维护接入层就要炸了。所以它的设计是:把 SQL 翻译成 ODBC 标准的调用,由 ODBC 驱动将调用再转换成 MySQL 的网络协议。驱动就是 BODS 和 MySQL 之间的翻译官,翻译官不称职,后面所有 SQL 都白搭。
驱动用的是 MySQL 官方提供的 Connector/ODBC,你要注意它在构建方式上分 ANSI 版和 Unicode 版。ANSI 版走的是 ODBC API 的窄字符函数,Unicode 版走宽字符函数。做数据集成我不建议碰 ANSI 版,因为你不知道源表和目标表的字符集是什么组合,Unicode 版对 UTF-8、GBK 这些场景兼容性更好,遇到混合字符集不容易变乱码。
装完之后还有个隐性坑:驱动的显示名称不知道自己几斤几两。老版本在 ODBC 管理器里叫 "MySQL ODBC 5.3 Driver",新版本可能叫 "MySQL ODBC 8.0 Unicode Driver",BODS 连接字符串要原样抄这个名称。所以装完驱动先去 ODBC 管理器看一眼完整名称再继续,能省掉后面一个排查小时的怨气。
2.2 MySQL 8 的默认认证协议会拦截旧驱动
如果你的 MySQL 是 8.0 以上,默认认证插件是 caching_sha2_password,而老版本的 ODBC 驱动(比如 5.x 系列)不认识这个协议。现象是连接时报 Access denied for user 或 Authentication plugin cannot be loaded,看起来像账号密码不对,实际是握手阶段协议谈崩了。
解决有两条路。第一条是升级驱动,换一个支持 caching_sha2_password 的版本,这是正路;第二条是把 MySQL 用户的认证插件改成 mysql_native_password,这一条在公司用的云托管 MySQL 上更实用,因为云厂商不让你随便换驱动,但允许你改账号属性。
-- 在 MySQL 服务端执行:切换用户认证插件为 mysql_native_password ALTER USER 'bods_user'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;注意ALTER USER只对这一个账号生效,你把参数改了不代表服务端全局默认值变了。如果后续新建用户又出现同样问题,还得改 MySQL 配置里的 default_authentication_plugin 参数再重启服务,否则新用户默认又打回 caching_sha2_password。
2.3 Job Server 的进程位数决定驱动位数,别装反
BODS 的组件分布在客户端和服务器端,真正执行定时抽取的是 Job Server 这个进程。ODBC 驱动是被进程加载的,所以 Job Server 是 32 位你就得装 32 位驱动,是 64 位就得装 64 位驱动,装反了在 ODBC 管理器里能看到驱动,但 BODS 一调用就报「数据源未找到」之类的错。
判断方法很朴素:在安装 BODS 的服务器上打开任务管理器,找到 Job Server 对应的进程,看平台列标的是 32 位还是 64 位。也可以看安装目录,一般在 x86 目录下的组件就是 32 位的。驱动必须装在 Job Server 所在的机器上,你要是图省事在客户端电脑装完就以为万事大吉,定时作业到点跑的时候 Job Server 在自己那台机器上找不到驱动,必挂。
3. 从零配置 BODS 到 MySQL 的连接:完整四步
3.1 在 MySQL 侧先准备好账号与最小权限
动 BODS 之前,先在 MySQL 里给数据集成专用账号。集成账号的权限原则是最小够用:BODS 用哪个库就授哪个库的权限,不要图方便直接授 ALL。
-- 创建 BODS 集成专用账号 CREATE USER 'bods_user'@'%' IDENTIFIED BY 'Strong_Pass_2024'; -- 按库授权读写 GRANT SELECT, INSERT, UPDATE, DELETE ON my_schema.* TO 'bods_user'@'%'; -- 允许建临时表和锁表,排序去重时会用到 GRANT CREATE TEMPORARY TABLES, LOCK TABLES ON my_schema.* TO 'bods_user'@'%'; FLUSH PRIVILEGES;上面第二行授了增删改查,第三行给了临时表和锁表权限。临时表权限别看小,BODS 做 sort、distinct、merge 这类变换时会在源库侧创建临时表,缺了这个权限作业跑到一半就报错。锁表权限是为了某些场景下保证数据一致性。如果你只是做只读抽取,可以砍掉 INSERT 和 UPDATE,但 CREATE TEMPORARY TABLES 建议保留。
还有一个小细节:'%' 表示允许任意主机连接。如果 Job Server IP 固定,最好写成CREATE USER 'bods_user'@'10.10.0.5'这种形式,做到账号跟来源 IP 绑定,别人拿到密码也连不上。口令尽量别带特殊字符,尤其是分号和花括号,后面连接字符串解析会让你怀疑人生。
3.2 安装 ODBC 驱动并验证最小连通性
在 Job Server 所在服务器上装好驱动之后,先不要急着进 BODS,先单独验证驱动本身是好的。这一步能帮你把问题边界切干净——到底是驱动没装好,还是 BODS 配错,一次就知道。
验证手段可以用 PowerShell 调 .NET 的 ODBC 接口:
# 在 Windows 服务器上测试 ODBC 驱动与 MySQL 连通性 $connStr = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=10.10.0.5;Port=3306;Database=my_schema;User=bods_user;Password=Strong_Pass_2024;CHARSET=utf8mb4;" $conn = New-Object System.Data.Odbc.OdbcConnection($connStr) try { $conn.Open() Write-Host "连接成功,MySQL 版本:" $conn.ServerVersion } catch { Write-Host "连接失败:" $_.Exception.Message } finally { $conn.Close() }这段脚本里 Driver 名称必须和你 ODBC 管理器里看到的一模一样,一个字符都不能差;CHARSET=utf8mb4 是字符集参数,MySQL 8 默认就是 utf8mb4,但显式写出来可以避免驱动默认用 latin1 导致中文乱码。脚本能打印出连接成功,说明网络、端口、账号权限、驱动四件事全部没问题。要是这一步报错,就不要去 BODS 里排查了,先把这个最小验证搞通再说。
3.3 在管理控制台创建数据存储:连接字符串是一次性的
驱动验证通过后,打开 BODS 的管理控制台,进入「数据存储」管理页。数据存储是 BODS 对某个数据库连接信息的统一封装,BODS 里的数据流、作业、批量任务都通过它来获得对 MySQL 的访问能力。
创建数据存储时注意以下几点:
- 数据库类型选 MySQL,不要选成 ODBC 通用类型,否则后续操作类型提示会少很多
- 连接方式选「直接连接」,不要用 DSN,DSN 绑定本机注册表,迁移还要重配
- 连接字符串粘贴上一节 PowerShell 验证过的那一段
- 导入元数据:勾选需要读取的表、视图,BODS 会先读一次表结构生成元数据
这里要啰嗦一句元数据是什么。BODS 是强类型工具,设计 Dataflow 之前会先读取目标数据库的表结构,记录列名、数据类型、长度这些信息。你在 MySQL 里给表加了一列,BODS 里不刷新元数据的话,作业运行时拿到的还是旧结构,映射会错位,新列永远取不到。刷新操作随时可以做,在数据存储对象上点右键选刷新即可。
管理控制台的「测试连接」按钮只是个前置检查,通过只说明网络和认证没问题,不代表你的作业一定能跑通。你后续在数据流里用到的 LEFT JOIN、排序、函数,这些 SQL 语法 MySQL 支不支持,测试连接测不出来,得跑实际作业才知道。
3.4 在 Designer 里用 MySQL 连接跑通第一个数据流
连接配置完,真正见真章是在数据服务设计器里。新建一个数据流,拖入一个查询转换,源选刚建好的 MySQL 数据存储和一张表,目标用本地文件或者另一个数据存储,保存后执行。
第一次跑这个数据流,目的不是验证数据对不对,而是验证整条链路端到端是通的。如果失败,打开作业日志看错误码:MySQL 的 1142 是权限不足,2003 是连接超时,2002 是中途断连——日志里的错误码远比管理控制台的测试连接信息有诊断价值。跑通了,说明从 BODS 到驱动到 MySQL 这条链路上所有环节都正常,之后再做复杂的字段映射、增量抽取才有意义。
4. 连接 MySQL 的常见问题排查:现象、原因、处理
4.1 测试连接报错「未找到驱动」或「数据源未找到」
现象:管理控制台测试连接,几秒后报错,关键字是 driver not found 或 data source name not found。
原因:最常见是驱动位数和 Job Server 位数不匹配。64 位进程加载不了 32 位驱动,反之亦然。还一种可能性是连接字符串里 Driver 名称拼写与 ODBC 管理器里实际显示不一致,多一个空格都不行。
处理:先确认 Job Server 进程位数,装对应位数的驱动;再打开 ODBC 管理器,把驱动列表里的完整名字复制出来,粘贴到连接字符串里。我的习惯是装完驱动就把名称存到记事本,需要时直接复制,绝不手打。
4.2 能连上但抽出来的中文全是问号或乱码
现象:数据流能够成功执行,但目标端看到的中文全是乱码或问号,英文数字正常。
原因:字符集问题发生在三个环节。一是连接字符串没有指定 CHARSET,驱动用默认字符集;二是 MySQL 表和库本身的字符集不是 utf8mb4;三是 BODS 数据存储的代码页属性设置不对。
处理:先查表和库的字符集:
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'your_table';如果查出来的排序规则不是 utf8mb4 开头,建议先在测试表上执行 ALTER TABLE 转换字符集,评估完影响再推到生产。同时把 BODS 数据存储的代码页属性改为 UTF-8。三步做完再跑一遍,一般乱码问题都能解决。注意改表字符集是重操作,大表可能会锁表或重建,操作前务必评估业务影响。
4.3 密码带特殊字符导致连接失败
现象:测试连接报错,信息含糊,检查用户名密码明明是对的,就是连不上。
原因:ODBC 连接字符串属于键值对格式,分号是分隔符,花括号是转义符。密码里要是有分号、花括号、反斜杠这些字符,连接字符串解析的时候会把密码截断掉,你看到的密码是完整的,驱动看到的却是残缺的。
处理:最省事的办法是约定集成账号密码只用字母数字。如果密码不能改,那就用花括号把密码括起来,比如Password={ab;cd}。注意密码本身含花括号还得再转义,麻烦得很。我一般在项目启动时就约定:系统间集成账号的密码不允许带分号和花括号,从源头断了这类问题。
4.4 定时作业经常中途断连
现象:手动跑数据流没问题,定时批处理跑到一半报连接已关闭。
原因:MySQL 服务端的 wait_timeout 参数太短,连接空闲超过阈值被服务端回收;另一个可能是数据流里某一步执行时间太长,连接在事务中间断了。
处理:调大 MySQL 的 wait_timeout,比如从默认 28800 秒改成 86400 秒,改完要确认对服务器的连接数影响。同时,BODS 数据存储的高级属性里把连接超时时间调大,开启自动重连。还有个小技巧:批处理开始之前先跑一条SELECT 1让连接保持活跃,如果这条轻查询能过,再放进主数据流,避免它作为第一个实际操作去承担冷启动的负担。
5. 把连接从「能用」做到「好用」:三个进阶习惯
连接通了只是入门,后面维护才是大头。说三个我踩坑踩出来的习惯,照着做能少走不少弯路。
5.1 把连接信息做成统一变量
连接字符串不要散落在各个作业里。在 BODS 里建全局变量,把 Server、端口、用户、密码都放到变量里,作业引用变量。这样以后密码定期更换,只改一处,其他作业自动生效。如果你有多个环境(测试、预发布、生产),每个环境维护一套变量值,发布的时候不用动作业代码,只切换变量集。
5.2 每次改动 MySQL 表结构后立即刷新元数据
我的规矩是:MySQL 侧任何 DDL 操作之后,当日必须到 BODS 数据存储刷一次元数据。加列、删列、改长度、改类型,都要刷。否则哪天抽数作业莫名其妙失败,日志提示映射错误,你查半天才发现是昨天 DBA 加了个字段没告诉你。这类坑属于「延迟爆发型」,一次漏刷新,后面每次跑到那个字段都错,排查成本极高。
5.3 上线前跑一个 5 分钟的冒烟数据流
每次改完连接配置,不直接上全量作业。先建一个最小数据流,连同一张表,读 100 行,打印结果,确认字段、字符、连接稳定性都没问题,再启动正式作业。这个 5 分钟冒烟验证能挡掉绝大多数低级失误。尤其是改了密码、换了驱动版本、迁移过服务器之后,不跑冒烟就抢上线,基本等于赌运气。
我早期做某数据仓库对接项目,就是图快跳过冒烟直接跑全量,结果一个字符集问题让整批数据变成问号,后端报表团队当天晚上全在等我返工。从那以后,连接层改动必跑冒烟成了我的铁律。代码写得好不如连接配得稳,BODS 连 MySQL 这件事,做到能跑只是及格,做到能稳定跑一年才算过关,希望帮到你。
本文还有配套的精品资源,点击获取