estensione sql dump

Salve fino ad oggi ho sempre fatto affidamento al buon phpmyadmin (funzione esporta) per garantirmi una copia backup dell’intero database, oggi ho deciso di implementare un qualcosa di meno ripetitivo e più rapido. Ho dunque provato una estensione di yii che si chiama database-dumper il quale mi genera un file .sql o sql.gz in una cartella a mia scelta, fin qui tutto funziona, viene il momento di provare questo “dump.sql” generato:

rimuovo il database (locale) e provo ad importare il file in questione ma và in errore:

[color="#8B0000"]1005 - Can’t create table ‘My_appName.authassignment’ (errno: 150)[/color]

qualcuno ha già avuto a che fare con problemi simili ? grazie

Hai il permesso di scrittura su quella cartella?

Ho testato in locale (windows) non ho limitazioni di accesso. Si ho il perm di scrittura.

Sembra un problema di chiavi straniere (error 150).

Forse nel dump non vengono disabilitati i controlli delle chiavi e l’ordine di creazione delle tabelle va a creare il problema.

Verifica l’ordine delle tabelle oppure disabilita il controllo delle chiavi ad inizio import


SET FOREIGN_KEY_CHECKS = 0;

e poi riabilitalo


SET FOREIGN_KEY_CHECKS = 1;

Puoi inserire queste query anche nel file di dump.

Si @Nicola hai fiutato bene, mi han risposto anche dalla pagina dell’estensione, circa l’ordine delle tabelle che vengon create, ma è un assurdità che non ci sia un sistema x aggirare il problema.

Ho scelto questa estensione per arrivare ad automatizzare il salvataggio dei dumps e magari inviarli via email, ma forse ho beccato una estensione poco performante ! Qualcuno ha testato altro di simile ?

grazie

Non so se c’è qualche estensione simile, ma puoi crearti un command molto semplice e lo lanci poi da cron ogni tot tempo.

Beh il problema è che vorrei tenere tutto sotto l’applicazione, così da non perder tempo nelle installazioni, altrimenti devo impostare un cron su ogni server su cui installerò l’app

Per non parlare dei sistemi windows che hanno dei cron diversi credo dal linux.

Senza usare il cron la vedo dura!

Ad ogni accesso all’app dovresti verificare quando è stato fatto l’ultimo dump e in caso lo esegui.

La cosa brutta di questa soluzione è che vai a fare il dump durante le normali operazioni dell’app e non è sempre una cosa carina da fare in quanto la gente potrebbe lavorare nel db in quel momento…

In genere il cron è buona cosa perché così fai fare le operazioni di manutenzione fuori gli orari di lavoro quando nel db non ci lavora nessuno.

Se non vuoi installare il cron ovunque puoi fare un action che fa il dump e tu lanci quell’action da un tuo cron remoto (sempre che l’app sia “su internet”) lanciando tipo:




wget -O - -q http://www.dominio.tld/index.php/cron



comunque per questo cose l’uso di cron è, per me, fortemente consigliato! ;)

Mi vedo costretto a farti notare che stai spendendo più tempo a cercare altre soluzioni che a provare una.

Se installerò l’applicazione su un server windows, cosa dirò ? Ehm ragazzi per i dump, fateveli a manina perchè quello automatico funziona solo se avete server linux ! :lol: Dico e domando … se faccio un esporta da phpmyadmin tutto fila liscio come l’olio ! Ci sarà pure un modo … ho appena finito di fare un confronto tra i 2 files, (phpmyadmin e quello generato dall’estensione di yii) identici, eppure quello non-phpmyadmin ritorna errori.

extensions provate:

yii-dump-db

database-dumper

Se fai un dump con mysqldump vedrai in testa e in coda delle query strane che servono a disabilitare le fk e altri controlli e riabilitarli alla fine.

Quello che devi fare e’ copiare quella roba e metterla in testa e in coda ai dump.

Io preferei fare da sistema operativo, non vedo il motivo di usare php per fare un lavoro per il quale esiste un programma (mysqldump) che fa il lavoro richiesto.

Scriviti uno script di una riga (.sh o .bat) e fallo chiamare da cron o da "operazioni pianificate" per windows.

Giustissimo … ho appena eseguito un




$backup_file = 'paskuale' . date("Y-m-d-H-i-s") . '.gz';

$command = "mysqldump --opt -h $locale -u $root -p $password ".

"test_db | gzip > $backup_file";

system($command);



… ora però sto cercando di capire dove mi ha salvato il file .gz !!! :blink:

p.s.




$backup_file = 'paskuale' . date("Y-m-d-H-i-s") . '.gz';

$command = "mysqldump --opt -h $locale -u $root -p $password ".

"test_db > $backup_file";

system($command);



se rimuovo | gzip me lo salva nella root dell’applicazione! Manca da qualche parte gzip … :)

Puoi usare Yii::app()->getPathOfAlias(‘application’) per avere il path completo della protected e salvare i backup in una cartella backup un protected.

Io comunque prefersico farmi un .sh e un .bat, perche’ non e’ affatto detto che su windows si usino gli stessi comandi.

Io considero le routine di backup come una cosa esterna all’applicazione, e nel caso pratico se le sbriga il sistemista e non il programmatore.

Ehm effettivamente il file è vuoto 0Kb … qualcuno ha già provato questi comandi sui due sistemi (win || linux) ?

Vorrei riuscire ad arrivare ad una routine che dopo il dump mi invii il file via e-mail ad un indirizzo xxx@xxxx.xx, lascio fuori il sistemista! :)

Si può fare tutto, ma non si deve fare tutto. sqldump è l’istruzione che fa il backup. Per inviare la mail, puoi usare php. Puoi fare uno script come dice zaccaria. Puoi sare phing. Di metodi ce ne sono un bel po.

Allora iniziamo un passo alla volta:

Passo 1: Eseguire mysqldump a prescindere dal sistema operativo, o con una istruzione che riconosca da quale sistema operativo vien eseguito il comando (mysqldump)

Ho provato da dos (su win7), e il comando funziona così:




mysqldump -h 127.0.0.1 -u root --password=pippo nomedatabase > fileBackup.sql



Si deve fare tutto, se l’applicazione viene installata su sistemi op. diversi, modifichi la routine che fà il backup ?

No, si cerca di renderla indipendente dal sistema op.

MySQL che io sappia ha gli stessi tool sia su windows che su linux e funzionano allo stesso modo.

Comunque il backup per il recupero dei dati in caso di disastri pure io lo considero come task esterno all’applicazione anche perché ci sono svariati tool che servono solo a questo! :)

Se devo fare degli export per mantenere il sync con un programma esterno faccio un command con yii e query sql.

Cioè ? Ti crei una query che legge tutte le tabelle e le riscrive in un fileBackup.sql ? E’ questo che intendi ?

Per un applicativo che importa ed esporta dati verso un altro software esterno ho fatto dei comandi estendendo CConsoleCommand.

In questa classe ci sono delle action che esportano determinate tabelle facendo una query e scrivendo il file di dump con le fuzioni php, dopo aver fatto il dump invio il file via ftp e mando una mail di conferma, tutto sempre usando funzioni php.

Mi basta poi mettere nel cron


/path/to/yiic CommandName ActionName

e il tutto viene eseguito periodicamente.

Se lavori con database molto grandi va gestita la scrittura su file per evitare di mandare php in timeout o memory limit, però utilizzandolo con tabelle non troppo grandi funziona piuttosto bene e tengo tutto dentro Yii.

Per fare il backup invece c’è uno script in bash (lavoro solo su server linux) che esegue un mysqldump per ogni tabella, completamente esterno all’app Yii e si collega al db con un utente specifico con privilegi di sola lettura.

Se non vuoi impazzire con lo scripting bash o batch cerca nel web, troverai molti script pronti che fanno un full backup di database MySQL, una volta trovato quello più adatto a te lo userai per tutti i progetti!

m2c :)