我正在尝试从位于 slicehost (两个不同的托管公司)服务器中的 php 脚本连接到 dreamhost 的 mysql 服务器。我需要这样做,以便可以将 slicehost 的新数据传输到 dreamhost。使用转储不是一个选项,因为表结构不同,我只需要传输一小部分数据(每天 100-200 条记录)问题是我在 slicehost 和 dreamhost 使用新的 MySQL 密码散列方法使用旧的,所以我得到
$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 版本/库
- 数据库太大,每天都用dump转储
- 即使我这样做了,表格也有不同的结构
- 我每天只需要复制其中的一小部分(仅当天的更改,100-200 条记录)
- 由于表格如此不同,我需要使用 php 作为桥梁来规范化数据
- 已经google了
- 已经和两位支持人员谈过了
对我来说更明显的选择是在 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; 但我需要超级特权才能做到这一点,他们不会给我
如果我运行查询
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 nodari@HOSTNAME identified by 'new password';
会是一个好的开始吗?