Demasiadas conexiones / la reserva de conexiones se agotó
Demasiadas cosas le preguntaron a la base de datos a la vez y dejó de aceptar más. Suele pegar en tu momento de más gente.
Haz esto primero
Un script le está preguntando muchísimo más de lo debido. Este necesita que alguien encuentre cuál.
Qué significa
MySQL rechazó una conexión nueva porque ya está en max_connections, o la reserva de oxmysql no tiene un hueco libre y la espera se agotó. En un servidor en vivo esto aparece como todo lo que depende de la base de datos congelándose a la vez, normalmente en el pico de jugadores.
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
Una consulta dentro de un bucle de tick
Un hilo con
Wait(0)o un intervalo corto que consulta en cada vuelta. Un bucle así por jugador alcanza para agotar cualquier reserva. - 2
Consultas en un manejador de conexión de jugador
playerConnectingse ejecuta por cada entrada; una consulta lenta ahí retiene una conexión durante todo el saludo, y una oleada de entradas las retiene todas. - 3
La reserva es más chica de lo que el servidor necesita
Los valores por defecto de oxmysql son modestos. Un servidor de 200 slots que persiste datos por jugador necesita más.
- 4
Consultas largas que retienen conexiones
Un índice que falta convierte una consulta de 2 ms en una de 2 s, y la conexión queda retenida los 2 s enteros.
- 5
Otra aplicación comparte la instancia de MySQL
Un panel web, un bot de Discord, phpMyAdmin.
Cómo saber cuál es el tuyo
SHOW PROCESSLIST;
durante el problema. Consultas idénticas repetidas significan un bucle. Valores altos de Time significan índices que faltan. Después mirá qué permite MySQL:
SHOW VARIABLES LIKE 'max_connections';
Dónde mirar
Cualquier CreateThread que consulte, y cada manejador de playerConnecting.
Cómo arreglarlo
Guardá en memoria en vez de consultar dentro de un bucle, subí los techos, e indexá lo que filtrás:
# server.cfg set mysql_connection_string "mysql://user:pass@host/db?connectionLimit=20" -- MySQL SET GLOBAL max_connections = 300; CREATE INDEX idx_users_identifier ON users (identifier);
¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Script Optimizer detecta los patrones de consulta que causan esto.