我正在尝试从位于slicehost服务器上的php脚本(两个不同的托管公司)连接到dreamhost的mysql服务器。 我需要这样做,所以我可以在slicehost将新数据传输到dreamhost。使用转储不是一种选择,因为表结构不同,我只需要传输一小部分数据(每日100-200条记录) 问题是我在slicehost使用新的MySQL密码哈希方法,而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)
事实:
对我来说更明显的选择是在dreamhost上开始使用新的MySQL密码哈希方法,但是它们不会改变它而且我不是root用户所以我自己也不能这样做。
任何疯狂的想法?
由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'
我不是根...
梦想家支持的人坚持说问题就在我身边。但他说他会运行我告诉他的任何查询,因为它是私人服务器。 所以,我需要告诉这个人确切地说要运行什么。 所以,告诉他跑
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';
会是一个好的开始吗?
答案 0 :(得分:7)
在某些情况下,您仍然可以设置和使用“新的哈希算法密码”
MySQL 4.1+服务器能够处理两种登录算法。使用哪一个独立于旧密码变量。如果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个字符,你可以做任何事情(除了唠叨它们)。< / p>
答案 1 :(得分:3)
我刚遇到这个问题,并且能够解决这个问题。
首先,使用不介意old_passwords的旧客户端连接到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);
这使我能够成功连接。
答案 2 :(得分:2)
是的,这看起来像个顽固分子。如果没有主机的合作或更改密码格式或客户端库的能力,您没有很多选择。
老实说,我的第一选择就是抛弃Dreamhost。这可能是很多工作,但是如果他们使用旧的不兼容的东西会被卡住,那将继续存在问题。如果这不是一个选项,联合自动化流程怎么样?您可以将Slicehost端的数据导出为CSV文件,并按照Dreamhost所需的任何格式对其进行按摩,然后将其上传到Dreamhost服务器。您可以在Dreamhost服务器上安装一个cron脚本,定期检查上传的文件并对其进行处理(确保在成功处理后移动或删除它)。
答案 3 :(得分:2)
我会通过使用SELECT ... INTO OUTFILE
将数据转储到Slicehost来解决这个问题。
这允许您设计查询以确保输出的格式与目标站点的表结构匹配。
然后将转储文件传输到Dreamhost并使用LOAD DATA INFILE
。
顺便说一句,Dreamhost真的仍在使用MySQL 4.0?它们非常过时 - 即使MySQL 4.1的扩展支持是expiring this month(2009年12月)。
答案 4 :(得分:1)
我认为您应该从slicehost创建WebServices / RPC并在其上编写相应的服务来处理它。
答案 5 :(得分:0)
我有同样的问题。为了解决这个问题,我做了以下几点:
SET PASSWORD = PASSWORD('[your password]');