Архив рубрики: MySQL

Вложеный запрос в процедуре MySQL, курсоры и прочие прелести

Оставляю код процедуры для «истории».

CREATE  PROCEDURE `GetInfo`(IN `mac_sw` VARCHAR(20), IN `port_sw` VARCHAR(20)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN
DECLARE value2 varchar(200); 
DECLARE type2 int(11); 
DECLARE code2 int(11); 
DECLARE cnt INT(10);
DECLARE DONE integer default 0;
DECLARE ip_cur CURSOR FOR SELECT code, type, value FROM dhcp_subnets where segment_id in (SELECT segment_id FROM dhcp_clients_by_relay WHERE upper(relay_id) = upper(mac_sw) AND upper(relay_port) = upper(port_sw)) UNION SELECT code, type, value FROM dhcp_clients_by_relay WHERE upper(relay_id) = upper(mac_sw) AND upper(relay_port) = upper(port_sw) ORDER BY CODE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
   OPEN ip_cur;  
   SET cnt=0;
   REPEAT
     FETCH ip_cur INTO code2,type2,value2;
     IF NOT DONE THEN
       SELECT code2 as code,type2 as type,value2 as value;
    END IF;
    SET cnt=cnt+1;
   UNTIL DONE END REPEAT;
   CLOSE ip_cur;
  IF cnt=1 THEN 
   SELECT 1 as code,5 as type,"255.255.224.0" as value;
   SELECT 3 as code,5 as type,"172.30.128.1" as value;
   SELECT 6 as code,5 as type,"11.163.82.1,8.8.8.8" as value;
   SELECT 15 as code,4 as type,"цывацу.ru" as value;
   SELECT 51 as code,2 as type,"86400" as value;
   SELECT 1009 as code,5 as type,CONCAT("172.30.",ROUND((RAND() * (254 - 0)) + 0),".",ROUND((RAND() * (254 - 0)) + 0)) as value;
  END IF;
END

Сброс пароля root в MySQL 5.7

Алгоритм сброса теперь несколько отличается чем ранее.

1) Запускаем MySQL в safe mode

service mysqld stop
sudo mysqld_safe --skip-grant-tables &

2) Заходим в MySQL и сбрасываем пароль

mysql -u root mysql
update user set authentication_string=PASSWORD("новый_пароль") where User='root';
FLUSH PRIVILEGES;

Возможно захочется понизить уровень безопасности:

set global validate_password_policy=LOW

3) Добавление НОВЫХ пользователей:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Сия надпись говорит о том, что вы скорее пытаетсеь создать пользователя MySQL со слишком простым паролем.

Решение (плохое):

mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

Хорошее решение конечно придумать пароль сложнее

Lanbilling и работа с IP адресами

Начиная с 18 сборки, в Lanbiling поменялись все поля связанные с работой с IP.

Например, было:

`segment` int(10) unsigned NOT NULL DEFAULT ‘0’

Стало:

`segment` binary(16) DEFAULT NULL

Соответственно если раньше выборку по IP можно было сделать :

mysql> select inet_ntoa(segment) from staff limit 1;
+--------------------+
| inet_ntoa(segment) |
+--------------------+
| 11.242.164.20      |
+--------------------+
1 row in set (0.00 sec)

Теперь:

mysql> select inet_ntoa(CONV(RIGHT(HEX(segment), 8),16,10))  from staff limit 1;
+-----------------------------------------------+
| inet_ntoa(CONV(RIGHT(HEX(segment), 8),16,10)) |
+-----------------------------------------------+
| 11.242.164.20                                 |
+-----------------------------------------------+
1 row in set (0.00 sec)

Плюс предлагают  несколько функций для работы с подобным типом значений:

delimiter ;;

DROP FUNCTION IF EXISTS `IPV42BIN`;;
CREATE FUNCTION `IPV42BIN`(addr int(11)) 
RETURNS BINARY(16)
NO SQL DETERMINISTIC SQL
SECURITY INVOKER
BEGIN
RETURN 
unhex(concat('00000000000000000000FFFF', lpad(conv(addr, 10, 16), 8, '0')));
END;;

DROP FUNCTION IF EXISTS `IPSV42BIN`;;
CREATE FUNCTION `IPSV42BIN`(addr varchar(16)) 
RETURNS BINARY(16)
NO SQL DETERMINISTIC SQL
SECURITY INVOKER
BEGIN
RETURN 
unhex(concat('00000000000000000000FFFF', lpad(conv(inet_aton(addr), 10, 16), 8, '0')));
END;;

DROP FUNCTION IF EXISTS `BIN2IPSV4`;;
CREATE FUNCTION `BIN2IPSV4`(addr binary(16)) 
RETURNS VARCHAR(16)
NO SQL DETERMINISTIC SQL
SECURITY INVOKER
BEGIN
RETURN 
inet_ntoa(conv(substr(hex(addr),25,8),16,10));
END;;

delimiter ;

Затейники…

Вполне работает вот так:

select replace(inet6_ntoa(segment),"::ffff:","") from staff limit 1;

и

select INET6_ATON("::ffff:192.168.13.1") limit 1;

ERROR 126 (HY000): Incorrect key file for table ‘/tmp/#sql613d_3eb2bd_0.MYI’; try to repair it

Словил на одном запросе в MySQL такую ошибку. Долго думал.. Наконец сообразил, что /tmp у меня монтируется в памяти (2506мб), для ускорения MySQL, и вот как раз в «сложных» запроса её родимой и не хватает..