Миру - мир. А Вам - пломбир!
Доброго времени суток!

В наличии два сервера в сети /24: 2 и 88 соответственно.

Задача: из PHP приложения на 88 забирать данные из MySQL с обоих серверов.

tl;dr:
– bash успешно коннектится и забирает правильные данные
– PDO+стандартный dsn и MySQLi валятся с "Permission denied"
– PDO+socket коннектится, но к локальной базе

Ничто лучше не опишет ситуацию как небольшие тесты:
1. Bash:

[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:

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:

// ... тот же самый код ...
'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 в плане коннекта к мускулу? (о.0)
2. Есть идеи получить доступ из пыха?

Спасибо!

@темы: MySQL, База данных, *nix, PHP, PDO, remote

Комментарии
18.03.2014 в 00:31

Крайне злопамятное хамло ;)
В чём разница между PHP и Bash в плане коннекта к мускулу? (о.0)
Запускаются под разными пользователями?
18.03.2014 в 00:52

Миру - мир. А Вам - пломбир!
Co0L, мускул плодит процесс под другим пользователем если принял запрос не из локалхоста? (о.0) Это как вообще?
На сервере 2 он запущен как "www:mysql".
Честно говоря, знания в сервере mysql у меня так себе. Поясните, пожалуйста, поподробнее?
18.03.2014 в 13:17

Скрипт пхп запускается консольно под тем же пользователем, что и баш-скрипт или через веб-сервер?
18.03.2014 в 13:19

Миру - мир. А Вам - пломбир!
Astartsky, не cli, везде работает из-под httpd: MAMP на .2 и LAMP на .88
18.03.2014 в 13:26

Тогда, может, дело действительно в пользователях, от которых запускается скрипт? Что будет, если баш скрипт пустит от того же пользователя, что и httpd?
18.03.2014 в 17:40

Миру - мир. А Вам - пломбир!
Всё нижеуказанное успешно подключается к удалённому мускулу и забирает корректные данные:

$ sudo -u root mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
$ sudo -u trogwar mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
$ sudo -u apache mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
$ sudo -u mysql mysql --host='42.42.42.2' --user='foobar' --password='blowfish'

18.03.2014 в 19:16

Миру - мир. А Вам - пломбир!
Так, похоже, проблему решил (очень надеюсь). Пишу для тех, кто вдруг тоже столкнётся.

Сначала проверил сокеты:

$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".