• Super User

    Condividere tabelle tra db su server diversi

    Salve, ho bisogno di sapere se sia fattibile condividere alcune tabelle tra due database residenti su due server differenti.

    Ho bisogno che questa operazione venga svolta tramite cronjob in automatico ad una certa ora del giorno.

    Purtroppo non ho conscenze in materia e non sono riuscito a trovare un metodo diverso che non sia quello di copiare fisicamente le tabelle di mio interesse dal primo db, aprire phpmyadmin e copiarle nel secondo db sull'altro server 😛

    Vi ringrazio per l'aiuto.


  • ModSenior

    Ciao Karapoto,

    E' sufficiente mettere durante la connessione al database invece di localhost l'ip del server dove gira l'altro database.
    Tieni presente che le connessioni esterne al database potrebbero essere bloccate.


  • Super User

    Grazie.

    Cerco di essere più chiaro.

    Si tratta di condividere il contenuto di tabelle che variano ogni giorno.
    Nello specifico identificano gli utenti registrati sul sito A, con tanto di permessi ed altri valori identificativi, che andrebbero importati, ad un certo orario della giornata, nel database del sito B.

    Quindi parliamo di database con tabelle extra oltre a quelle da condividere e che saranno le uniche uguali trai due db.

    Grazie.


  • ModSenior

    Piuttosto che copiarli, io invece di fare la connessione ad un unico database, mi collegherei ad entrambi i database e farei eseguire le query sul database opportuno ogni volta.
    Sicuramente dovrai andare a rivederti parti di codice php, per far capire a quale database far riferimento.

    [php]
    <?php
    // Dati Database 1
    $db1_host = '';
    $db1_utente = '';
    $db1_password = '';
    $db1_nomedb = '';
    // Dati Database 2
    $db2_host = 'localhost';
    $db2_utente = '';
    $db2_password = '';
    $db2_nomedb = '';

    // Connessione
    $db1 = @mysql_connect ($db1_host, $db1_utente, $db1_password) or die ('Non posso connettere al db 1');
    mysql_select_db($db1_nomedb, $db1);
    $db2 = @mysql_connect ($db2_host, $db2_utente, $db2_password) or die ('Non posso connettere al db 2');
    mysql_select_db($db2_nomedb, $db2);

    // Query sul database 1
    $a = mysql_db_query($db1_nomedb,"MIAQUERY", $db1) or die(mysql_error());
    // Query sul database 2
    $b = mysql_db_query($db2_nomedb,"MIAQUERY", $db2) or die(mysql_error());

    // Se faccio una query "normale" utilizzerà l'ultimo database a cui ci siamo collegati
    mysql_query("QUERY");
    ?>
    [/php]


  • Super User

    Grazie, è una possibile soluzione.

    Vorrei però evitare continue query al primo database, che inevitabilmente verrebbero generate.

    La divisione è anche per limitare il carico, quindi sto cercando di implementare questo sistema che in automatico esporta N tabelle dal db 1 e le importa sul db 2 in un orario in cui le attività sono al minimo (tipo le 3-4 del mattino).

    Scusami se non sono stato chiarissimo fin dal principio.


  • ModSenior

    Capisco, allora l'unica cosa che puoi fare è copiare le tabelle non ci sono altre alternative.
    Se i valori delle cache di mysql, sono ben messi il select non consuma molte risorse e il carico del primo server non sarebbe comunque molto alto, certo dipende anche di quanti accessi parliamo.

    Tieni presente che con mysql_query puoi eseguire solo una query per volta, quindi o ti generi gli insert in modo siano come un unica istruzione o dovrai 3000 mysql_query.

    Visto il problema di dividere il carico suppongo parliamo di server dedicati/vps e non di hosting, ad importarli impiegheresti molto meno tempo ed anche risorse a farlo con un comando messo in cron piuttosto che con uno script php.
    Utilizzando il comando mysql per importare e mysqldump per esportarti le tabelle.


  • Super User

    Siccome il primo server è ormai al limite, ulteriori query non sono opportune.

    Si, parliamo di due dedicati e credo anch'io sarebbe più facile importare.
    Quello che non so però fare è il come.

    A farlo al momento non ci vuole molto, scarico le tabelle e le carico sull'altro db, ma per automatizzare il tutto cosa ci deve essere sul primo server, cosa sul secondo e cosa devo fare per metterli in contatto?

    Come detto non ho esperienza in questo settore.

    Grazie ancora.


  • ModSenior

    Allora io per rendere la cosa il più veloce farei cosi:

    Ore 3:00 il server A esegue tramite cron un comando mysqldump, mettendomi il file sql ad un url tipo miosito.ext/private/sql.sql.
    Ore 3:05 il server B, sempre tramite cron fa un wget dal server A per scaricare il file SQL, successivamente lo ripristina utilizzando il comando mysql.

    La cartella private puoi metterla protetta tramite file htaccess, e metti le credenziali di accesso nel comando wget, cosi il file è ben protetto.

    Per copiare questa mi sembra la soluzione più veloce.


  • User

    Oppure potresti fare na replica del primo db sul quale andrai ad eseguire le query o quant'altro ti serve lasciando in pace il master.