Восстановление забытого пароля mysql. mysql 5 php 5 всё в utf8.


Несколько заметок по mysql

mysql 5 + php 5 = utf8 везде и всюду

mysql 5
php 5
Везде тотально utf8
локаль uft8
базы, данные, сам дамп в utf8
сайт в utf8.
Всё в utf8 от и до. Вплоть до хэдеров самой страницы:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

И?
Кривая кодировка сайта. =(

Если не верите, то вот:

mysql> SHOW VARIABLES WHERE Variable_name LIKE '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

Причем сам мускуль (после uft8 выправки конфигов в utf8 вместо идиотской latin1) данные выводит нормально.

Что ни выделывал, как с бубном ни танцевал — бесполезно.
Если в php скрипте насильно прописать

mysql_query('SET NAMES utf8');

то всё работает. Если убрать — перестает работать. Решилось всё насильной установкой mysql серверу параметров загрузки.

--init_connect="SET NAMES 'utf8'"

То есть в конфиге, в секцию сервера была добавлена строчка, насильно устанавлявающая NAMES в utf8:

[mysqld]
init_connect="SET NAMES 'utf8'"
character_set_server=utf8
collation_server=utf8_general_ci

И о чудо! оно заработало!

В итоге настройки для тотального utf8 в mysqld выглядят так:

mysql> SHOW VARIABLES WHERE Variable_name LIKE '%character%' OR Variable_name LIKE '%collation%' OR Variable_name = 'init_connect';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci            |
| collation_database       | utf8_general_ci            |
| collation_server         | utf8_general_ci            |
| init_connect             | SET NAMES 'utf8'           |
+--------------------------+----------------------------+
12 rows in set (0.00 sec)

Обратите внимание на init_connect и SET NAMES ‘utf8’

Восстановление забытого пароля mysql

Когда администрируешь множество серверов, то существует вероятность, что на одном из серверов вы забудете пароль доступа к mysql.
И root и сервер наш, а доступа к базам нет.
При этом хотелось бы не терять важные данные из mysql баз.
Как же взломать админский пароль не уничтожая данные?

Оказывается, получить доступ к mysqld будучи рутом на сервере просто:

  • Останавливаем сервис mysql:
    service mysqld stop
  • Запускаем mysql следующей командой:
    /usr/bin/mysqld_safe --skip-grant-tables --user=root &

    При этом будет проигнорирована таблица привилегий. т.е. теперь mysql нас пустит без пароля.

  • Запускаем клиента mysql:
    mysql -u root
  • Выполняем sql запрос для смены пароля пользователю. Например, с логином root:
    UPDATE mysql.user SET Password=PASSWORD('my_new_pass') WHERE User='root';

    где my_new_pass — наш новый пароль.

  • Применяем изменения:
    FLUSH PRIVILEGES;
  • Выходим из mysql клиента выполнив в нем команду exit (или quit или \q)
  • Перегружаем mysql сервер:
    service mysqld restart

    Теперь таблица привилегий уже использовалась при старте. т.е. без пароля уже не войти.

  • пробуем зайти:
    mysql -u root -p

    и вводим наш новый пароль, который мы использовали.

Вуаля. Сервер не пришлось убивать, базы остались как и были в целостности и сохранности.
Никаких данных не пострадало, кроме измененной записи в таблице привилегий.