У меня есть скрипт perl на веб-сервере, который подключается к базе данных на удаленном сервере, используя этот код:
my $dbusername='myname';
my $dbpassword='mypassword';
my $dbdatabasename='mydatabase';
my $driver = "mysql";
my $host='x.x.x.x'; # the actual ip of the mysql server
my $port='1010'; # the port it listens on
my $dsn = "DBI:$driver:database=$dbdatabasename;host=$host;port=$port";
$dbh = DBI->connect($dsn,$dbusername,$dbpassword, {
PrintError => 0, RaiseError => 1, });
Это все отлично работает. Теперь я хочу переместить скрипт Perl на тот же компьютер, что и база данных. Так что я заменил $ host ip выше на
мой $ host = 'localhost';
Я также создал нового пользователя (с именем «webuser») в базе данных, который соответствует хостам «localhost» вместо «%», и я использую имя пользователя и пароль для этого соединения в моем новом скрипте. (Я могу подключиться к базе данных, используя этого пользователя из MySQL Workbench).
Но когда я запускаю scrpt, я всегда получаю
"Доступ запрещен для пользователя 'webuser' @ 'localhost'"
Что еще мне нужно сделать?
Это похоже на проблему с разрешениями (спасибо ikegami), это та же ошибка, которую я ожидал бы, если бы пароль был неверным. Но я тщательно проверил это, и я могу успешно подключиться из командной строки, используя точно такие же параметры:
mysql -u webuser -pMyPassword -h localhost -P 1010 MyDBname
Может ли быть небольшая разница между программой mysql.exe и драйвером mysql, используемым модулем DBI?
позже:
Одно различие, которое я обнаружил, заключается в том, что при подключении из командной строки я должен указать номер порта, который прослушивает сервер. Если это не так, я получаю сообщение об ошибке «Не удается подключиться к MySQL Server на локальном хосте».
Но в программе Perl, которую я использую для номера порта, или, если я вообще не указываю порт, я получаю «Доступ запрещен для пользователя« webuser »@« localhost »».
Фактически, я получаю то же самое, если указываю несуществующее имя базы данных.
Интересно, отказывает ли сервер sql в доступе, потому что запрос исходит от программы в области веб-сервера (public_html). Это возможно?