Existe um limite para quantas "instâncias" de um evento agendado o MySQL pode executar? Eu configurei isso:
CREATE TABLE IF NOT EXISTS t (c1 INT UNSIGNED NOT NULL) ENGINE=INNODB;
SELECT * FROM t;
DELIMITER $$
DROP EVENT IF EXISTS e_second;
CREATE EVENT e_second ON SCHEDULE EVERY 1 SECOND
DO BEGIN
INSERT INTO t (c1) VALUES (UNIX_TIMESTAMP());
SELECT SLEEP(1000);
INSERT INTO t (c1) VALUES (UNIX_TIMESTAMP());
END$$
DELIMITER ;
SELECT * FROM t;
SHOW PROCESSLIST;
SHOW VARIABLES LIKE '%connect%';
Isso cria um evento burro iniciado a cada segundo, que é executado por 1.000 segundos. No meu log de consulta, eu realmente tenho:
2020-02-18T15:47:00.289050Z 1016 Query INSERT INTO t (c1) VALUES (UNIX_TIMESTAMP())
2020-02-18T15:47:00.430801Z 1216 Query INSERT INTO t (c1) VALUES (UNIX_TIMESTAMP())
2020-02-18T15:47:00.430950Z 1216 Query SELECT SLEEP(200)
2020-02-18T15:47:01.290518Z 1017 Query INSERT INTO t (c1) VALUES (UNIX_TIMESTAMP())
2020-02-18T15:47:01.430943Z 1217 Query INSERT INTO t (c1) VALUES (UNIX_TIMESTAMP())
...
Portanto, o evento é executado a cada segundo e trava (de propósito). Agora, a lista de processos mostra (depois de um tempo):
"559" "root-heidisql" "127.0.0.1" "test_sql" "Connect" "702" "User sleep" "SELECT SLEEP(1000)"
"560" "root-heidisql" "127.0.0.1" "test_sql" "Connect" "701" "User sleep" "SELECT SLEEP(1000)"
"561" "root-heidisql" "127.0.0.1" "test_sql" "Connect" "700" "User sleep" "SELECT SLEEP(1000)"
"562" "root-heidisql" "127.0.0.1" "test_sql" "Connect" "699" "User sleep" "SELECT SLEEP(1000)"
"563" "root-heidisql" "127.0.0.1" "test_sql" "Connect" "698" "User sleep" "SELECT SLEEP(1000)"
...
Então eu tenho cerca de 528 linhas nesta lista de processos agora. Mas, meu limite 151
de conexões é mostrado mostrando variáveis:
"max_connections" "151"
Então, claramente, os eventos em execução não fazem parte do limite de conexões. Então, qual é o limite? Existe um?
Parece-me que em algum momento, alguma fila/lista/qualquer coisa do mysql estará cheia de eventos pendentes... Este caso está documentado em algum lugar?
Limite de conexão significa conexões externas, agendador de eventos não é contado. Mas há muitos outros recursos limitados - limitados por algumas configurações ou por algumas condições físicas. E é muito problemático descobrir qual recurso limita o servidor.
Sim, tal limitação não existe. O MySQL trata um evento como um gatilho que dispara em um evento de timer - e não há limitação no número de gatilhos no sistema.
Em geral, o procedimento de evento deve verificar se sua instância anterior já terminou seu trabalho... usando algum campo/valor de flag em uma tabela de serviço, por exemplo, ou por alguma outra marca.