Я пытаюсь подключиться к серверу mysql в dreamhost из php-скрипта, расположенного на сервере в slicehost (две разные хостинговые компании). Мне нужно сделать это, чтобы я мог передавать новые данные с slicehost на dreamhost. Использование дампа не вариант, потому что структуры таблиц разные, и мне нужно передать только небольшое подмножество данных (100-200 ежедневных записей). Проблема в том, что я использую новый метод хеширования паролей MySQL на slicehost и dreamhost использует старый, так что я получаю
$link = mysql_connect($mysqlHost, $mysqlUser, $mysqlPass, FALSE);
Warning: mysql_connect() [function.mysql-connect]: OK packet 6 bytes shorter than expected
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using old authentication
Warning: mysql_query() [function.mysql-query]: Access denied for user 'nodari'@'localhost' (using password: NO)
факты:
- Мне нужно продолжать использовать новый метод на slicehost, и я не могу использовать более старую версию/библиотеку php.
- База слишком большая, чтобы каждый день переносить ее дампом
- Даже если бы я это сделал, таблицы имеют разную структуру
- Мне нужно ежедневно копировать только небольшое его подмножество (только изменения дня, 100-200 записей)
- Поскольку таблицы такие разные, мне нужно использовать php в качестве моста для нормализации данных.
- Уже погуглил
- Уже поговорил с обоими сотрудниками службы поддержки
Более очевидным вариантом для меня было бы начать использовать новый метод хеширования паролей MySQL на DreamHost, но они не изменят его, и я не root, поэтому я не могу сделать это сам.
Любая дикая идея?
По предложению VolkerK:
mysql> SET SESSION old_passwords=0;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc'));
+------------------------+-------------------------+-------------------------+
| @@global.old_passwords | @@session.old_passwords | Length(PASSWORD('abc')) |
+------------------------+-------------------------+-------------------------+
| 1 | 0 | 41 |
+------------------------+-------------------------+-------------------------+
1 row in set (0.00 sec)
Теперь очевидно, что нужно запустить mysql> SET GLOBAL old_passwords=0; Но для этого мне нужна СУПЕР привилегия, а мне ее не дадут.
если я запущу запрос
SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password');
я получаю ошибку
ERROR 1044 (42000): Access denied for user 'nodari'@'67.205.0.0/255.255.192.0' to database 'mysql'
я не корень...
Парень из службы поддержки DreamHost настаивает на том, что проблема на моей стороне. Но он сказал, что выполнит любой запрос, который я ему скажу, поскольку это частный сервер. Итак, мне нужно сказать этому парню ТОЧНО, что бежать. Итак, сказав ему бежать
SET SESSION old_passwords=0;
SET GLOBAL old_passwords=0;
SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password');
grant all privileges on *.* to nodari@HOSTNAME identified by 'new password';
будет хорошим началом?
SET SESSION old_passwords=0
должно быть достаточно, нет необходимости изменять глобальные настройки для этого одноразового решения (иначе они могут просто перезапустить mysqld без этой опции). Я протестировал его на своем локальном сервере 5.1.37. Чтобы убедиться, что новый хэш действительно новый, позвольте парню из службы поддержки выполнить запросSELECT `Host`, Length(`PASSWORD`) FROM mysql.user WHERE `User`='nodari'
. Помните: 41 – хорошо, 16 – старо=плохо ;-) - person VolkerK   schedule 12.12.2009