MaxScale 块直接连接到数据库
MaxScale blocks direct connect to database
我有一个 2 节点的 mariadb 集群和一个 maxscale 负载均衡器。
如果我想直接连接到数据库,maxscale 会阻止连接:例如:
mysql -h 35.300.208.100 -u finn -p
有效,如果我然后执行 USE test
我可以用数据库 "test" 做任何事情。所以权利是正确的。
但是如果执行 mysql -h 35.300.208.100 -u finn -p test
我会收到错误消息:
ERROR 1045 (28000): Access denied for user 'finn'@'188.68.43.150' (using password: YES) to database 'test'
因此,如果我在具有本地主机的节点上执行相同的操作,则一切正常。
大多数情况下,当数据库中的授权不包含客户端 IP 和 MaxScale IP 的匹配授权时,您会收到 ERROR 1045 (28000): Access denied
。
解决这个问题的通常方法是:
- 从客户端服务器
在数据库上执行SHOW GRANTS
- 在 MaxScale 服务器的数据库上执行
SHOW GRANTS
- 比较两个查询的输出并确保它们相同
这通常足以发现数据库中的授权问题。
解决此类错误的另一种方法是执行 MaxScale 用于加载数据库用户的查询。这些查询的确切 SQL 可以在 MaxScale wiki on GitHub 上找到。对于 MaxScale 2.1 和更新版本,这将是:
SELECT u.user, u.host, d.db, u.select_priv, u.password
FROM mysql.user AS u LEFT JOIN mysql.db AS d
ON (u.user = d.user AND u.host = d.host)
UNION
SELECT u.user, u.host, t.db, u.select_priv, u.password
FROM mysql.user AS u LEFT JOIN mysql.tables_priv AS t
ON (u.user = t.user AND u.host = t.host);
这应该 return 包含 MaxScale 使用的身份验证数据的结果集。这是查询可以 return:
的示例
+---------------+-----------+------+-------------+-------------------------------------------+
| user | host | db | select_priv | password |
+---------------+-----------+------+-------------+-------------------------------------------+
| root | localhost | NULL | Y | |
| maxuser | 127.0.0.1 | NULL | Y | *5EDBD32E469DAE0CE10E6999C3899DEFCB9F12E0 |
| root | % | NULL | Y | |
| maxuser | % | NULL | Y | *5EDBD32E469DAE0CE10E6999C3899DEFCB9F12E0 |
| skysql | 127.0.0.1 | NULL | Y | *85058F5DEAD82AE3507664C2C11BDA7B1827B80D |
| skysql | % | NULL | Y | *85058F5DEAD82AE3507664C2C11BDA7B1827B80D |
| test | % | NULL | Y | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
| Whosebug | % | test | N | *5635C63172887A7D7C0828876228A5E4DC523969 |
| Whosebug | % | NULL | N | *5635C63172887A7D7C0828876228A5E4DC523969 |
+---------------+-----------+------+-------------+-------------------------------------------+
select_priv
告诉用户是否允许连接任何默认数据库。如果设置为 N
,则 db
列中的值是唯一允许客户端使用的数据库。正如我们从示例结果中看到的,'Whosebug'@'%'
用户可以在没有默认数据库的情况下或使用 test
默认数据库进行连接。
我有一个 2 节点的 mariadb 集群和一个 maxscale 负载均衡器。
如果我想直接连接到数据库,maxscale 会阻止连接:例如:
mysql -h 35.300.208.100 -u finn -p
有效,如果我然后执行 USE test
我可以用数据库 "test" 做任何事情。所以权利是正确的。
但是如果执行 mysql -h 35.300.208.100 -u finn -p test
我会收到错误消息:
ERROR 1045 (28000): Access denied for user 'finn'@'188.68.43.150' (using password: YES) to database 'test'
因此,如果我在具有本地主机的节点上执行相同的操作,则一切正常。
大多数情况下,当数据库中的授权不包含客户端 IP 和 MaxScale IP 的匹配授权时,您会收到 ERROR 1045 (28000): Access denied
。
解决这个问题的通常方法是:
- 从客户端服务器 在数据库上执行
- 在 MaxScale 服务器的数据库上执行
SHOW GRANTS
- 比较两个查询的输出并确保它们相同
SHOW GRANTS
这通常足以发现数据库中的授权问题。
解决此类错误的另一种方法是执行 MaxScale 用于加载数据库用户的查询。这些查询的确切 SQL 可以在 MaxScale wiki on GitHub 上找到。对于 MaxScale 2.1 和更新版本,这将是:
SELECT u.user, u.host, d.db, u.select_priv, u.password
FROM mysql.user AS u LEFT JOIN mysql.db AS d
ON (u.user = d.user AND u.host = d.host)
UNION
SELECT u.user, u.host, t.db, u.select_priv, u.password
FROM mysql.user AS u LEFT JOIN mysql.tables_priv AS t
ON (u.user = t.user AND u.host = t.host);
这应该 return 包含 MaxScale 使用的身份验证数据的结果集。这是查询可以 return:
的示例+---------------+-----------+------+-------------+-------------------------------------------+
| user | host | db | select_priv | password |
+---------------+-----------+------+-------------+-------------------------------------------+
| root | localhost | NULL | Y | |
| maxuser | 127.0.0.1 | NULL | Y | *5EDBD32E469DAE0CE10E6999C3899DEFCB9F12E0 |
| root | % | NULL | Y | |
| maxuser | % | NULL | Y | *5EDBD32E469DAE0CE10E6999C3899DEFCB9F12E0 |
| skysql | 127.0.0.1 | NULL | Y | *85058F5DEAD82AE3507664C2C11BDA7B1827B80D |
| skysql | % | NULL | Y | *85058F5DEAD82AE3507664C2C11BDA7B1827B80D |
| test | % | NULL | Y | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
| Whosebug | % | test | N | *5635C63172887A7D7C0828876228A5E4DC523969 |
| Whosebug | % | NULL | N | *5635C63172887A7D7C0828876228A5E4DC523969 |
+---------------+-----------+------+-------------+-------------------------------------------+
select_priv
告诉用户是否允许连接任何默认数据库。如果设置为 N
,则 db
列中的值是唯一允许客户端使用的数据库。正如我们从示例结果中看到的,'Whosebug'@'%'
用户可以在没有默认数据库的情况下或使用 test
默认数据库进行连接。