[MySQL] Query su DB 1 e Insert su DB 2

Pietro De Rosa

Nuovo Utente
30 Ott 2017
9
0
1
35
Buongiorno a tutti,

volevo chiedere a voi esperti se vi fosse un modo per poter Eseguire una query su di un DB (chiamiamolo 1) per poi successivamente scrivere sul DB secondario (2).

Stavo provando ad eseguire questa query dal DB 2
Codice:
INSERT INTO test.prova (id_articolo,listino,prezzo)
VALUES (select LST,ART,PRZ from mydata.tab01lst where LST='1' and ART='X')

Ma ovviamente non c'è alcun riferimento, nella select, al server del DB 1; ho provato anche con SERVER.mydata.tab01lst, ma cercando in rete ho trovato che bisognerebbe linkare i due server.

Esiste un modo per ovviare a tutto ciò? Magari anche con un metodo un po' più macchinoso.

Grazie a chi risponderà
 
Dovrebbe Andare
Codice:
INSERT INTO DATABASE1.TBL (CAMPO1,CAMPO2,CAMPO3)
  SELECT
    tbl_db_2.CAMPO1,
    tbl_db_2.CAMPO2,
    tbl_db_2.CAMPO3,
  FROM DATABASE2.TBL
 
Dovrebbe Andare
Codice:
INSERT INTO DATABASE1.TBL (CAMPO1,CAMPO2,CAMPO3)
  SELECT
    tbl_db_2.CAMPO1,
    tbl_db_2.CAMPO2,
    tbl_db_2.CAMPO3,
  FROM DATABASE2.TBL
Ciao Marcus,

ma sono 2 server distinti; uno è installato localmente, l'altro in cloud; eseguendo quella query dove dichiaro la distinzione dei due server?
 
Scusa per la risposta errata, ma non era chiara la locazione dei server...
UP: non avevo finito di leggere....
Ma devi effettuare una query secca, o attraverso qualche script?
Potresti provare ad utilizzare una configurazione distribuita, ossia un server master e uno slave, in questo modo potrai effettuare le sync...
Se il progetto è di grandi dimensioni ne vale la pena, altrimenti opterei per un cronJob.
 
Ti spiego la mia necessità nel pratico, così puoi darmi il consiglio più adatto:

Ho un database in cloud, dove però non posso scrivere ma soltanto leggere, quindi la mia intenzione è quella di fare delle query sul db in cloud e scrivere il risultato sul db in locale, il tutto vorrei poi chiaramente schedularlo;

Essendo un db aziendale (quello in cloud) è molto ricco di informazioni e per i calcoli che faccio tramite query ogni elaborazione dura anche 1 minuto, quindi volevo schedulare questi calcoli (query) ogni 10 minuti ed automatizzare la fase di scrittura\esportazione verso il db in locale (dove poi ho agganciato una paginetta in php).

Ho provato a lavorare direttamente sul db in cloud, ma essendo pesanti le query la pagina php passa praticamente tutto il tempo a caricare il risultato e non è quello che volevo, per questo ho optato all'opzione che spiegavo, così dal nuovo db vado soltanto a "leggere i dati già elaborati".

Spero di essere stato quanto più chiaro possibile e mi scuso se così non fosse :)
 
Secondo me se si tratta di una mole di dati abbastanza importante, conviene schedulare in modo appropriato un cron Job sul DB in Cloud, in questo modo sarà il server mysql del Cloud ad avere l'onere di elaborare e organizzare i risultati in una tabella da cui prelevare successivamente i valori necessari, il tutto potresti prevederlo attraverso gli Eventi di MySQL e impostargli i parametri d'esecuzione.
Se non necessiti di avere la situazione realtime dei dati sarebbe sprecata l'esecuzione dell'evento ogni 10 minuti, potresti schedulare l'evento ogni ora e attraverso un cronJob di sistema della macchina locale scheduli l'esecuzione dello script più o meno 15 minuti dopo la fine dell'esecuzione del Cloud.
Detto così sembrerebbe confusionario, ma...
Tempo T1, Tempo T2 = adesso;
L'evento della macchina in cloud viene schedulato ad intervalli T1=T1+60 quindi a cadenza oraria
La macchina locale schedula lo script T2=T1+60+30 minuti
Ossia prelevi le risorse 30 minuti dopo l'esecuzione dell'evento mysql, in questo modo dai il tempo alla macchina di elaborare, e lo script ha il tempo di scaricare i dati.
Naturalmente è impensabile scaricare tutto con una sola iterazione...

Sarebbe da prevedere un campo sulla tabella elaborata dal Clous un flag che indica se quella risorsa è già stata elabora o in alternativa un contatore che indichi l'ultima posizione utile dal quale far partire l'elaborazione, così da avere solo i nuovi dati nella tabella da scaricare...
 
Secondo me se si tratta di una mole di dati abbastanza importante, conviene schedulare in modo appropriato un cron Job sul DB in Cloud,
Marcus purtroppo uno dei problemi più limitanti che ho è proprio questo, cioè che non ho alcun accesso al server in cloud se non un utente con permessi in sola lettura del database.

Devo necessariamente optare per un sistema molto meccanico ed elementare, sempre se possibile (anche perché non saprei come fare).

Primo step: query sul db in cloud
Secondo step: esportare il risultato
Terzo step: scrivere i dati sul db in locale

E' fattibile, detto in questo modo? Se sì, come? :)
 
Allora banalmente lavorando solo sul tuo DB in locale:
  1. Creai una tabella con l'ultimo indice lavorato, così da non ripescare ogni volta il tutto.
  2. Crei la tabella che ti serve, sarebbe quella che deve contenere i dati
  3. Effettui una query di selezione sulla macchina in Cloud indicando un numero massimo di elementi da estrarre
  4. Effettui l'insert all'interno della tua tabella ed esegui il codice fino alla fine degli item.
Da prevedere in ordine di priorità:
  1. Estraggo il mio indice per partire
  2. Quante righe compongo la tabella sul cloud (questo serve per avere il numero di iterazioni) attraverso una query appropriata
  3. Inzio l'iterazione
    1. Prelevo la parte di dati che mi servono (attraverso LIMIT)
    2. Inserisco nel DB locale i dati che ho ricevuto
    3. Aggiorno il mio indice con l'ultimo inserito
 
Perfetto tutto quello che mi hai scritto, hai reso benissimo l'idea.

Il problema sussiste su questi due punti (che in un certo senso erano il motivo del mio topic)
  • Effettui una query di selezione sulla macchina in Cloud indicando un numero massimo di elementi da estrarre
  • Effettui l'insert all'interno della tua tabella ed esegui il codice fino alla fine degli item.

- Come faccio a fare una query in cloud ed inserirla sul db in locale?

Io provo in questo modo:
INSERT INTO LOCAL.prova (id_articolo,listino,prezzo) VALUES (select LST,ART,PRZ from CLOUD.tab01lst where LST='1' and ART='X')

se provo a fare "INSERT INTO 192.168.1.100.LOCAL.prova [...] from 151.80.50.10.CLOUD.tab01lst", non mi funziona. Anche perché se eseguo la query da locale, ovviamente non necessito di user\password per scrivere sul db in locale, ma per lanciare la query in cloud dovrò pur indicare user e password da qualche parte. Bene, dove?
Idem al contrario.

Non so se mi spiego bene... :D
 
lo script ha il tempo di scaricare i dati.
Il presupposto è che lo script ha la logica di reperimento dei dati.
Quindi il tuo script avrà 2 connessioni, uno per la macchina in cloud, e uno per local, ossia:
PHP:
$db1=new mysqli(host_cloud,user_cloud,pass_cloud,database_cloud);
$db2=new mysqli(host_local,user_local,pass_local,database_local);

Esegui la query di select sul db1, e fai la insert sul db2!!
 
Il presupposto è che lo script ha la logica di reperimento dei dati.
Quindi il tuo script avrà 2 connessioni, uno per la macchina in cloud, e uno per local, ossia:
PHP:
$db1=new mysqli(host_cloud,user_cloud,pass_cloud,database_cloud);
$db2=new mysqli(host_local,user_local,pass_local,database_local);

Esegui la query di select sul db1, e fai la insert sul db2!!
Grazie mille per tutto il tuo tempo :)

Ti ho scritto un pm
 
hai provato a seguire questo esempio ?

https://winashwin.wordpress.com/2012/08/22/mysql-federated-table/

il link suggerisce come creare una tabella locale che è federata alla tabella remota e quindi lavorare in locale con un unico database, ma accedendo alla remota avendo descritto nella tabella locale le informazioni di connessione

potresti provare la semplice lettura e, se funziona potresti tornare alla insert-select

guarda anche il manuale
https://dev.mysql.com/doc/refman/5.5/en/federated-storage-engine.html
 

Discussioni simili