Решение проблем с MySQL

Материал из Энциклопедия хостинга
Перейти к: навигация, поиск


Содержание

Создание базы через ISPmanager

На корректно работающем VDS создание базы займет не больше 5 минут. В левом меню ISPmanager находим раздел "Базы данных" - Создать - заполнить необходимые поля - пароли рекомендуем создавать сложные.

Теперь немного о тех местах, где могут возникнуть сложности.

Раздела "Базы данных" нет в меню

Есть 2 возможных варианта и пути решения проблемы:

1)На сервере не запущен сервер баз данных MySQL:

  1. Проверить, активен ли сервис, вы можете в меню "Сервисы" панели ISPmanager. Попробуйте запустить или перезапустить его с помощью кнопок в панели.
  2. Если не помогло, перезапустите из консоли командой /etc/init.d/mysql restart для Ubuntu/Debian/Centos 6 или командой systemctl restart mariadb для Centos 7.

2) Проблемы с подключением к базе данных: Откройте пункт меню "Серверы баз данных", двойным кликом откройте свойства и нажмите "OK", ничего не меняя. Это принудительно обновит информацию о MySQL в панели управления. После этого обновите страницу - пункт "Базы данных" должен появиться.

Не подходит пароль к серверу баз данных

Случается так, что пароль root от MySQL-сервера утерян, и надо установить новый. Делается следующим образом:

Останавливаем MySQL-сервер:

В Centos 6/Debian/Ubuntu:

# service mysql stop

В Centos 7:

# systemctl stop mariadb

или

# systemctl stop mysqld

Запускаем его без проверки таблиц прав:

# mysqld_safe --skip-grant-tables &

Заходим root’ом без пароля:

# mysql -uroot

Меняем пароль:

# use mysql;

MySQL < 5.7

# UPDATE user SET Password=PASSWORD("new_password") WHERE User='root';

MySQL => 5.7

# UPDATE user SET authentication_string=PASSWORD("new_password") WHERE User='root';

Продолжаем для всех версий

# FLUSH PRIVILEGES;

В Centos 6/Debian/Ubuntu:

# service mysqld restart

В Centos 7:

# systemctl restart mariadb

или

# systemctl restart mysqld

Авторизуемся как root с паролем new_password

# mysql -uroot -pnew_password

Где искать ошибки?

MySQL - свободная реляционная система управления базами данных. Поиск проблем с сервисом лучше всего начинать с изучения логов. Для этого необходимо подключиться на сервер по ssh Их расположение разнится в зависимости от используемой файловой системы. В конфигурационном файле my.cnf нужно искать строки log и log-error, чтобы определить, где находятся логи. Также можно воспользоваться mysql запросом:

show variables like '%log%';

Если логирование не включено, сделать это можно следующим образом: Зайти в файл:

/etc/my.cnf   #Centos
/etc/mysql/my.cnf  #Debian

И в секцию [mysqld] добавить строку:

log-error=/var/log/mysql-errors.log

Выйти из файла, выполнить команды:

touch /var/log/mysql-errors.log
chown mysql:mysql /var/log/mysql*
chmod 640 /var/log/mysql*

Следующая команда включит просмотр созданного лога в режиме реального времени(tail –f) и оставить его в фоне(&) что бы можно было параллельно запускать другие команды:

tail –f /var/log/mysql-errors.log &


Перечень возможных проблем

Table './site/content' is marked as crashed and should be repaired

Такое сообщение может появиться в логах или на сайте. Оно означает, что таблица одной из БД "побилась" и требуется ее восстановление. Необходимо подключится на сервер по SSH, выполнить команду, которая проверит все базы данных на предмет ошибок

mysqlcheck --repair --analyze --optimize --all-databases -u<USER> –p<PASSWORD>

Если эта команда выдаёт ошибку, вставьте ключи раздельно

mysqlcheck --repair --all-databases -u<USER> –p<PASSWORD>
mysqlcheck --analyze --all-databases -u<USER> –p<PASSWORD>
mysqlcheck --optimize --all-databases -u<USER> –p<PASSWORD>

где,

  • <USER> - имя пользователя базы данных, либо "root".
  • <PASSWORD> - заменить на пароль root от MySQL (его можно посмотреть в ISPmanager -> Настройки сервера -> Серверы баз данных -> двойной клик на MySQL)

Либо можно выполнить исправление конкретной базы данных

mysqlcheck --repair --analyze --optimize <DB> -u<USER> -p<PASSWORD>

где,

  • <USER> - имя пользователя базы данных, либо "root".
  • <PASSWORD> - заменить на пароль root от MySQL (его можно посмотреть в ISPmanager -> Настройки сервера -> Серверы баз данных -> двойной клик на MySQL)
  • <BD> - база данных, требуемая починки

mysql_connect() [function.mysql-connect]: Access denied for user 'user_xxx'@'localhost' (using password: YES)

Чаще всего связана с тем, что в настройках сайта указаны не верные данные(логин и/или пароль) для подключения к базе. Вариант решения: посмотреть в админ-панели сайта пользователь, пароль и название базы для подключения к базе. Зайти в ISPmanager -> настройки сервера -> кликнуть на базу, кликнуть на пользователя и в графу «Пароль» поставить пароль из админ-панели.


На сайте ошибка: Не удалось подключиться к базе данных

В зависимости от используемой CMS эта ошибка может по-разному выглядеть:

Возникла ошибка при подключении сервера баз данных MySQL
Can't connect to local MySQL server
Error connect to mysql
Unable to connect to the database:Could not connect to ...

Подключится на сервер по SSH, выполнить:

/etc/init.d/mysqld restart                          #перезапуск MySQL для Centos 6, Debian
 systemctl restart mariadb                          #перезапуск MySQL для Centos 7
 ps axuw | grep mysql                               #Эта команда должна вывести список процессов MySQL. 
                                                    #Если ничего не вывела – значит MySQL не запустился.

Убедится что в ISPmanager, в разделе «Службы» лампочка mysqld горит.

В панели ISPmanager 5 нет пункта Базы данных

Это значит у вас в ISPmanager --- Серверы баз данных не создано ни одного сервера баз данных. Создайте

MySQL не запускается ни в сервисах, ни через консоль.

При запуске через консоль ошибки могут быть вида:

cant connect to local mysql server throught socket /var/run/mysqld/mysql.d.sock
/etc/init.d/mysql start
Starting MySQL database server: mysqld . . . . . . . . . . . . . . failed!
/usr/local/etc/rc.d/mysql-server restart
mysql not running? (check /var/db/mysql/peroksid.ispvds.com.pid).
Starting mysql.

Проверить свободное место на диске.

df –h        #общая информация
du –hs /*  #сколько занимает конкретные папки

Если не осталось места, удалить не нужные файлы.

Частая ситуация, когда логи сайтов разрастаются и места на диске свободного не остается, MySQL не может нормально работать(справедливо и для всех остальных сервисов – apache, exim и т.д.)

Снова пробуем перезапустить MySQL:

/etc/init.d/mysqld restart                  #перезапуск MySQL для Centos 6, Debian
 systemctl restart mariadb                  #перезапуск MySQL для Centos 7

Если проблема не со свободным местом, в логах должны появиться записи, похожие на эту:

130929 06:16:05 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql
130929  6:16:05 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
130929  6:16:05 [Warning] option 'max_allowed_packet': unsigned value 5824839680 adjusted to 1073741824
Unknown suffix '-' used for variable 'sort_buffer_size' (value '--read_buffer_size=256K')
130929  6:16:05 [Warning] option 'sort_buffer_size': unsigned value 0 adjusted to 32776
130929  6:16:05 [ERROR] /usr/local/libexec/mysqld: Error while setting value '--read_buffer_size=256K' to 'sort_buffer_size'
130929  6:16:05 [ERROR] Aborting


Смотрим записи с меткой [ERROR]. В логе выше, ошибка «Error while setting value '--read_buffer_size=256K' to 'sort_buffer_size'» означает, что в конфиге my.cnf не верно прописана директива 'sort_buffer_size. Этот случай приведен только для примера. В каждом конкретном случае – лог будет различаться. Ошибки могут быть самые разные. Дальнейшие действия зависят от конкретной ошибки и требуют детального разбирательства.

Решение проблем с кодировками MySQL

Чтобы решить проблему - достаточно понять логику работы. MySQL, начиная с версии 4.1, знает что такое кодировки и как с ними работать. Если до 4.0 он работал с байтами, то теперь он работает с символами.

MySQL написали шведы, поэтому кодировкой по умолчанию (сразу после установки) является latin1, а "сравнение" (последовательность букв, алфавит; влияет на сортировки) - latin1_swedish.

Итак, где кодировки указываются:

1. Кодировка конкретной базы/таблицы/столбца. Это кодировка, в которой MySQL будет хранить данные. Например, если у вас данные в cp1251, то будет большой ошибкой указывать для хранения кодировку latin1. В ней нет соответствий для русских символов, все они будут заменены на вопросы. Кодировка хранения можно задать, например, так:

create database `имя базы` default charset cp1251;

Если кодировка не указана - будет использовано значение параметра default-character-set из файла /etc/my.cnf (либо latin1, если параметра нет). Кстати, именно этот параметр редактирует ISPmanager в свойствах сервера баз данных.

2. Кодировка соединения. Это кодировка, в которой клиент (скрипт пользователя, форум, mysql-клиент и т.д.) общается с MySQL. Когда клиент подсоединяется к серверу, тот ему сообщает значение параметра default-character-set. Таким образом, они договариваются о том, в какой кодировке они будут общаться. Кодировку общения можно изменить запросом (его лучше выполнять сразу после соединения с сервером):

set names cp1251

Кстати, множество современных правильных скриптов именно это и делают.

Одна сложность: есть ряд кривых клиентов, которые всего этого не понимают и общаются в какой-то своей кодировке. Персонально для них можно написать в /etc/my.cnf, секцию [mysqld]:

[mysqld]
set init_connect="set names utf8"

Что это означает? Сразу после подсоединения любого клиента, MySQL выполнит запрос "set names utf8", как будто смену кодировки общения запросил сам клиент.

Это всё, что нужно знать для решения любой проблемы с кодировками в MySQL. Осталось несколько уточнений (самое интересное :)

phpMyAdmin, mysqldump - обычные клиенты, на них действуют те же самые правила. Одно "но": на все PHP-скрипты (включая phpMyAdmin) действует default-character-set из секции [client] в my.cnf. Для mysqldump есть отдельная секция [mysqldump]. ISPmanager прописывает default-character-set во все секции.

Дамп базы - это обычный набор MySQL-команд. Если вы в самое его начало напишете "set names cp1251;", то эта команда тоже выполнится и MySQL будет считать, что дальше все данные в дампе идут в кодировке cp1251.

Кодировки в MySQL-командах пишутся без кавычек и без "-" (дефисов). Популярные в России кодировки: utf8, cp866 (DOS), cp1251 (windows-1251), koi8r.

И, наконец, пара советов:

  • Если вы в этом новичок, постарайтесь свести всё к одной кодировке. Пусть у вас дамп и "default-character-set" (напомню, влияет на кодировку хранилища при создании таблиц и на кодировку общения с клиентом) будет в одной кодировке. Это избавит от путаницы и решит 90% проблем.
  • Если есть возможность - используйте консольную утилиту mysqldump. phpMyAdmin - это дополнительная прослойка, которая лишь добавляет свою путаницу и свои баги.

Русификация MySQL

Чтобы русифицировать базу данных MySQL, не вдаваясь в подробности почему и как, проделайте следующие процедуры:

1. В файле /etc/my.cnf добавьте следующие строчки:

1.1. Под разделом [client]

default-character-set=cp1251

1.2. Под разделом [mysqld]

character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect = "set names cp1251"

После этого перезапустите базу MySQL или весь ваш виртуальный сервер (из ISPmanager или консоль).

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты

Заметили ошибку?

Выделите ее и нажмите CTRL+ENTER