无法通过CLI访问Azure MySQL服务器,但可以使用JDBC连接,无法创建新用户(“语法错误”)

问题描述 投票:0回答:1

由于作为数据 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

mysql azure jdbc database-connection
1个回答
0
投票

错误1045(28000):用户'[email protected]@pipeline'@'10.0.00.0'的访问被拒绝(使用密码:YES)

您遇到的错误可能有以下多种原因:

  • 用户名或密码不正确: 用于连接数据库的登录名或密码可能不正确,这是导致此问题的最常见原因。
  • 主机不正确:对于您尝试访问的服务器,您使用的主机名或IP地址必须准确且合法。
  • 缺少权限:检查您尝试连接的用户是否具有数据库所需的访问权限。
  • 防火墙或网络配置: 检查 MySQL 端口(通常为 3306)是否被防火墙阻止,以及您的网络设置是否允许您访问数据库。

我还尝试使用 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)'"

enter image description here

并且使用 SQL 登录也可以使用以下命令。

mysql -h servername.mysql.database.azure.com -u "username" -p

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.