Я пытаюсь соединиться с mysql сервером в dreamhost от php документа на получение, расположенного в сервере в slicehost (две различных хостинговых компании). Я должен сделать это так, я могу передать новые данные в slicehost к dreamhost. Используя дамп не опция, потому что структуры таблиц отличаются, и я только должен передать небольшое подмножество данных (100-200 ежедневных записей), проблема состоит в том, что я использую новый метод MySQL Password Hashing в 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)
факты:
Более очевидная опция мне состояла бы в том, чтобы начать использовать новый метод MySQL Password Hashing в dreamhost, но они не изменят его, и я не корень, таким образом, я не могу сделать этого сам.
Какая-либо дикая идея?
VolkerK sugestion:
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> УСТАНОВИЛ ГЛОБАЛЬНЫЙ 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 настаивает, говоря thet, проблема в моем конце. Но он сказал, что выполнит любой запрос, который я говорю ему, так как это - частный сервер. Так, я должен сказать этому парню ТОЧНО, что работать. Так, говоря ему работать
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';
было бы хорошее начало?
Yeah, that looks like a toughie. Without cooperation from your hosts or the ability to change password formats or client libraries, you don't have a lot of options.
Honestly, my first choice would be to ditch Dreamhost. That's probably a lot of work, but if they're going to be stuck using old incompatible stuff, it will continue to be problematic.
If that's not an option, what about a joint automated process? You could export the data on the Slicehost side into a CSV file and massage it into whatever format is necessary for Dreamhost, and then upload it to the Dreamhost server. You could have a cron script on the Dreamhost server check periodically for the uploaded file and process it (making sure to move or delete it after it was successfully processed).
В некоторых случаях вы все еще можете установить и использовать «новый пароль алгоритма хеширования».
Серверы MySQL 4.1+ могут обрабатывать оба алгоритма входа в систему. Какой из них используется, не зависит от переменной старых паролей. Если MySQL находит хэш длиной 41 символ, начинающийся с *, он использует новую систему. И функция ПАРОЛЬ () также может использовать оба алгоритма. Если поле mysql.user.Password достаточно велико, чтобы хранить 41 символ, а переменная old-passwords равна 0, то будет создан «новый» пароль.
В документации для old_passwords указано Variable Scope Both
, поэтому вы можете изменить его для своего сеанса.
Подключитесь к серверу MySQL (с клиентом, который может это сделать, несмотря на глобальный old_passwords = 1), например HeidiSQL , и попробуйте следующее:
SET SESSION old_passwords=0;
SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc'));
Если он печатает 1, 0, 41
(это означает, что глобальный old_passwords включен, но для сеанса он отключен и PASSWORD () вернул «новый» пароль) вы должны иметь возможность установить новый пароль , используя новый алгоритм для вашей учетной записи в рамках одного сеанса.
Но если Dreamhost действительно хочет отключить алгоритм новых паролей, поле mysql.user.Password будет меньше 41 символа, и вы ничего не сможете с этим поделать (кроме как придираться).
Я бы решил эту проблему, выгрузив данные на Slicehost, используя SELECT ... INTO OUTFILE
.
Это позволяет вам разработать свой запрос, чтобы убедиться, что формат вывода соответствует структуре таблицы на сайте назначения.
Затем перенесите файл дампа в Dreamhost и используйте LOAD DATA INFILE
.
Кстати, Dreamhost действительно все еще использует MySQL 4.0? Они сильно устарели - даже расширенная поддержка MySQL 4.1 истекает в этом месяце (декабрь 2009 г.).
Я думаю, вам следует создать WebServices / RPC из slicehost и написать соответствующую службу для его обработки.
У меня только что возникла эта проблема, и я смог ее решить.
Во-первых, подключитесь к базе данных MySQL с помощью старого клиента, который не возражает против старых_паролей. Подключитесь, используя пользователя, которого будет использовать ваш скрипт.
Выполните эти запросы:
SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');
В своем PHP-скрипте измените функцию mysql_connect, чтобы включить флаг клиента 1:
define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);
Это позволило мне успешно подключиться.