Доброго времени суток! В наличии два сервера в сети /24: 2 и 88 соответственно. Задача: из PHP приложения на 88 забирать данные из MySQL с обоих серверов. tl;dr: 1. bash успешно коннектится и забирает правильные данные 2. PDO+стандартный dsn и MySQLi валятся с "Permission denied" 3. PDO+socket коннектится, но к локальной базе Ничто лучше не опишет ситуацию как небольшие тесты: 1. Bash: Код (Text): [trogwar@centos ~]$ mysql --host="42.42.42.2" --user="foobar" --password='blowfish' # ... credits ... mysql> use cooldb Database changed mysql> select count(*) from rem_tests; +----------+ | count(*) | +----------+ | 98 | +----------+ 1 row in set (0.00 sec) mysql> 2. PHP + PDO + default dsn: Код (PHP): try { $dbh = new PDO( 'mysql:host=42.42.42.2;dbname=cooldb', 'foobar', 'blowfish' ); $sql = 'SELECT COUNT(*) FROM rem_tests'; // Таблица существует только на удалённом сервере $stmt = $dbh->prepare($sql); $status = $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $exception) { echo $exception->getMessage(); } var_dump($result); // PDOException: SQLSTATE[HY000] [2002] Permission denied die(); 3. PHP + PDO + sockets: Код (PHP): // ... тот же самый код ... 'mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=cooldb', // ... тот же самый код ... var_dump($result); // PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'coldb.rem_tests' doesn't exist die(); Вопросы: 1. В чём разница между PHP и Bash в плане коннекта к mysql? (о.0) 2. Какие есть идеи получить доступ из php? Спасибо!
Re: Удалённый доступ к MySQL: bash может, PHP не может – поч php тоже консольный или таки из-под вебсервера? если второе, на каком он сетевом интерфейсе? права на базу расписаны для какого пользователя (user@address или user@*)?
Re: Удалённый доступ к MySQL: bash может, PHP не может – поч Спасибо за ответ! Не cli, везде работает из-под httpd: MAMP на .2 и LAMP на .88 Сервер, с которого стучимся (.88): Код (Text): [trogwar@centos ~]$ cat /etc/httpd/conf/httpd.conf | grep Listen Listen 80 Сервер, на который стучимся (.2): Код (Text): Mac-Boo:~ trogwar$ cat "/Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf" | grep Listen Listen 80 Права для всех хостов (то есть, с "%") на сервере куда стучимся (.2): Код (Text): Mac-Boo:~ trogwar$ /Applications/MAMP/Library/bin/mysql -uroot -p Enter password: # ... credits ... mysql> SELECT `Host`, `User`, `Select_priv` FROM `mysql`.`user` WHERE `User`="foobar"; +------+--------+-------------+ | Host | User | Select_priv | +------+--------+-------------+ | % | foobar | Y | +------+--------+-------------+ 1 row in set (0.00 sec)
Re: Удалённый доступ к MySQL: bash может, PHP не может – поч По поводу пользователей. Всё нижеуказанное успешно подключается к удалённому мускулу и забирает корректные данные: Код (Text): [trogwar@centos ~]$ sudo -u root mysql --host='42.42.42.2' --user='foobar' --password='blowfish' [trogwar@centos ~]$ sudo -u trogwar mysql --host='42.42.42.2' --user='foobar' --password='blowfish' [trogwar@centos ~]$ sudo -u apache mysql --host='42.42.42.2' --user='foobar' --password='blowfish' [trogwar@centos ~]$ sudo -u mysql mysql --host='42.42.42.2' --user='foobar' --password='blowfish' Добавлено спустя 31 минуту 14 секунд: Re: Удалённый доступ к MySQL: bash может, PHP не может – почему? Вчера пробовал Код (Text): [trogwar@centos ~]$ setsebool -P httpd_can_network_connect 1 , но получал ошибку, что SELinux либо отключён, либо не работает. К вечеру уже от досады сделал .88 серверу init 6. Затем ещё раз setsebool – внезапно сработало. И даже исправило ситуацию. Сегодня у пользователя 'foobar' MySQL обновил пароль (апдейт поля записи в `mysql`.`users` + "flush privileges;") – проблема вернулась. Только теперь ни init 6, ни setsebool не помогают – баш может коннектиться, пхп нет. Как видно выше, даже из-под разных пользователей.
Так, похоже, проблему решил (надеюсь). Пишу для тех, кто вдруг тоже столкнётся. Сначала проверил сокеты: Код (PHP): $res = fsockopen('42.42.42.2', '3306', $errno, $errstr, 5); var_dump($res, $errno, $errstr); // resource, 0, '' die(); Раз тут всё хорошо, значит проблема в мускуле. Залез к нему под рутом в `mysql`.`user`, скопировал хэш пароля, обновил поле, вставив тот же самый хэш обратно. Сделал flush privileges. Вот теперь – заработало. Почему ему не помогли три апдейта на другие пароли или апдейт с использованием password('blowfish'), но апдейт копипасты хэша сработал – не знаю, никак кроме магии объяснить не могу. Пока что, даже после init 6, полёт нормальный. Версия мускула:"14.14 Distrib 5.5.36".
Re: Удалённый доступ к MySQL: bash может, PHP не может – поч любопытно. что-то перемкнуло в привилегиях значит?
Re: Удалённый доступ к MySQL: bash может, PHP не может – поч Увы, на этот вопрос ответа я дать не могу так как не настолько хорошо знаю mysql, а копаться в этом пока времени не было. Интересно, что это не единичный случай – за сегодня поднял три несвязанных пары серверов и столкнулся с точно такой же проблемой один-в-один. Я ставлю centos 6.5 minimal + lamp (remi) + mysql_secure_installation. Другие варианты пока не успел опробовать.