OpenCart: отказано в доступе пользователю root@localhost - как исправить ошибку MySQL

mr. Cooper 1 неделю назад Веб-разработка
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.php

using 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.

Что проверить по порядку

Я бы шёл коротким путём:

  1. Открыть /var/www/site.ru/config.php.

  2. Проверить DB_HOSTNAME, DB_USERNAME, DB_PASSWORD и DB_DATABASE.

  3. Проверить те же параметры в /var/www/site.ru/admin/config.php.

  4. Попробовать войти в MySQL вручную через mysql -u root -p.

  5. Если это перенос сайта - сравнить пароль с настройками нового сервера.

  6. Проверить root@localhost через mysql.user.

  7. Если всё исправно - посмотреть в сторону 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.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи