您说得对!SHOW READWRITE_SPLITTING RULES
只能显示逻辑名称。要获取实际的 IP 地址,需要通过其他方式查询。以下是几种解决方案:
方法一:查询资源信息表(推荐)
-- 查看所有数据源的详细连接信息
SELECT * FROM information_schema.resources;
示例输出:
+----------------+-----------+----------------+-------+------+-------+
| name | type | host | port | ... | props |
+----------------+-----------+----------------+-------+------+-------+
| primary-ds | MySQL | 192.168.1.100 | 3306 | ... | {...} |
| replica0 | MySQL | 192.168.1.101 | 3306 | ... | {...} |
| replica1 | MySQL | 192.168.1.102 | 3306 | ... | {...} |
+----------------+-----------+----------------+-------+------+-------+
方法二:结合读写分离规则和资源表查询
-- 先查看读写分离规则
SHOW READWRITE_SPLITTING RULES;
-- 然后根据规则中的名称查询具体资源
SELECT name, host, port, schema
FROM information_schema.resources
WHERE name IN ('primary-ds', 'replica0', 'replica1');
方法三:使用系统函数查询当前连接
-- Hint强制路由到读库后查询实际连接信息
SET readwrite_splitting hint source = 'replica0';
SELECT @@hostname as host_ip, USER() as connection_user;
-- Hint强制路由到写库
SET readwrite_splitting hint source = 'primary-ds';
SELECT @@hostname as host_ip, USER() as connection_user;
方法四:通过JDBC URL解析(如果配置在props中)
-- 查看资源的完整配置(包含JDBC URL)
SELECT name, props FROM information_schema.resources;
-- JDBC URL通常格式为:jdbc:mysql://192.168.1.101:3306/db_name
完整的查询示例:
-- Step 1: 查看读写分离规则中的逻辑名称
SHOW READWRITE_SPLITTING RULES;
-- Step 2: 根据逻辑名称查询实际IP地址
SELECT
r.name as resource_name,
r.host as ip_address,
r.port as port,
CASE
WHEN r.name = (SELECT write_data_source FROM readwrite_splitting_rules LIMIT 1)
THEN 'WRITE'
ELSE 'READ'
END as role
FROM information_schema.resources r
WHERE r.name IN (
SELECT write_data_source FROM readwrite_splitting_rules
UNION ALL
SELECT read_data_sources FROM readwrite_splitting_rules
);
注意事项:
- 权限要求:需要
SELECT
权限访问information_schema.resources
表 - 版本兼容:适用于 ShardingSphere-Proxy 5.x版本
- 结果解读:
host
字段即为IP地址或主机名port
字段为数据库端口号
这样就能准确获取到读写分离环境中各个数据库实例的实际IP地址了!
内容由零声教学AI助手提供,问题来源于学员提问