MySQL | Too many connections

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Операционная система
Linux
Привязал базу данных к сайту, но через время сайт выдаёт ошибку, что невозможно подключиться к базе по причиние: MySQL: Too many connections

Пользуюсь phpMyAdmin. Знаю как исправить, но не хватает прав, пишет: 1227 - В доступе отказано. Вам нужны привилегии SUPER для этой операции

Через ISP Manager всё установлено, проверял. Может можно как-то через root выдать SUPER права?
1590327748067.png
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #2
Если вдс и есть рут права - можно просто лимит поднять. А еще лучше разобраться нормально, откуда много коннектов к базе и исправить это.
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Если вдс и есть рут права - можно просто лимит поднять. А еще лучше разобраться нормально, откуда много коннектов к базе и исправить это.
Откуда такое количество подключений идёт: от Discord бота на запись данных и также от сайта на проверку(от сайта идёт только когда пользователь заходит на сайт)
Решением я и имел ввиду установить больше лимит, но выдаёт ошибку прав.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #8
от Discord бота на запись данных и также от сайта на проверку(от сайта идёт только когда пользователь заходит на сайт)
И Вы считаете достижение лимита в 200 соединений (дефолт для ISP Manager) нормальным?
У Вас бот навряд ли держит пул соединений (довольствуется скорее всего одним подключением, которое постоянно терзается), а на сайте единовременно 199 пользователей уж тем более. Да и даже если бы столько было, я слабо лично представляю, чтобы одновременно все эти 199 соединений были заблокированы. Это должен быть конкретный говнокод.
На этом форуме я одновременно наблюдал только 20 подключений, и это в пиковое время. Соединения создаются, выполняются запросы, и умирают.

Вам нужно ковырять в сторону оптимизации запросов, если Вы действительно упираетесь в лимит подключений и не можете его даже редактировать.

Поскольку я создатель базы, то у меня как у создателя идут все права автоматически.
Это не так работает.
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Оффтоп
Сообщения автоматически склеены:

И Вы считаете достижение лимита в 200 соединений (дефолт для ISP Manager) нормальным?
У Вас бот навряд ли держит пул соединений (довольствуется скорее всего одним подключением, которое постоянно терзается), а на сайте единовременно 199 пользователей уж тем более. Да и даже если бы столько было, я слабо лично представляю, чтобы одновременно все эти 199 соединений были заблокированы. Это должен быть конкретный говнокод.
На этом форуме я одновременно наблюдал только 20 подключений, и это в пиковое время. Соединения создаются, выполняются запросы, и умирают.

Вам нужно ковырять в сторону оптимизации запросов, если Вы действительно упираетесь в лимит подключений и не можете его даже редактировать.


Это не так работает.
Код запросов бота Discord.:
client.on('guildMemberAdd', async member => {
    const mysql = require('mysql2');
    const connection = mysql.createConnection({
        host: "localhost",
        user: "doggy",
        password: "*********",
        database:  "doggy"
    });
    connection.connect(err => {
    if (err){
        console.error(err);
    }

    connection.promise().query(`SELECT * FROM servers WHERE value`, () => {
        try {
            connection.query(`UPDATE servers SET value = ${doggy.guilds.size}`);
        }catch(err){
            console.error(err);
        }
    })

    connection.promise().query(`SELECT * FROM channels WHERE value`, () => {
        try {
            connection.query(`UPDATE channels SET value = ${doggy.channels.size}`);
        }catch(err){
            console.error(err);
        }
    })

    connection.promise().query(`SELECT * FROM users WHERE value`, () => {
        try {
            connection.query(`UPDATE users SET value = ${doggy.users.size}`);
        }catch(err){
            console.error(err);
        }
    })
    });
});
Код сайта:
<?php

function get_servers() {
    
    global $connect;
    
    $sql = "SELECT * FROM `servers` WHERE value";
    
    $result = mysqli_query($connect, $sql);
    
    $servers = mysqli_fetch_assoc($result);
    
    return $servers;
}

function get_channels() {
    
    global $connect;
    
    $sql = "SELECT * FROM `channels` WHERE value";
    
    $result = mysqli_query($connect, $sql);
    
    $channels = mysqli_fetch_assoc($result);
    
    return $channels;
}

function get_users() {
    
    global $connect;
    
    $sql = "SELECT * FROM `users` WHERE value";
    
    $result = mysqli_query($connect, $sql);
    
    $users = mysqli_fetch_assoc($result);
    
    return $users;
}

?>
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #10
Привилегии уровня SUPER выдаются глобально. Они не на базе.
1590329018139.png
Вы никогда в пользовательских правах на базе не найдёте этот уровень. Потому что он располагается на глобальном уровне:
1590329082863.png
Который ISP Manager никогда не делегирует, и не будет.

И на будущее. Скриншоты прячьте под спойлер:
1590329111950.png
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #12
client.on('guildMemberAdd', async member => { const mysql = require('mysql2'); const connection = mysql.createConnection({ host: "localhost", user: "doggy", password: "*********", database: "doggy" });
Вы создаёте подключение НА КАЖДЫЙ ВЫЗОВ КОМАНДЫ, вместо того, чтобы сделать его один раз и довольствоваться им. Переделайте нормально.
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Вы создаёте подключение НА КАЖДЫЙ ВЫЗОВ КОМАНДЫ, вместо того, чтобы сделать его один раз и довольствоваться им. Переделайте нормально.
JavaScript:
client.on('guildMemberAdd', async member => {
    const mysql = require('mysql2');
    const connection = mysql.createConnection({
        host: "localhost",
        user: "doggy",
        password: "*********",
        database:  "doggy"
    });
    connection.connect(err => {
    if (err){
        console.error(err);
    }

   
    connection.query(`UPDATE servers SET value = ${doggy.guilds.size}`);

    connection.query(`UPDATE channels SET value = ${doggy.channels.size}`);

    connection.query(`UPDATE users SET value = ${doggy.users.size}`);
       
});
Мне интересно, так будет заносить. По идее должно.
Сообщения автоматически склеены:

P.S. Нет, так не работает.
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
P.S. Нет, так не работает.

По хорошему, стоит обособить соединение к бд и использовать его в нужное время, нежели в эвенте дискорда, который вызывается несколько раз.
В вашем же случае, создается уйма коннектов, которые висят, пока мускул сам их не закроет, т.е. отсутствует метод end, либо же destroy, в случае, когда выполнение запросов не важно

Метод query принимает два параметра, либо 3 в случае с плейсхолдерами (вроде), плюсом он неявно вызывает подключение (это не значит, что метод connect не нужен или бесполезен...)

Вам же лучше ознакомиться с мануалами, нежели следовать концепции говнокодинга до конца
 

x330122

Участник
Сообщения
357
Реакции
152
JavaScript:
client.on('guildMemberAdd', async member => {
    const mysql = require('mysql2');
    const connection = mysql.createConnection({
        host: "localhost",
        user: "doggy",
        password: "*********",
        database:  "doggy"
    });
    connection.connect(err => {
    if (err){
        console.error(err);
    }

 
    connection.query(`UPDATE servers SET value = ${doggy.guilds.size}`);

    connection.query(`UPDATE channels SET value = ${doggy.channels.size}`);

    connection.query(`UPDATE users SET value = ${doggy.users.size}`);
     
});
Мне интересно, так будет заносить. По идее должно.
Сообщения автоматически склеены:

P.S. Нет, так не работает.
Сделай подключение к базе данных глобально по коду. Т.е ты через одно соединение сможешь все нужные тебе запросы отсылать.
Сообщения автоматически склеены:

JavaScript:
var connection = mysql.createConnection({
    host: '',
    user: '',
    password: '',
    database: ''
});
connection.connect();



client.on('guildMemberAdd', async member => {
    connection.query(`UPDATE servers SET value = ${doggy.guilds.size}`);

    connection.query(`UPDATE channels SET value = ${doggy.channels.size}`);

    connection.query(`UPDATE users SET value = ${doggy.users.size}`);
});
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Сделай подключение к базе данных глобально по коду. Т.е ты через одно соединение сможешь все нужные тебе запросы отсылать.
Сообщения автоматически склеены:

JavaScript:
var connection = mysql.createConnection({
    host: '',
    user: '',
    password: '',
    database: ''
});
connection.connect();



client.on('guildMemberAdd', async member => {
    connection.query(`UPDATE servers SET value = ${doggy.guilds.size}`);

    connection.query(`UPDATE channels SET value = ${doggy.channels.size}`);

    connection.query(`UPDATE users SET value = ${doggy.users.size}`);
});
MySQL через время закрывает соединение, если оно неактивно.
 

x330122

Участник
Сообщения
357
Реакции
152
MySQL через время закрывает соединение, если оно неактивно.
Можешь сделать функцию которая будет в случае чего отсылать соединение заного, например:
JavaScript:
function CheckConnection() {
    var STATEX = connection.state.toString();
    if (STATEX != "authenticated") {
        connection.connect();
    }
}
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Можешь сделать функцию которая будет в случае чего отсылать соединение заного, например:
JavaScript:
function CheckConnection() {
    var STATEX = connection.state.toString();
    if (STATEX != "authenticated") {
        connection.connect();
    }
}
Ну, как вариант.
 

xyligan

Паркетный пол трещит под моей крышкой черепной
Сообщения
900
Реакции
433
Сверху Снизу