mysql社区版不支持authentication_ldap_simple或authentication_ldap_sasl插件,仅企业版提供;社区版唯一可行路径是pam中转,通过auth_pam插件调用系统pam_ldap.so或pam_sss.so对接ldap/ad,依赖操作系统级配置而非纯mysql操作。

确认你用的是企业版还是社区版,这直接决定能走哪条路
MySQL 社区版不支持 authentication_ldap_simple 或 authentication_ldap_sasl 插件——这两个插件只存在于 MySQL Enterprise Edition。你运行 SELECT VERSION(); SHOW VARIABLES LIKE 'license';,如果返回 GPL,就别折腾 LDAP 插件了,后面所有配置都会失败。
社区版唯一可行路径是 PAM 中转:MySQL 加载 auth_pam 插件 → 调用系统 PAM → 由 pam_ldap.so 或 pam_sss.so 连 AD/LDAP。这条路依赖操作系统级配置,不是纯 MySQL 操作。
- 企业版(5.7.19+)可用
authentication_ldap_simple,但仅限明文密码 + TLS 链路,且需手动配ldap_bind_base_dn和ldap_server_host - 企业版(8.0.16+)或社区版(8.0.28+)才可能用
authentication_ldap_sasl,但它不读 MySQL 变量,只认系统级/etc/openldap/ldap.conf和 SASL 库 - Windows 上
authentication_ldap_sasl服务端插件不可用,只能走客户端 SASL 工具配合,实操难度陡增
加载插件失败?先查文件、权限和启动参数
INSTALL PLUGIN auth_pam SONAME 'auth_pam.so' 报错 “Plugin is disabled” 或 “not loaded”,大概率不是命令写错了,而是底层没到位:
-
SHOW VARIABLES LIKE 'plugin_dir';查出路径后,确认auth_pam.so(Linux)或auth_pam.dll(Windows)真在那目录里,且 mysqld 进程用户(通常是mysql)有读权限 - Linux 下检查 SELinux 是否拦截:
ausearch -m avc -ts recent | grep mysqld;Windows 上留意 Defender 是否阻止 dll 加载 - 社区版用
authentication_ldap_sasl时,--plugin-load-add=authentication_ldap_sasl.so必须写进my.cnf的[mysqld]段并重启,仅靠INSTALL PLUGIN不持久 - 插件依赖系统库:RHEL/CentOS 要
cyrus-sasl-plain+openldap-clients;Ubuntu/Debian 要libsasl2-modules+ldap-utils,缺一个就加载失败
创建用户时 AS 子句写错,登录必然失败
无论走 PAM 还是 LDAP 插件,CREATE USER 里的 AS 不是填密码,而是告诉 MySQL “去哪找这个人”:
- PAM 路径:
CREATE USER 'jdoe'@'%' IDENTIFIED WITH auth_pam AS 'mysqld';——'mysqld'必须和/etc/pam.d/mysqld文件名完全一致(不含路径、不含扩展名、大小写敏感) -
authentication_ldap_sasl路径:CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_ldap_sasl AS 'CN=alice,CN=Users,DC=example,DC=com';—— DN 格式必须和 AD 实际结构一模一样,CN=Users不能写成OU=Users,sAMAccountName不能当uid用 - 漏写
IDENTIFIED WITH或误写成IDENTIFIED BY,MySQL 就默认走本地密码验证,LDAP 根本不触发 - 用户名必须和 LDAP 中的
uid或sAMAccountName逐字相同:AD 里是zhang.san,就不能用zhangsan登录
调试时别只盯 MySQL 日志,关键信息藏在系统日志里
MySQL 错误码 ERROR 1045 (28000) 或 Access denied 本身不说明 LDAP 哪里错了。真正有用的线索在:
- Linux:
tail -f /var/log/secure—— PAM 模块会在这里记下收到的用户名、bind 结果、是否 fallback 到本地校验 - MySQL 启动日志(error log)中搜索
LDAP或SASL,看有没有Failed to initialize plugin或Cannot load sasl library - 用
ldapsearch -x -H ldap://your-ad-server -D "cn=admin,dc=example,dc=com" -w 'pwd' -b "dc=example,dc=com" "(sAMAccountName=jdoe)"手动验证连通性和 DN 可达性,比 MySQL 报错更早暴露问题 - 开启
log_error_verbosity = 3后,MySQL 才会在错误日志里输出 LDAP bind 的具体失败原因(比如Invalid credentials),否则静默失败
最常被忽略的一点:即使 LDAP 认证成功,MySQL 权限系统仍按 'jdoe'@'192.168.1.%' 这样的 host 规则做二次校验,host 不匹配照样拒绝连接——这不是认证问题,是授权问题。











