Биллинговая система Nodeny

Главная категория => Nodeny Plus => Тема начата: Tooreagen от 11 Января 2018, 09:48:00



Название: Функция normalize_ippool в последней ревизии 489
Отправлено: Tooreagen от 11 Января 2018, 09:48:00
Обновился до ревизии 489 получил такое сообщение:

Код:
You need to create function normalize_ippool!
Execute in mysql:

DROP FUNCTION IF EXISTS `normalize_ippool`;
DELIMITER $$
CREATE FUNCTION `normalize_ippool` ()
    RETURNS TINYINT NO SQL
BEGIN
    DECLARE mid INTEGER UNSIGNED;

    CREATE TEMPORARY TABLE temp_ip_pool(
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        ip_id BIGINT UNSIGNED NOT NULL,
        PRIMARY KEY (id)
    );

    SELECT MAX(id) into mid FROM ip_pool;
    UPDATE ip_pool SET id = id + mid;
    INSERT temp_ip_pool (SELECT NULL, id FROM ip_pool ORDER BY realip, type, tags);
    UPDATE ip_pool i JOIN temp_ip_pool t ON i.id = t.ip_id SET i.id = t.id;
    DROP TEMPORARY TABLE IF EXISTS temp_ip_pool;

    RETURN 1;
END$$
DELIMITER ;

За что отвечает данная функция и что будет если ее не создать?


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Efendy от 11 Января 2018, 10:14:58
Причина ее введения указана в этой ветке: http://forum.nodeny.com.ua/index.php?topic=3034.0

Она вызывается после каждого ручного изменения пула ip и просто физически группирует записи. Это нужно для того, чтобы при выдаче динамических ip помочь mysql быстрее их выдавать. Для этого необходимо изменить процедуру выдачи ip - я там в примерах привел как, если коротко, то выдача свободного ip теперь идет не как "дай первый свободный ip", а как "дай любой свободный ip в данном диапазоне". В первом случае при большой нагрузке, когда много абонов в один момент пытаются получить ip, процедура пытается зарезервировать один и тот же ip, по итогу все разруливается на уровне mysql и один и тот же ip не выдается, но из-за большой нагрузки mysql может попасть в deadlock - запнется на долго, если коротко.

Если у вас такой проблемы (с дедлоками) нет - можно процедуры не менять и соответсвенно функцию не создавать. С другой стороны, почему бы в любом случае не повысить производительность системы?  


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Fredik от 28 Сентября 2019, 21:30:28
может не в тему но ответа не нашел
при выполнении пишет ошибку
выполняем вот это
Цитировать
DROP FUNCTION IF EXISTS `normalize_ippool`;
DELIMITER 21826
CREATE FUNCTION `normalize_ippool` ( )
    RETURNS TINYINT NO SQL
BEGIN
    DECLARE mid INTEGER UNSIGNED;

    SELECT MAX(id) into mid FROM ip_pool;
    UPDATE ip_pool SET id = id + mid;
    SET  = 0;
    UPDATE ip_pool SET id = :=+1 ORDER BY realip, type, tags;

    RETURN 1;
END21826
DELIMITER ;

пишет вот это
Цитировать
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= 0;
    UPDATE ip_pool SET id = :=+1 ORDER BY realip, type, tags;

    RETUR' at line 8


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Efendy от 29 Сентября 2019, 18:39:45
Пропал символ @ куда-то:

Код:
DROP FUNCTION IF EXISTS `normalize_ippool`;
DELIMITER $$
CREATE FUNCTION `normalize_ippool` ( )
    RETURNS TINYINT NO SQL
BEGIN
    DECLARE mid INTEGER UNSIGNED;

    SELECT MAX(id) into mid FROM ip_pool;
    UPDATE ip_pool SET id = id + mid;
    SET @i = 0;
    UPDATE ip_pool SET id = @i:=@i+1 ORDER BY realip, type, tags;

    RETURN 1;
END$$
DELIMITER ;

Видимо при печати в консоль, инсталлятор отфильтровал эти символы. Исправлю


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: WideAreaNetwork от 12 Января 2022, 19:52:48
на насе сделали обновление, далее perl install.pl -x и получили в конце такое
Код:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
You need to create function normalize_ippool!
Execute in mysql:

DROP FUNCTION IF EXISTS `normalize_ippool`;
DELIMITER 71904
CREATE FUNCTION `normalize_ippool` ( )
    RETURNS TINYINT NO SQL
BEGIN
    DECLARE mid INTEGER UNSIGNED;

    SELECT MAX(id) into mid FROM ip_pool;
    UPDATE ip_pool SET id = id + mid;
    SET @i = 0;
    UPDATE ip_pool SET id = @i:=@i+1 ORDER BY realip, type, tags;

    RETURN 1;
END71904
DELIMITER ;

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

это заклинание выполнил в мускуле на билингу, в итоге при выполнении на насе perl install.pl -x получаю в конце вышеуказанное заклинание
подскажите плиз так и должно быть? судя по ответам в теме не должно было больше показывать это уведомление


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: WideAreaNetwork от 12 Января 2022, 19:53:21
пс. обновляли до версии NEXT


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Efendy от 14 Января 2022, 16:22:06
Запусти в msql:
Код:
SELECT normalize_ippool() AS ok;
что выдает?


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: WideAreaNetwork от 14 Января 2022, 17:41:31
Запусти в msql:
Код:
SELECT normalize_ippool() AS ok;
что выдает?
Код:
mysql> SELECT normalize_ippool() AS ok;
+------+
| ok   |
+------+
|    1 |
+------+
1 row in set (10.40 sec)



Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Warlock от 14 Января 2022, 20:14:54
Такое у меня было на mysql 5.7. пришлось поставить 5.6, там такой проблемы нет


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Efendy от 16 Января 2022, 01:47:12
не, ну откатывать мускул из-за предупреждения... Функция работает, возвращает 1. Почему скрипт это не увидел - хз, буду думать. Пока игнорьте это предупреждение


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: WideAreaNetwork от 16 Января 2022, 09:10:19
ок, спасибо


Название: Re: Функция normalize_ippool в последней ревизии 489
Отправлено: Warlock от 16 Января 2022, 18:21:10
Это было на тестовом сервере. В рабочем работает на 5.5. смысл обновлять, если всё работает )