OpenCart: отказано в доступе пользователю root@localhost - как исправить ошибку MySQL
Ошибка Access denied for user 'root'@'localhost' в OpenCart выглядит так, будто сломался сам магазин. На практике причина обычно гораздо прозаичнее: OpenCart пытается подключиться к MySQL с неправильным логином или паролем.
Особенно часто это всплывает после переноса OpenCart на другой сервер, восстановления базы или смены пароля MySQL. Сайт при этом может быть полностью исправен - просто приложение больше не может войти в базу.
Я бы поэтому не начинал с OpenCart. Сначала стоит проверить, что происходит между конфигурацией магазина и MySQL.
Что означает root@localhost
В сообщении:
//text
Access denied for user 'root'@'localhost'root - имя пользователя MySQL, а localhost - откуда выполняется подключение.
То есть MySQL сообщает: пользователь root, подключающийся с localhost, не прошёл проверку.
Причём проблема может быть не только в самом пароле. У MySQL учетная запись фактически определяется как связка пользователь@хост. Поэтому root@localhost и, например, root@127.0.0.1 могут вести себя по-разному.
Где OpenCart хранит пароль MySQL
В OpenCart 3 настройки подключения обычно находятся здесь:
//text
/var/www/site.ru/config.php
/var/www/site.ru/admin/config.phpЕсли магазин установлен в /home/user/public_html, тогда пути будут такими:
//text
/home/user/public_html/config.php
/home/user/public_html/admin/config.phpВ файлах ищите:
//php
define('DB_HOSTNAME', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'пароль');
define('DB_DATABASE', 'opencart');
define('DB_PORT', '3306');Здесь особенно интересует DB_USERNAME и DB_PASSWORD.
После переноса сайта это одно из первых мест, которое я бы проверил. В файле вполне может остаться пароль от старого сервера.
Посмотрите на using password
MySQL обычно добавляет к ошибке ещё одну важную строку.
using password: NO
Например:
//text
Access denied for user 'root'@'localhost' (using password: NO)Это означает, что пароль вообще не был передан.
Проверьте DB_PASSWORD в:
//text
/var/www/site.ru/config.phpи:
//text
/var/www/site.ru/admin/config.phpusing password: YES
Здесь пароль передаётся, но MySQL его не принимает:
//text
Access denied for user 'root'@'localhost' (using password: YES)Тогда имеет смысл проверить, действительно ли этим паролем можно войти в MySQL.
Например:
//bash
mysql -u root -pЕсли MySQL не принимает пароль и из консоли, проблема уже не в OpenCart.
После переноса OpenCart это особенно частая причина
Представим обычную ситуацию.
Старый сервер:
//text
root
старый парольНовый сервер:
//text
root
новый парольФайлы OpenCart перенесли, база восстановилась, а /var/www/site.ru/config.php остался со старым значением:
//php
define('DB_PASSWORD', 'старый_пароль');Магазин продолжает отправлять именно его. MySQL закономерно отвечает Access denied.
Поэтому после миграции я бы первым делом сравнил данные в конфигурации OpenCart с реальными учетными данными MySQL.
А если localhost не работает?
Стоит проверить и этот вариант:
//php
define('DB_HOSTNAME', '127.0.0.1');В некоторых конфигурациях localhost приводит к подключению через Unix-сокет, а 127.0.0.1 - через TCP.
Это не одно и то же подключение с точки зрения MySQL. Поэтому если пользователь существует как root@localhost, это ещё не означает, что точно так же сработает root@127.0.0.1.
Менять localhost на 127.0.0.1 наугад я бы не стал. Сначала лучше выяснить, какой вариант использовался до появления ошибки.
Проверьте, существует ли пользователь
В MySQL можно выполнить:
//sql
SELECT User, Host
FROM mysql.user
WHERE User = 'root';В результате будет видно, для каких хостов существует root.
Если магазин подключается не под root, проверять нужно уже его пользователя.
Лучше не использовать root для OpenCart
Если магазин сейчас работает через root, я бы при исправлении заодно убрал эту зависимость.
Например:
//sql
CREATE USER 'opencart_user'@'localhost'
IDENTIFIED BY 'Сложный_пароль';
GRANT ALL PRIVILEGES ON opencart.*
TO 'opencart_user'@'localhost';После этого в:
//text
/var/www/site.ru/config.phpуказываем:
//php
define('DB_USERNAME', 'opencart_user');
define('DB_PASSWORD', 'Сложный_пароль');И то же самое проверяем в:
//text
/var/www/site.ru/admin/config.phpДля интернет-магазина отдельный пользователь базы выглядит гораздо разумнее, чем подключение через root. Сам OpenCart также рекомендует использовать отдельного пользователя базы, а не root.
Что проверить по порядку
Я бы шёл коротким путём:
Открыть
/var/www/site.ru/config.php.Проверить
DB_HOSTNAME,DB_USERNAME,DB_PASSWORDиDB_DATABASE.Проверить те же параметры в
/var/www/site.ru/admin/config.php.Попробовать войти в MySQL вручную через
mysql -u root -p.Если это перенос сайта - сравнить пароль с настройками нового сервера.
Проверить
root@localhostчерезmysql.user.Если всё исправно - посмотреть в сторону
localhost/127.0.0.1.
Главное
Access denied for user 'root'@'localhost' - это прежде всего ошибка авторизации MySQL, а не признак того, что OpenCart сломан.
На практике я бы начал с двух файлов:
//text
/var/www/site.ru/config.php
/var/www/site.ru/admin/config.phpОчень часто после переноса магазина там просто остаются старые данные подключения. Исправляете логин, пароль или пользователя базы - и OpenCart снова получает доступ к MySQL.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.