Миру - мир. А Вам - пломбир!
Доброго времени суток!
В наличии два сервера в сети /24: 2 и 88 соответственно.
Задача: из PHP приложения на 88 забирать данные из MySQL с обоих серверов.
tl;dr:
– bash успешно коннектится и забирает правильные данные
– PDO+стандартный dsn и MySQLi валятся с "Permission denied"
– PDO+socket коннектится, но к локальной базе
Ничто лучше не опишет ситуацию как небольшие тесты:
1. Bash:
2. PHP + PDO + default dsn:
3. PHP + PDO + sockets:
Вопросы:
1. В чём разница между PHP и Bash в плане коннекта к мускулу? (о.0)
2. Есть идеи получить доступ из пыха?
Спасибо!
В наличии два сервера в сети /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. Есть идеи получить доступ из пыха?
Спасибо!
Запускаются под разными пользователями?
На сервере 2 он запущен как "www:mysql".
Честно говоря, знания в сервере mysql у меня так себе. Поясните, пожалуйста, поподробнее?
$ 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'
Сначала проверил сокеты:
$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".