dil: (Default)
Tuesday, January 8th, 2019 02:56 am

В Debian’е 9.6 попробовал установить mysql, но вместо него поставилась mariadb.

Сервер автоматически запустился, но зайти в него от меня самого не получалось:

$ mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

А с “-p” запрашивался пароль, но я его не знал – при установке сервера пароль ввести не просили.

Погуглил, запустил от рута mysql_secure_installation, ввёл там пароль, но клиентскую программу всё равно не пускали:

$ mysql -u root -p
Enter password: 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

А вот когда попробовал запустить mysql от рута, он успешно подключился к серверу вообще без пароля:

# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 10.1.37-MariaDB-0+deb9u1 Debian 9.6

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Посмотрел в таблицу mysql.user, там вполне был root@localhost с паролем и полными привилегиями, как обычно.

Ещё погуглил, и запустил там

GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY 'ТОТжеСАМЫЙпароль';
FLUSH PRIVELEGES;

и хотя в mysql.user вроде ничего не поменялось, но “mysql -u root -p” стал работать от моего эккаунта.
А от рута просто так работать перестал:

# mysql 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Только с -p, и с тем же паролем работает, как обычно в mysql’е.

Оригинал этой записи в личном блоге.

dil: (Default)
Thursday, November 8th, 2018 05:46 pm

Сегодня на одной машине с MySQL-сервером файловая система оказалась забита более 90%..
Зашёл туда, проверил, и оказалось, что почти всё место занято самим MySQL’ем – в директории /var/lib/mysql/ .
Но не просто базой данных, а binlog’ами. Их буквально за сегодня собралось слишком много, и каждый больше гигабайта..

В /etc/my.cnf удаление binlog’ов сконфигурировано через 5 дней:

expire_logs_days=5

Решил удалить все ненужные файлы, но, типа, это не рекомендуется делать вручную в файловой системе, а предлагается удалять из самого MySQL командой

PURGE BINARY LOGS TO 'файл_до_которого_удалить';

Проверил, который из этих файлов используется сейчас самим master-сервером, и какие ещё считываются с него slave-серверами. Везде оказался один и тот же файл, и тогда все прежние я удалил. Теперь в файловой системе занято всего 27%. Выходит, что сама база данных не сильно большая, но почему-то очень много непростых операций сегодня над ней производили..

Оригинал этой записи в личном блоге.

dil: (Default)
Friday, May 18th, 2018 11:25 am

На работе один разработчик удалял ненужные старые базы данных на MySQL master-сервере. А внезапно slave перестал работать, типа, не смог у себя удалить одну из тех баз:
Error was = Error 'Error dropping database (can't rmdir './название_базы/', errno: 17)' on query. Default database: ''. Query: 'drop database название_базы'

Я пошёл копать, оказалось, что MySQL не делает rm -rf на директорию от удаляемой базы. Он уже удалил свои стандартные файлы с данными и индексами, а потом пытался удалить директорию, но это не сработало, потому что в директории оказались лишние файлы: какие-то 20051114_outgoing.TMD_backup и 20051115_outgoing.TMD_backup. Ну я их удалил вручную, перезапустил slave, и тогда drop database сработал.

Потом такая же фигня случилась на паре других баз данных, пришлось опять удалять лишние файлы вручную. А потом ещё и на master-сервере одна база не удалилась по той же причине, и там пришлось вручную удалить лишний файл *.TMD_backup.

Что это за файлы, и откуда они взялись – совершенно не понимаю. Пробовал погуглить, но тоже не нашёл.

Оригинал этой записи в личном блоге.

dil: (Default)
Thursday, November 9th, 2017 11:41 am

Единственная программа, написанная на похапе, которая мне нравится – это Zabbix!
Сегодня утром он прислал уведомление, что на одном mysql-slave-сервере слишком большая задержка относительно master’а, более двух часов:

Причём там и Slave_IO (скачивание логов с master’а и сохранение их у себя), и Slave_SQL (выполнение операторов из тех логов) всё время работали:

Read the rest of this entry » )

Оригинал этой записи в личном блоге.

dil: (Default)
Thursday, May 11th, 2017 03:48 pm

На бэкапном MySQL сервере slave отвалился с очень странной ошибкой, с которой я раньше не встречался:
Could not execute Update_rows event on table foobar.nodes; Can't find record in 'nodes', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log live-master.001765, end_log_pos 13453210
Попробовал перезапустить slave, та же ошибка вылезает. Покопался в базе, а там никаких event’ов вовсе не зарегистрировано. Посмотрел в master, там тоже нету.

Классический способ STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE; в данном случае не подходил, ибо в этой бэкапной базе нужно иметь в точности то же самое, что и в основной. А если часть операторов пропустить, то что-нибудь может подпортиться.

Самое противное, что непонятно, какой оператор эту ошибку вызвал. Обычно-то он явно указывается, а тут нету — сам ищи, что там за ключ не нашёлся, и каким образом он использовался..
Попробовал сдампить log-файл на master’е mysqlbinlog’ом, а там фигня какая-то: виднеются операторы типа SET TIMESTAMP=1494413401, BEGIN, COMMIT,, а в какой записи этот timestamp SET — фиг знает, сам угадай.. Но виднеются какие-то куски BINLOG в base64. Попробовал сдампить ещё раз с --base64-output=decode-rows, так эти куски пропали, а подробности операторов так и не появились.

Ну, как водится, эти грабли мне тоже удалось обойти. Нашёл нужную опцию -vv для mysqlbinlog’а, и тогда в дампе появились подробности, хотя и не про сами операторы, но хотя бы про записи, над которыми эти операторы выполнялись:

Read the rest of this entry » )

Оригинал этой записи в личном блоге.

dil: (Default)
Wednesday, November 30th, 2016 12:05 pm

Попросили меня сапгрейдить машинку, где живёт крупная база под MySQL, со старенькой 32-битовой CentOS, до 64-битовой. Ну, поставил новую VM, установил туда 64-битовую систему, поставил mysql-server, запустил, всё работает. Потом скопировал конфиг со старой машинки, и тут, как всегда, загадочные грабли:
161130 11:11:54 [ERROR] Can't start server: Bind on TCP/IP port: Permission denied
161130 11:11:54 [ERROR] Do you already have another mysqld server running on port: 3307 ?
161130 11:11:54 [ERROR] Aborting

Проверил netstat’ом – нету никого на 3307. Запустил ещё раз — та же фигня, не работает.

Посмотрел на старую машинку, там mysqld действительно на порту 3307. А поменять на 3306 нельзя, слишком много клиентов придётся переконфигурировать.

Попробовал закомментировать опцию port в конфиге, mysqld нормально запустился на дефолтовом 3306. Вписал port 3306 явно, тоже работает. А если поменять на какой-нибудь другой — 3307, 3308, 4096 — фигвам, не работает, хотя эти порты никакими другими программами не используются.

Ну, кто сразу угадал, что это за хрень, и как её исправить?
Отгадка под катом

Read the rest of this entry » )

Оригинал этой записи в личном блоге.

dil: (Default)
Monday, January 21st, 2013 12:43 pm
mysql> select count(*) from ext_requests;
+----------+
| count(*) |
+----------+
|  7460166 |
+----------+
1 row in set (11 min 34.88 sec)

Машина больше ничем не занималась, кроме обработки этого самого запроса.

Вот это тоже радует:

mysql> show tables;
+--------------------------------------+
| Tables_in_*****************          |
+--------------------------------------+
...
+--------------------------------------+
1586 rows in set (0.02 sec)

 

Оригинал этой записи в личном блоге.

Tags:
dil: (Default)
Monday, January 7th, 2013 08:37 am

Как обычно, нарисовалась из практики. Рассмотрим простенькую базу данных типа “классный журнал”. Не в смысле “очень хороший”, а в который школьникам оценки ставят.

Три таблицы. Ученики: students(stud_id, stud_name), предметы: subjects(subj_id, subj_name) и оценки, полученные учениками: scores(stud_id, subj_id, date, score). В реальности тут ещё должна быть таблица классов, привязка учеников к этим классам типа, привязка предметов к классам, но для простоты примера я эти усложнения убрал. Будем считать, что эта база для одного класса, и каждый ученик может получить не более одной оценки в день по данному  предмету.

Задача: для конкретного ученика (по его stud_id) и конкретной даты вывести _полный_ список предметов и оценки, полученные этим учеником за эту дату. То есть, если оценка по данному предмету в этот день есть — вывести её, если нет — вывести прочерк, NULL или ещё что-нибудь, обозначающее отсутствие оценки.

Ограничение: это надо сделать одним запросом. Можно, конечно, сначала взять полный список предметов и для каждого послать отдельный запрос, но это крайне неэффективно. База для конкретности пусть будет MySQL.

На первый взгляд такие задачи решаются с помощью subjects LEFT OUTER JOIN scores. Но… он нормально работает только когда таблицы объединяются по уникальному полю, а в данном случае в таблице scores поле subj_id не уникально. Соответственно, если там есть хоть одна запись для данного предмета (длялюбого ученика за любую дату), то в результате JOIN’а не окажется строк, где score, stud_id и date есть NULL. А если потом к этому результату применить ещё WHERE stud_id=… AND date=…, то даже те строки, где NULLы могли случайно оказаться, будут удалены, поскольку не соответствуют условию.

Вот и как это сделать? Подсказка: это возможно. И на самом деле, оказалось очень просто.

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Monday, September 28th, 2009 02:16 pm

А вот кто может пояснить, почему вот на такой синтаксис MySQL ругается:

CREATE TABLE `foo` (
  `bar` varchar(32) NOT NULL,
  UNIQUE KEY `bar` (`bar`) USING BTREE
);

а вот такой спокойно принимает:

CREATE TABLE `foo` (
  `bar` varchar(32) NOT NULL,
  UNIQUE KEY `bar` USING BTREE (`bar`)
);

?

Сервер 5.0.51a. Документация говорит нам, что index_type может присутствовать как до списка (index_col_name,…), так и после. Самое смешное, что первый вариант синтаксиса был выдан командой show create table из другого mysql-сервера (5.1.36). Как же так, наши пластинки и к нашему же проигрывателю не подходят?

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
Wednesday, June 10th, 2009 03:47 pm

пусть меня научат я уже научился..

Сегодня я уронил MySQL командой GRANT..

Read the rest of this entry » )

Оригинал этой записи в личном блоге.