2009-12-12 2 views
8

Я пытаюсь подключиться к серверу mysql в dreamhost из скрипта php, расположенного на сервере slicehost (две разные хостинговые компании). Мне нужно сделать это, чтобы я мог передавать новые данные на slicehost в dreamhost. Использование дампа не является опцией, потому что структуры таблиц различны, и мне нужно передать только небольшое подмножество данных (100-200 ежедневных записей). Проблема заключается в том, что я использую новый метод Хеширования пароля MySQL на slicehost и Dreamhost использует старый, так что я получаюМетод хэширования Mysql old vs new

$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/библиотека
  • The база данных слишком велика, чтобы переносить ее каждый день с помощью сброса
  • Даже если я сделал это, таблицы имеют разные структуры
  • мне нужно скопировать только небольшую часть этого, в ежедневной основе (только изменения дня, 100-200 записей)
  • Поскольку таблицы настолько различны, что мне нужно использовать PHP в качестве моста для нормализации данных
  • Уже гугле его
  • Уже говорил с обеих поддержки stafs

более очевидный вариант для меня было бы начать использовать новый MySQL Password Hashing метод в dreamhost, но они не изменят его, и я не буду поэтому я не могу сделать это сам.

Любая дикая идея?

По 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; Но мне нужно SUPER привилегию, чтобы сделать это, и они не будут давать мне это

если я выполнить запрос

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 [email protected] identified by 'new password'; 

будет хорошим началом?

+1

'SET SESSION old_passwords = 0 'должен быть достаточно, нет необходимости изменять глобальные настройки для этого однократный решения (в противном случае они могут просто перезапустить туздЫ без этой опции). Я тестировал его на локальном сервере 5.1.37. Чтобы подтвердить, что новый хэш действительно «новый», пусть парень поддержки выполнит запрос 'SELECT \' Host \ ', Length (\' PASSWORD \ ') FROM mysql.user WHERE \' User \ '= 'nodari''. Remeber: 41 хороший, 16 - старый = плохо ;-) – VolkerK

+0

О, и я бы попробовал это без грантовой вещи сначала. Это не обязательно для вашей существующей учетной записи. Вероятно, это не повредит, но вводит новый вопрос: «Означает ли« по »те же правила, что и PASSWORD()?» Скорее всего, но вы никогда не знаете ;-) – VolkerK

+0

это не одно время, мне нужно будет делать это каждый день в течение времени ... И я, как и в следующей перезагрузке, это свойство old_password вернется к укусить меня в попку –

ответ

2

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

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

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

+0

ну, прямо сейчас я пишу скрипт, чтобы сгенерировать запрос на slicehost для выполнения в dreamhost. Я использую curl в качестве метода передачи. Является ужасным взломом, но, по крайней мере, я могу вызвать скрипт обновления через браузер или cron ... –

2

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

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

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

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

+0

Самое интересное, что они используют версию 5.0. Я не понимаю, почему они все еще используют старый метод хэширования –

+0

Хорошо, возможно, это связано с тем, что изменение метода пароля, вероятно, нарушит сотни (или тысячи) приложений клиентов, запущенных на этом хосте. Часто веб-хост просто оставляет такой сервер, как есть, и включает новые функции только на отдельном сервере. Со временем их клиенты постепенно переходят на новый сервер, и, наконец, они берут старую из службы. Вы можете попросить своего провайдера переместить вашу размещенную учетную запись на один из этих новых серверов. –

+0

его частный сервер ... не будет ли он экземпляром mysql, у которого больше пользователей, чем у меня? –

1

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

7

В некоторых случаях вы все еще можете установить и использовать «новый пароль алгоритма хэширования».
MySQL 4.1+ серверы могут обрабатывать оба логических алгоритма. Какой из них не зависит от переменной old-passwords. Если MySQL найдет длинный хэш на 41 символ, начинающийся с *, он использует новую систему. Функция PASSWORD() также может использовать оба алгоритма. Если поле mysql.user.Password достаточно велико, чтобы хранить 41 символ, а переменная old-passwords - 0, он создаст «новый» пароль. documention for 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() возвращала «новый» пароль) вы должны быть в состоянии set a new password с помощью новый алгоритм для вашей учетной записи в рамках одного сеанса.

Но если Dreamhost действительно хочет, чтобы отключить новый алгоритм паролей поле mysql.user.Password будет меньше, чем 41 символов, и нет ничего вы можете поделать (кроме нытье их).

+0

'mysql> SET SESSION old_passwords = 0; Query OK, 0 строк, затронутых (0.01 сек) mysql> SELECT @@ global.old_passwords, @@ session.old_passwords, Length (PASSWORD ('abc')); + ------------------------ + ----------------------- - + ------------------------- + | @@ global.old_passwords | @@ session.old_passwords | Длина (PASSWORD ('abc')) | + ------------------------ + ----------------------- - + ------------------------- + | 1 | 0 | 41 | + ------------------------ + ----------------------- - + ------------------------- + 1 ряд в комплекте (0.00 сек) –

+0

Я обновил вопрос, поле комментариев не позволит мне напишите код –

3

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

Сначала подключитесь к базе данных 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); 

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

+0

Да, я знаю, что вы можете сделать это таким образом, но идея es состоит в том, чтобы иметь текущего клиента на slicehost. Кроме того, я ничего не могу изменить в Dreamhost. И они используют старый метод пароля, потому что все пароли всех серверов хранятся в другом месте, они используют старый метод, и они могут изменить это на данный момент ... Этот конкретный случай не имеет хорошего решения. Я закончил создание сценариев в обоих концах, которые общаются с CURL ... –

+0

Я не знаю о Slicehost. Я также использую Dreamhost, как выясняется. old_passwords довольно раздражает. – TehShrike

0

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

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

Где вы выбираете пользователя? – Volatil3