Yeni vs Mysql şifre karma yöntem eski

5 Cevap php

I'm trying to connect to a mysql server at dreamhost from a php scrip located in a server at slicehost (two different hosting companies). I need to do this so I can transfer new data at slicehost to dreamhost. Using a dump is not an option because the table structures are different and i only need to transfer a small subset of data (100-200 daily records) The problem is that I'm using the new MySQL Password Hashing method at slicehost, and dreamhost uses the old one, So i get

$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)

gerçekler:

  • Ben Slicehost de yeni bir yöntem kullanmaya devam etmek gerekir ve ben eski bir php sürümü / kütüphane kullanamazsınız
  • Veritabanı dökümü ile her gün transfer için çok büyük
  • Ben bunu bile bile, tabloları, farklı yapılara sahip
  • Ben (günün sadece değişiklikleri, 100-200 kayıtları) bir günlük bazda, bunun sadece küçük bir kısmını kopyalamak gerekiyor
  • Tablo çok farklı olduğu için, ben veri normalleştirmek için bir köprü olarak php kullanmak gerekir
  • Zaten googled
  • Zaten destek stafs hem konuştuk

Benim için daha bariz seçenek dreamhost de yeni MySQL Şifre Kıyımlama yöntemi kullanmaya başlamak olacaktır, ama bu yüzden bu yapamam kendim bunu değiştirmek olmaz ve ben root değilim.

Herhangi vahşi bir fikir?

VolkerK sugestion by:

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)

The obvious thing now would be run a mysql> SET GLOBAL old_passwords=0; But i need SUPER privilege to do that and they wont give it to me

Ben sorguyu çalıştırırsanız

SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password');

Ben hata alıyorum

ERROR 1044 (42000): Access denied for user 'nodari'@'67.205.0.0/255.255.192.0' to database 'mysql'

Ben kök değilim ...

The guy at dreamhost support insist saying thet the problem is at my end. But he said he will run any query I tell him since it's a private server. So, I need to tell this guy EXACTLY what to run. So, telling him to run

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';

iyi bir başlangıç ​​olurdu?

5 Cevap

Evet, bu bir toughie gibi görünüyor. Ana bilgisayarlardan işbirliği veya şifre formatlarını veya istemci kütüphaneleri değiştirmek için yeteneği olmadan, bir çok seçenek yok.

Dürüst olmak gerekirse, benim ilk tercihi Dreamhost hendek olacaktır. Muhtemelen bir sürü iş var, ama onlar eski uyumsuz malzeme kullanarak sıkışmış gidiyoruz eğer, sorunlu olmaya devam edecektir.

Bu bir seçenek değilse, ne ortak bir otomatik süreç hakkında? Sen bir CSV dosyası içine Slicehost tarafında veri ihracat ve Dreamhost'tan için gerekli olan ne biçim içine masaj ve sonra Dreamhost sunucuya yükleyebilir. Siz (hareket ya da başarıyla işlendikten sonra silmek için emin olun) yüklenen dosya için periyodik Dreamhost sunucu çeke bir cron komut dosyası var ve bunu süreç olabilir.

On some conditions you may still be able to set and use a "new hashing algorithm password".
MySQL 4.1+ servers are able to handle both login algorithms. Which one is used is independent from the old-passwords variable. If MySQL finds a 41 character long hash starting with * it uses the new system. And the PASSWORD() function is also able to use both algorithms. If the field mysql.user.Password is wide enough to store 41 characters and the old-passwords variable is 0 it will create a "new" password. The documention for old_passwords says Variable Scope Both so you might be able to change it for your session.
Connect to the MySQL server (with a client that is able to do so despite the global old_passwords=1), e.g. HeidiSQL and try the following:

SET SESSION old_passwords=0;
SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc'));

Bu basıyorsa 1, 0, 41 (küresel old_passwords anlamı olduğunu, ancak oturumu için () "yeni" şifrenizi döndü off ve ŞİFRE var) Eğer yeni kullanarak set a new password mümkün olmalıdır Aynı oturumda, hesabınız için algoritma.

Dreamhost gerçekten yeni şifreleri algoritmayı devre dışı bırakmak istiyor ama eğer mysql.user.Password alan az 41 karakter uzunluğunda olacak ve you (onları dırdır hariç) bu konuda yapabileceği bir şey yok.

Ben sadece bu sorunu vardı ve etrafında çalışmak başardı.

Birincisi, old_passwords akla gelmez bir eski müşteri ile MySQL veritabanına bağlanmak. Script kullanarak olacak kullanıcı kullanarak bağlayın.

Bu sorguları çalıştırın:

SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');

PHP komut, istemci bayrak 1 eklemek için mysql_connect işlevini değiştirebilirsiniz:

define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);

Bu bana başarıyla bağlanmak için izin.

I SELECT ... INTO OUTFILE kullanılarak, Slicehost de veriyi damping bu çözecek.

Bu çıkış hedef sitede tablo yapısını eşleşen biçiminde olduğundan emin olmak için sorgu tasarım sağlar.

Sonra Dreamhost'a dökümü dosya aktarmak ve kullanmak LOAD DATA INFILE.

Bir kenara, Dreamhost still MySQL 4.0 kullanıyorsanız gerçekten? Bunlar son derece eski konum - hatta MySQL 4.1 'in genişletilmiş destek expiring this month olan (Aralık 2009).

Ben Slicehost gelen WebServices / RPC yapmak ve bunu işlemek için ilgili hizmet yazmak gerektiğini düşünüyorum.