Я пытаюсь подключиться к серверу 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)
факты:
Более очевидным вариантом для меня было бы начать использовать новый метод HTML Password Hashing в dreamhost, но они не изменят его, и я не root, поэтому я не могу сделать это сам.
Любая дикая идея?
По 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> 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'
Я не 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';
было бы хорошим началом?
Да, это выглядит как жесткая. Без сотрудничества со своими хостами или с возможностью изменения форматов паролей или клиентских библиотек у вас не так много вариантов.
Честно говоря, моим первым выбором было бы расколоть Dreamhost. Это, наверное, много работы, но если они будут застревать с использованием старого несовместимого материала, это будет оставаться проблематичным.
Если это не вариант, как насчет совместного автоматизированного процесса? Вы можете экспортировать данные со стороны Slicehost в CSV-файл и массировать его в любой формат, необходимый для Dreamhost, а затем загрузить его на сервер Dreamhost. У вас может быть скрипт cron на сервере Dreamhost периодически проверять загруженный файл и обрабатывать его (обязательно переместите или удалите его после его успешной обработки).
В некоторых случаях вы все равно сможете установить и использовать «новый пароль алгоритма хэширования».
Серверы MySQL 4.1+ могут обрабатывать оба логических алгоритма. Какой из них не зависит от переменной old-passwords. Если MySQL найдет длинный хэш на 41 символ, начинающийся с *, он использует новую систему. Функция PASSWORD () также может использовать оба алгоритма. Если поле 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 символа, и вы ничего не сможете с ним поделать (за исключением того, что они не навязывают).
У меня была эта проблема, и я смог ее обойти.
Во-первых, подключитесь к базе данных 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
.
Это позволяет вам спроектировать ваш запрос, чтобы убедиться, что вывод находится в формате, соответствующем структуре таблицы на целевом сайте.
Затем LOAD DATA INFILE
файл дампа в Dreamhost и используйте LOAD DATA INFILE
.
Как в стороне, Dreamhost действительно использует MySQL 4.0? Они чрезвычайно устарели – даже расширенная поддержка MySQL 4.1 истекает в этом месяце (декабрь 2009 г.).
Я думаю, вы должны сделать WebServices / RPC из slicehost и написать соответствующую службу для обработки.
Я была такая же проблема. Чтобы решить эту проблему, я сделал следующее:
SET PASSWORD = PASSWORD('[your password]');