Mysql метод хэширования паролей старый vs новый

Я пытаюсь подключиться к серверу 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 в качестве моста для нормализации данных
  • уже погуглили
  • уже говорил как stafs поддержка

более очевидным вариантом для меня было бы начать использовать новый метод хэширования пароля MySQL в 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'

Я не root...

парень из поддержки 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';

было бы хорошо начать?

6 ответов


да, похоже, это крутой парень. Без сотрудничества с вашими хостами или возможности изменять форматы паролей или клиентские библиотеки у вас не так много вариантов.

честно говоря, моим первым выбором было бы бросить Dreamhost. Это, вероятно, много работы, но если они будут застрять, используя старые несовместимые вещи, это будет по-прежнему проблематично.

Если это не вариант, как насчет совместного автоматизированный процесс? Вы можете экспортировать данные на Slicehost сторона в CSV-файл и массаж его в любой формат, необходимый для Dreamhost, а затем загрузить его на сервер Dreamhost. Вы можете периодически проверять cron-скрипт на сервере Dreamhost на наличие загруженного файла и обрабатывать его (не забудьте переместить или удалить его после успешной обработки).


на некоторых условиях вы все еще можете установить и использовать "новый пароль алгоритма хэширования".
MySQL 4.1+ серверы могут обрабатывать оба алгоритма входа в систему. Какой из них используется, не зависит от переменной old-passwords. Если MySQL находит длинный хэш длиной 41 символ, начинающийся с*, он использует новую систему. И функция PASSWORD () также может использовать оба алгоритма. Если поле mysql.пользователь.Пароль достаточно широк, чтобы хранить 41 символ, а переменная старых паролей равна 0 создайте" новый " пароль. The документации для 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.пользователь.Поле пароля будет меньше 41 символа и нет ничего вы может сделать об этом (кроме ворчания их).


у меня просто была эта проблема, и я смог обойти ее.

во-первых, подключитесь к базе данных MySQL со старым клиентом, который не возражает против old_passwords. Подключение с помощью пользователя, который будет использоваться скриптом.

выполните следующие запросы:

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);

Это позволило мне успешно подключиться.


Я бы решил это, сбросив данные в Slicehost, используя SELECT ... INTO OUTFILE.

Это позволяет спроектировать запрос, чтобы убедиться, что выходные данные находятся в формате, соответствующем структуре таблицы на целевом сайте.

затем перенесите файл дампа в Dreamhost и использовать LOAD DATA INFILE.

в стороне, Dreamhost действительно еще использование MySQL 4.0? Они чрезвычайно устарели - даже расширенная поддержка MySQL 4.1 истекающий в этом месяц (декабрь 2009).


Я думаю, вы должны сделать WebServices/RPC из slicehost и написать соответствующую службу для ее обработки.


У меня была та же проблема. Чтобы решить ее, я сделал следующее:

SET PASSWORD = PASSWORD('[your password]');