8

私はslicehost(2つの異なるホスティング会社)のサーバーにあるphpスクリプトからdreamhostのmysqlサーバーに接続しようとしています。これを行う必要があるのは、slicehostで新しいデータをdreamhostに転送できるようにするためです。テーブル構造が異なり、データの小さなサブセット(1日あたり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バージョン/ライブラリを使用できません
  • データベースが大きすぎて、ダンプを使用して毎日転送することはできません
  • 私がこれをしたとしても、テーブルは異なる構造を持っています
  • 毎日、その一部だけをコピーする必要があります(その日の変更のみ、100〜200レコード)
  • テーブルが非常に異なるため、データを正規化するためのブリッジとしてphpを使用する必要があります
  • すでにググった
  • すでに両方のサポートスタッフと話し合った

私にとってより明白なオプションは、dreamhostで新しいMySQLパスワードハッシュメソッドの使用を開始することですが、それらはそれを変更せず、私はルートではないため、これを自分で行うことはできません。

ワイルドなアイデアはありますか?

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 nodari@HOSTNAME identified by 'new password';

良いスタートになりますか?

4

6 に答える 6

8

条件によっては、「新しいハッシュアルゴリズムパスワード」を設定して使用できる場合があります。
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文字未満になり、それについてできることは何もありませ(それらをしつこくすることを除いて)。

于 2009-12-12T10:39:18.220 に答える
4

私はちょうどこの問題を抱えていて、それを回避することができました。

まず、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);

これにより、正常に接続できました。

于 2010-05-25T03:07:17.557 に答える
2

ええ、それはタフなように見えます。ホストからの協力、またはパスワード形式やクライアントライブラリを変更する機能がなければ、多くのオプションはありません。

正直なところ、私の最初の選択はDreamhostを捨てることです。それはおそらく多くの作業ですが、互換性のない古いものを使用してスタックする場合は、引き続き問題が発生します。

それが選択肢ではない場合、共同自動化プロセスはどうですか?Slicehost側のデータをCSVファイルにエクスポートし、Dreamhostに必要な形式にマッサージしてから、Dreamhostサーバーにアップロードすることができます。Dreamhostサーバー上のcronスクリプトで、アップロードされたファイルを定期的にチェックして処理することができます(正常に処理されたら、必ず移動または削除してください)。

于 2009-12-12T07:17:56.310 に答える
2

を使用して、Slicehostでデータをダンプすることでこれを解決しSELECT ... INTO OUTFILEます。

これにより、クエリを設計して、出力が宛先サイトのテーブル構造と一致する形式になるようにすることができます。

次に、ダンプファイルをDreamhostに転送し、を使用しますLOAD DATA INFILE

余談ですが、DreamhostはまだMySQL 4.0を使用していますか?それらは非常に時代遅れです-MySQL4.1の拡張サポートでさえ今月(2009年12月)に期限切れになります。

于 2009-12-12T07:58:22.660 に答える
1

スライスホストからWebServices/RPCを作成し、それに対応するサービスをに書き込んで処理する必要があると思います。

于 2009-12-12T08:03:16.363 に答える
0

私も同じ問題を抱えていました。それを解決するために、私は次のことをしました:

SET PASSWORD = PASSWORD('[your password]');
于 2016-02-04T19:56:20.513 に答える