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