-
-
Save lefred/77ddbde301c72535381ae7af9f968322 to your computer and use it in GitHub Desktop.
USE sys; | |
DELIMITER $$ | |
CREATE FUNCTION IFZERO(a INT, b INT) | |
RETURNS INT | |
DETERMINISTIC | |
RETURN IF(a = 0, b, a)$$ | |
CREATE FUNCTION LOCATE2(needle TEXT(10000), haystack TEXT(10000), offset INT) | |
RETURNS INT | |
DETERMINISTIC | |
RETURN IFZERO(LOCATE(needle, haystack, offset), LENGTH(haystack) + 1)$$ | |
CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000)) | |
RETURNS TEXT(10000) | |
DETERMINISTIC | |
RETURN GTID_SUBTRACT(g, '')$$ | |
CREATE FUNCTION GTID_COUNT(gtid_set TEXT(10000)) | |
RETURNS INT | |
DETERMINISTIC | |
BEGIN | |
DECLARE result BIGINT DEFAULT 0; | |
DECLARE colon_pos INT; | |
DECLARE next_dash_pos INT; | |
DECLARE next_colon_pos INT; | |
DECLARE next_comma_pos INT; | |
SET gtid_set = GTID_NORMALIZE(gtid_set); | |
SET colon_pos = LOCATE2(':', gtid_set, 1); | |
WHILE colon_pos != LENGTH(gtid_set) + 1 DO | |
SET next_dash_pos = LOCATE2('-', gtid_set, colon_pos + 1); | |
SET next_colon_pos = LOCATE2(':', gtid_set, colon_pos + 1); | |
SET next_comma_pos = LOCATE2(',', gtid_set, colon_pos + 1); | |
IF next_dash_pos < next_colon_pos AND next_dash_pos < next_comma_pos THEN | |
SET result = result + | |
SUBSTR(gtid_set, next_dash_pos + 1, | |
LEAST(next_colon_pos, next_comma_pos) - (next_dash_pos + 1)) - | |
SUBSTR(gtid_set, colon_pos + 1, next_dash_pos - (colon_pos + 1)) + 1; | |
ELSE | |
SET result = result + 1; | |
END IF; | |
SET colon_pos = next_colon_pos; | |
END WHILE; | |
RETURN result; | |
END$$ | |
CREATE FUNCTION gr_applier_queue_length() | |
RETURNS INT | |
DETERMINISTIC | |
BEGIN | |
RETURN (SELECT sys.gtid_count( GTID_SUBTRACT( (SELECT | |
Received_transaction_set FROM performance_schema.replication_connection_status | |
WHERE Channel_name = 'group_replication_applier' ), (SELECT | |
@@global.GTID_EXECUTED) ))); | |
END$$ | |
CREATE FUNCTION gr_member_in_primary_partition() | |
RETURNS VARCHAR(3) | |
DETERMINISTIC | |
BEGIN | |
RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROM | |
performance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >= | |
((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0), | |
'YES', 'NO' ) FROM performance_schema.replication_group_members JOIN | |
performance_schema.replication_group_member_stats USING(member_id)); | |
END$$ | |
CREATE VIEW gr_member_routing_candidate_status AS SELECT | |
sys.gr_member_in_primary_partition() as viable_candidate, | |
IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROM | |
performance_schema.global_variables WHERE variable_name IN ('read_only', | |
'super_read_only')) != 'OFF,OFF'), 'YES', 'NO') as read_only, | |
sys.gr_applier_queue_length() as transactions_behind, Count_Transactions_in_queue as 'transactions_to_cert' from performance_schema.replication_group_member_stats;$$ | |
DELIMITER ; |
Hi @lefred
I'm also seeing the same error as @dungdm93
SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 08944f18-504f-11e8-bcfa-12262f7a10f8 | re-fn-sql-2 | 3306 | RECOVERING | SECONDARY | 8.0.11 |
| group_replication_applier | 2f9abf14-5038-11e8-8a6a-8a384fff7eff | re-fn-sql-3 | 3306 | ONLINE | SECONDARY | 8.0.11 |
| group_replication_applier | df64619a-5037-11e8-ba35-2a9e5f2f8438 | re-fn-sql-1 | 3306 | ONLINE | PRIMARY | 8.0.11 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
mysql> select * from gr_member_routing_candidate_status;
1242 - Subquery returns more than 1 row
Grateful for any assistance
子查询查询超过一行。
是因为mysql版本的问题。
你可以在replication_group_member_stats 表添加筛选当前主机的条件。
"Subquery returns more than 1 row"
you can do this:
add where
USE sys;
DELIMITER $$
DROP FUNCTION gr_member_in_primary_partition$$
DROP VIEW gr_member_routing_candidate_status$$
CREATE FUNCTION gr_member_in_primary_partition()
RETURNS VARCHAR(3)
DETERMINISTIC
BEGIN
RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROM
performance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >=
((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0),
'YES', 'NO' ) FROM performance_schema.replication_group_members JOIN
performance_schema.replication_group_member_stats rgms USING(member_id) WHERE rgms.MEMBER_ID=@@SERVER_UUID);
END$$
CREATE VIEW gr_member_routing_candidate_status AS SELECT
sys.gr_member_in_primary_partition() as viable_candidate,
IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROM
performance_schema.global_variables WHERE variable_name IN ('read_only',
'super_read_only')) != 'OFF,OFF'), 'YES', 'NO') as read_only,
sys.gr_applier_queue_length() as transactions_behind, Count_Transactions_in_queue as 'transactions_to_cert'
from performance_schema.replication_group_member_stats rgms
where rgms.MEMBER_ID=(select gv.VARIABLE_VALUE
from `performance_schema`.global_variables gv where gv.VARIABLE_NAME='server_uuid');$$
DELIMITER ;
select gr_member_in_primary_partition();
select * from gr_member_routing_candidate_status;
Hello @lefred
I have a MySQL InnoDB cluster with 3 nodes:
And when runing
gr_member_in_primary_partition
, I got below error: