2009-12-12 10 views
8

Sto provando a connettermi a un server mysql su dreamhost da uno script php situato in un server su slicehost (due diverse società di hosting). Ho bisogno di fare questo in modo da poter trasferire nuovi dati su slicehost su dreamhost. L'uso di un dump non è un'opzione perché le strutture delle tabelle sono diverse e ho solo bisogno di trasferire un piccolo sottoinsieme di dati (100-200 record giornalieri) Il problema è che sto usando il nuovo metodo di hashing di password MySQL su slicehost, e DreamHost usa quello vecchio, in modo da ottenereMysql metodo di hashing della password vecchio vs nuovo

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

fatti:

  • ho bisogno di continuare a utilizzare il nuovo metodo a slicehost e non posso utilizzare una versione precedente di PHP/biblioteca
  • il il database è troppo grande per trasferirlo ogni giorno con una discarica
  • Anche se ho fatto questo, le tabelle hanno strutture diverse
  • ho bisogno di copiare solo un piccolo sottoinsieme di esso, in una base quotidiana (solo le modifiche della giornata, 100-200 record)
  • Dal momento che le tabelle sono così diversi, ho bisogno di usare il PHP come un ponte per normalizzare i dati
  • già concentrandoci
  • già parlato con entrambi i Staf supporto

la soluzione più ovvia per me sarebbe quella di iniziare a utilizzare il nuovo Metodo di hashing di password MySQL su dreamhost, ma non lo cambieranno e non lo farò Quindi non posso farlo da solo.

Qualche idea selvaggia?

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

La cosa più ovvia sarebbe ora essere eseguito un mysql> SET GLOBAL old_passwords = 0; ma ho bisogno privilegio SUPER per farlo e si suole dare a me

se corro la query

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

ottengo l'errore

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

io non sono radice ..

Il tizio al supporto di dreamhost insiste dicendo che il problema è alla mia fine. Ma ha detto che eseguirà qualsiasi query che gli dica dato che si tratta di un server privato. Quindi, ho bisogno di dire a questo ragazzo ESATTAMENTE cosa correre. Così, dicendogli di correre

SET SESSION old_passwords=0; 
SET GLOBAL old_passwords=0; 
SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password'); 
grant all privileges on *.* to [email protected] identified by 'new password'; 

sarebbe un buon inizio?

+1

'old_passwords per la sessione del = 0 'dovrebbero essere sufficienti, non c'è bisogno di cambiare l'impostazione globale per questa soluzione one-shot (altrimenti potrebbero semplicemente riavviare il mysqld, senza che l'opzione). L'ho provato sul mio server 5.1.37 locale. Per confermare che un nuovo hash è in realtà "nuovo", lascia che il tipo di supporto esegua la query "SELECT \" Host \ ", Length (\' PASSWORD \ ') FROM mysql.user WHERE \ User \' = 'nodari''. Remeber: 41 è buono, 16 è vecchio = cattivo ;-) – VolkerK

+0

Oh, e proverei prima senza la concessione. Non dovrebbe essere necessario per il tuo account esistente. Probabilmente non fa male a nessuno, ma introduce una nuova domanda: "Il 'identificato da' obbedisce esattamente alle stesse regole di PASSWORD()?" Molto probabilmente, ma non si sa mai ;-) – VolkerK

+0

non è una cosa di una volta, dovrò farlo quotidianamente durante un periodo ... E a meno che nel prossimo riavvio questa cosa vecchia_password tornerà a mordimi nel culo –

risposta

2

Sì, sembra un duro. Senza la collaborazione dei tuoi host o la possibilità di modificare i formati delle password o le librerie client, non hai molte opzioni.

Onestamente, la mia prima scelta sarebbe quella di abbandonare Dreamhost. Probabilmente è un sacco di lavoro, ma se saranno bloccati usando vecchie cose incompatibili, continuerà a essere problematico.

Se questa non è un'opzione, che dire di un processo automatizzato congiunto? È possibile esportare i dati sul lato Slicehost in un file CSV e massaggiarli in qualsiasi formato necessario per Dreamhost, quindi caricarli sul server Dreamhost. Si potrebbe avere uno script cron sul server Dreamhost controllare periodicamente il file caricato ed elaborarlo (assicurandosi di spostarlo o cancellarlo dopo che è stato elaborato correttamente).

+0

beh, in questo momento sto scrivendo uno script per generare una query su slicehost da eseguire su dreamhost. sto usando arricciatura come metodo di trasferimento. È un attacco orribile, ma almeno posso chiamare lo script di aggiornamento tramite un browser o un cron ... –

2

Risolverei questo problema scaricando i dati su Slicehost, utilizzando SELECT ... INTO OUTFILE.

Ciò consente di progettare la query per assicurarsi che l'output sia nel formato corrispondente alla struttura della tabella nel sito di destinazione.

Quindi trasferire il file di dettagli su Dreamhost e utilizzare LOAD DATA INFILE.

Come da parte, Dreamhost è davvero ancora utilizzando MySQL 4.0? Sono estremamente obsoleti - anche il supporto esteso di MySQL 4.1 è expiring this month (dicembre 2009).

+0

la cosa divertente è che stanno usando la versione 5.0. Non capisco perché continuino ad usare il vecchio metodo di hashing –

+0

Ok, probabilmente è perché cambiare il metodo della password probabilmente interromperà centinaia (o migliaia) di applicazioni dei clienti in esecuzione su quell'host. Spesso un host web lascia solo un server così com'è e abilita nuove funzionalità solo su un server separato. Col passare del tempo, i loro clienti migrano gradualmente verso il server più recente e alla fine eliminano il vecchio fuori servizio. Puoi chiedere al tuo provider di spostare il tuo account ospitato su uno di quei server più recenti. –

+0

è un server privato ... non sarebbe un'istanza mysql senza più utenti di me? –

1

Penso che dovresti creare WebServices/RPC da slicehost e scrivere il servizio corrispondente su per gestirlo.

7

In alcune condizioni è ancora possibile impostare e utilizzare una "nuova password per l'algoritmo di hash".
I server MySQL 4.1+ sono in grado di gestire entrambi gli algoritmi di accesso. Quale viene utilizzato è indipendente dalla variabile old-password. Se MySQL trova un hash lungo 41 caratteri che inizia con * utilizza il nuovo sistema. E la funzione PASSWORD() è anche in grado di utilizzare entrambi gli algoritmi. Se il campo mysql.user.Password è sufficientemente ampio da contenere 41 caratteri e la variabile old-password è 0, verrà creata una "nuova" password. Il documention for old_passwords dice Variable Scope Both così potresti essere in grado di cambiarlo per la tua sessione.
Connettersi al server MySQL (con un client che è in grado di farlo nonostante la global_password = 1), ad es. HeidiSQL e provare quanto segue:

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

Se la stampa 1, 0, 41 (vale a dire i old_passwords globali è acceso, ma per la sessione si parte e la password() ha restituito una "nuova" password) si dovrebbe essere in grado di set a new password utilizzando il nuovo algoritmo per il tuo account all'interno della stessa sessione.

Ma se DreamHost vuole davvero disabilitare il nuovo algoritmo password campo mysql.user.Password sarà inferiore a 41 caratteri e non c'è niente si può fare su di esso (tranne loro fastidioso).

+0

'mysql> SET SESSION old_passwords = 0; Query OK, 0 righe interessate (0,01 sec) mysql> SELECT @@ global.old_passwords, @@ session.old_passwords, Length (PASSWORD ('abc')); + ------------------------ + ----------------------- - + ------------------------- + | @@ global.old_passwords | @@ session.old_passwords | Lunghezza (PASSWORD ('abc')) | + ------------------------ + ----------------------- - + ------------------------- + | 1 | 0 | 41 | + ------------------------ + ----------------------- - + ------------------------- + 1 riga nel set (0,00 secondi) –

+0

Ho aggiornato la domanda, il campo commento non mi consente scrivi il codice –

3

Ho appena avuto questo problema, ed è stato in grado di aggirare il problema.

In primo luogo, connettersi al database MySQL con un client precedente che non si occupa di old_passwords. Connetti usando l'utente che il tuo script userà.

Run queste query:

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

Nello script PHP, cambiare la funzione mysql_connect per includere la bandiera client 1:

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

Questo mi ha permesso di connettersi correttamente.

+0

sì, so che puoi farlo in questo modo, ma l'idea è avere un client attuale su slicehost. Inoltre, non posso cambiare nulla su dreamhost. E usano il vecchio metodo di password perché tutte le password di tutti i server sono memorizzate altrove, stanno usando il vecchio metodo e possono cambiarlo ora ... Questo caso particolare non ha una buona soluzione. Ho finito per creare script in entrambe le estremità che comunicano se stessi usando CURL ... –

+0

Non so Slicehost. Io uso anche Dreamhost, come risulta. old_passwords è piuttosto fastidioso. – TehShrike

0

Ho avuto lo stesso problema. Per risolverlo, ho fatto la seguente:

SET PASSWORD = PASSWORD('[your password]'); 
+0

Dove si seleziona l'utente? – Volatil3