Несколько заметок по 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
и вводим наш новый пароль, который мы использовали.
Вуаля. Сервер не пришлось убивать, базы остались как и были в целостности и сохранности.
Никаких данных не пострадало, кроме измененной записи в таблице привилегий.