Обновление MySQL 5.5 -> 5.6

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Gineaser
Сообщения: 157
Статус: Evrashka
ОС: Arch Linux

Обновление MySQL 5.5 -> 5.6

Сообщение Gineaser »

Доброго дня.
Хочу поделиться проблемкой, с которой столкнулся на днях при обновлении одного из серверов. Проблему решил достаточно быстро, но возможно будет кому-нибудь полезно, да и до конца не разобрался в чем причина. Может вместе додумаем.

Debian GNU/Linux 7.5 (wheezy)
MySQL: обновлял с 5.5.37-0+wheezy1 на 5.6.17-1~dotdeb.1$
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
Подключенный репозиторий:

Код: Выделить всё

$ cat /etc/apt/sources.list.d/php-fpm.list
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all


Мои изначальные действия:
Стандартное обновление системы через apt (apt-get update, apt-get upgrade, apt-get distr-upgrade)
Происходит обновление MySQL. Вываливается ошибка

Код: Выделить всё

May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 37: use: команда не найдена
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 38: use: команда не найдена
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 46: BEGIN: команда не найдена
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 47: syntax error near unexpected token `('
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 47: `  my @req_mods = ('Fcntl', 'File::Basename', 'File::Copy', 'Getopt::Long','

Решил вычистить сам старый mysql-server перед установкой новой версии.
apt-get purge mysql-server mysql-client mysql-common
Удалил каталог /etc/mysql
Проиндексировал по новой файловую систему updatedb и через locate удалил остатки старого mysql-а оставив только /var/lib/mysql
Ставлю по новой - другие ошибки:

Код: Выделить всё

May 14 09:03:03 letters mysqld_safe[26387]: 2014-05-14 09:03:03 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
May 14 09:03:05 letters mysqld_safe[26413]: ERROR: 1062  Duplicate entry 'innodb' for key 'PRIMARY'
May 14 09:03:07 letters /etc/init.d/mysql[26488]: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz
May 14 09:12:58 letters /etc/mysql/debian-start[27724]: FATAL ERROR: Upgrade failed

В консоль при запуске вываливалось сообщения о том что нет $HOME.
No directory, logging in with HOME=/
Нашел пример /etc/mysql/my.cnf, добавил туда explicit_defaults_for_timestamp.

Иду в passwd и вижу что у пользователя mysql сменился домашний каталог на /nonexistent, оболочка /bin/false
И вроде бы это норма, по причине:
If an attacker can trick mysqld into creating
dot files in the home directory, he could do .rhost-like attacks
on the system.

Далее вываливается ошибка:

Код: Выделить всё

-su: 39: function: not found
итого 88
755 drwxr-xr-x  23 root     root  4096 Дек  9 15:10 ./
755 drwxr-xr-x  23 root     root  4096 Дек  9 15:10 ../
755 drwxr-xr-x   2 root     root  4096 Дек  9 15:22 bin/
755 drwxr-xr-x   3 root     root  4096 Май 14 08:44 boot/
755 drwxr-xr-x  13 root     root  3120 Апр  1 12:43 dev/
755 drwxr-xr-x  78 root     root  4096 Май 14 10:48 etc/
755 drwxr-xr-x   2 root     root  4096 Сен 23  2013 home/
777 lrwxrwxrwx   1 root     root    30 Дек  9 15:10 initrd.img -> /boot/initrd.img-3.2.0-4-amd64
755 drwxr-xr-x  14 root     root  4096 Апр  2 09:49 lib/
755 drwxr-xr-x   2 root     root  4096 Мар 12 14:10 lib64/
700 drwx------   2 root     root 16384 Дек  9 15:09 lost+found/
755 drwxr-xr-x   4 root     root  4096 Дек  9 15:09 media/
755 drwxr-xr-x   3 root     root  4096 Апр  1 12:42 mnt/
755 drwxr-xr-x   2 root     root  4096 Дек  9 15:09 opt/
555 dr-xr-xr-x 106 root     root     0 Апр  1 22:43 proc/
700 drwx------   5 root     root  4096 Май 14 10:52 root/
755 drwxr-xr-x  11 root     root   540 Май 14 10:55 run/
755 drwxr-xr-x   2 root     root  4096 Май 14 08:44 sbin/
755 drwxr-xr-x   2 root     root  4096 Июн 10  2012 selinux/
755 drwxr-xr-x   2 root     root  4096 Дек  9 15:09 srv/
755 drwxr-xr-x  13 root     root     0 Апр  1 22:43 sys/
776 drwxrwxrwt   5 www-data root  4096 Май 14 10:54 tmp/
755 drwxr-xr-x  10 root     root  4096 Дек  9 15:09 usr/
755 drwxr-xr-x  12 root     root  4096 Апр  2 09:51 var/
777 lrwxrwxrwx   1 root     root    26 Дек  9 15:10 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64
-su: 41: Syntax error: "}" unexpected

т.е. почему то вызывается команда ll и выводится содержимое корня потому что нету домашнего каталога.
Причем у меня в системном профиле переназначен альяс ll на мою функцию которая как видно у меня добавляет столбик с битами прав.
Так же хочу обратить внимание на такой момент, который я не заметил в выводе:
-su: 39: function т.е. '-' перед su...
Откуда он появляется ниже.
Пробовал запускать от пользователя mysql с оболочкой sh. Вываливалось следующее:

Код: Выделить всё

Error: mysqld-su
Command not found!

Тут я увидел как раз этот -su который не понятно откуда формировался.
Для тотального логирование действий пользователей я использую ELF-библиотеку snoopy (snoopy logger). Кстати всем ее очень советую ;)
Полез я в логи snoopy посмотреть что же происходит такое и какие процессы вообще запускаются.
При старте вижу там следующее:

Код: Выделить всё

May 14 10:35:30 letters snoopy[11347]: [uid:0 sid:11108 tty: cwd:/ filename:/bin/su]: su - mysql -s /bin/bash -c /usr/bin/mysqld_safe > /dev/null 2>&1 &
May 14 10:35:30 letters snoopy[11348]: [uid:104 sid:11348 tty: cwd:/var/lib/mysql filename:/bin/bash]: -su -c /usr/bin/mysqld_safe > /dev/null 2>&1 &

т.е. как видно от рута выполняется команда запуска mysql-a от пользователя mysql и сполучением его окружения через '-'
А пользователь уже выполняет -su ...
Думаю, неужели косяк в /etc/init.d/mysql скрипте. Полез туда, но там все нормально:

Код: Выделить всё

   # Could be removed during boot
            test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld
            # Start MySQL!
            su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &"

Пробую вручную выполнить команду. Ошибка аналогичная.
Убираю аргумент получения окружения '-' работает.... меняю оболочку /bin/sh на bash - рабоет....

пока как временное решение сменил команду
su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &"
на
su - mysql -s /bin/bash -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &"
Почему при вызове su - mysql с оболочкой sh выполняется команда -su я так и не понял
Смотрел env-ы, ничего особенного и не правильного не заметил.

У кого какие мысли на этот счет?
Обезьянка видит - Обезьянка делает...
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21520
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Обновление MySQL 5.5 -> 5.6

Сообщение Bizdelnick »

Gineaser писал(а):
14.05.2014 05:23
Происходит обновление MySQL. Вываливается ошибка

Судя по ошибке, perl-скрипт "выполняется" шеллом. Что намекает на то, что данный пакет никем никогда не тестировался, а у сборщика руки не из того места. На этом надо было бы остановиться и перестать поганить систему.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: