由于作为数据 Lakehouse 项目一部分的一些特定于客户端的原因,我需要定期将数据转储作为 mysql 数据库摄取到 Azure MySQL 灵活服务器。
我可以在 Databricks 环境中使用 Spark JDBC 连接器很好地连接到数据库,并且我能够使用 Azure 服务原则访问服务器主机本身,但我被 MySQL Auth 阻止。
我已经设置了 mysql 服务器以允许 MySQL 和 AAD auth,并且我尝试了 MySQL 管理员登录和 aad 登录,但没有成功。 服务器设置为仅允许在虚拟网络内联网,其中也包含客户端计算机,但这确实使调试变得烦人。
Hoewver,我可以使用 pyspark JDBC(databricks env 中的 python 笔记本)使用 MySQL 用户名和密码(对应于占位符“myproject_admin”和“Theactualpasswordincode”)进行连接 - 请参阅下面的示例。
我的第一直觉是创建一个新用户供我使用,但我不断收到语法错误,并且我看到了对 Stack Overflow 答案的数量的响应,人们得到了相同的错误,但似乎没有人这样做有解释/解决方案。
我尝试过使用或不使用分号、各种引号排列(是的,它们是正确的),但我仍然不知道发生了什么。
有谁知道发生了什么或者有关于如何让 CLI 提示工作的想法吗?(理想情况下不涉及通过 JDBC 解析数据转储)
这个关于套接字差异的线程可能很关键,但如果无法更改权限,我真的不能做太多事情。
尝试使用服务主体和 AAD 身份验证进行 cli 访问:
%sh
az login --service-principal -u $AUTHID -p $AUTHPASSWORD --tenant $AZTENANT
mysql -h project-name-mysql-server.mysql.database.azure.com --user [email protected]@project-name --enable-cleartext-plugin --password=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken` -
ERROR 1045 (28000): Access denied for user '[email protected]@pipeline'@'10.0.00.0' (using password: YES)
尝试使用本机 MySQL 身份验证进行 cli 访问:
%sh
mysql -h project-name-mysql-server.mysql.database.azure.com -u myproject_admin -pTheactualpasswordincode
ERROR 1045 (28000): Access denied for user 'myproject_admin'@'10.0.00.0' (using password: YES)
尝试使用 JDBC 创建用户:
%py
query: str = f"CREATE USER 'datadumpuploader'@'10.0.00.0' IDENTIFIED BY 'atestpassword';"
run_jdbc_query(source=source, query=query)
java.sql.SQLSyntaxErrorException: (conn=88) 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的 'CREATE USER 'datadumpuploader'@'10.0.00.0' IDENTIFIED BY 'atestpassword';) SPARK_GEN_' 附近使用的正确语法
尝试普通的 JDBC 查询:(也是壮举。有用的表):
%py
source: Source = Source(
name="data_dump",
server_url="jdbc:mysql://project-name-mysql-server.mysql.database.azure.com:3306/",
user=dbutils.secrets.get(secret_scope, "project-name-mysql-server-username"),
password=dbutils.secrets.get(secret_scope, "project-name-mysql-server-password"),
)
df: SparkDf = run_jdbc_query(source=source, query="SELECT user,authentication_string,plugin,host FROM mysql.user")
display(df)
df:
用户 | 身份验证字符串 | 插件 | 主持人 |
---|---|---|---|
mysqlConnectorServicePrincipal | AADAdmin:9999aa99-9aaa9-999a-a99a-a9999a999a9a:upn:mysqlConnectorServicePrincipal | aad_auth | % |
[已编辑] | *9999AA9999AAAAAAA999A99AAAA999A99AAAAA99 | mysql_native_password | % |
mysql.sys | $A$005$这是一个不可使用的有效盐和密码的组合 | 缓存_sha2_密码 | 本地主机 |
mysql.session | $A$005$这是一个不可使用的有效盐和密码的组合 | 缓存_sha2_密码 | 本地主机 |
mysql.infoschema | $A$005$这是一个不可使用的有效盐和密码的组合 | 缓存_sha2_密码 | 本地主机 |
azure_超级用户 | . | mysql_native_password | 本地主机 |
azure_超级用户 | . | mysql_native_password | 127.0.0.1 |
所以它在表中字面意思是“[已编辑]”,我假设它对应于我在设置过程中输入的管理员用户名 - 即占位符 myproject_admin - 我认为这很好,因为我仍然可以使用 JDBC 连接。
MySQL 版本 8.0
错误1045(28000):用户'[email protected]@pipeline'@'10.0.00.0'的访问被拒绝(使用密码:YES)
您遇到的错误可能有以下多种原因:
我还尝试使用 Azure MySQL AAD 凭据,并能够使用以下命令成功登录。
mysql -h servername.mysql.database.azure.com --user "AAD username" --enable-cleartext-plugin "--password='$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)'"
并且使用 SQL 登录也可以使用以下命令。
mysql -h servername.mysql.database.azure.com -u "username" -p