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

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

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

MySQL временное отключение триггеров

К сожалению «штатной» возможности на данный момент нет. Можно только сделать «финт ушами», и в триггер добавить проверку на необходимость срабатываний. Например вот так:

	IF @LB_DISABLE_TRIGGERS IS NULL OR @LB_DISABLE_TRIGGERS = 0 THEN
		SELECT `vg_id` INTO l_vg_id FROM `usbox_services` WHERE `serv_id` = OLD.`serv_id`;
		CALL CHARGE_IMPL(l_vg_id, OLD.`agrm_id`, OLD.`period`, OLD.`c_date`, -OLD.`amount`);
	END IF;

А в нужный момент, выполнять:

set @LB_DISABLE_TRIGGERS=1;

Как залить дамп базы данных созданный в MySQL 5.xx (до 5.6) в MySQL базу версии 5.7

Начиная с MySQL 5.7 база данных по умолчанию запускается в «строгом» режиме, т.е. например если не верная дата в базе, или «должно быть что то, а вставляется NULL», то такие запросы более работать не будут. Соотвественно и дамп сделаный например в MySQL 5.1 в 5.7 уже не зальется. Что делать, если «исправлять ошибки не вариант»? Поможет переключение MySQL в «мягкий режим». Например в консольке:

SET sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

mysql: delete из select

Казалось бы простая задача, удалить записи по выборке из select. Например:

mysql> delete from config_common where id in (select id from config_common group by nameparam having count(*)>1);
ERROR 1093 (HY000): You can't specify target table 'config_common' for update in FROM clause

Однако такая запись выдает ошибку. Исправляемся «костылем»:

delete from config_common where id in (select * from (select id from config_common group by nameparam having count(*)>1) as p);

Маленькая хитрость при восстановлении из дампа MySQL

Довольно часто, системные администраторы делают дампы не какой то отдельной таблицы, а все базы целиком. Видимо примерно так:

mysqldump -ulogin -ppassword -ARqe --single-transaction | gzip -c > /nds/mysql/zwwes/`date +%Y-%m-%d`.gz

Отсюда возникает проблема: если нужно восстановить только одну базу из множества,  то её не достать — восстанавливаются сразу все.

Но! Костылем можно. Создаем пользователя, который имеет доступ только к одной базе:

create database dhcp2db;
create user 'dhcp'@'localhost' identified by 'password';
grant all on dhcp2db.* to 'dhcp'@'localhost';

И достаем из бекапа базы, под этим пользователем, сказав предварительно MySQL, игнорировать все ошибки (Access denied for user)

gunzip < 2017-12-10.gz | mysql -f -udhcp -pdhcp dhcp2db