backup mysql

Avrei bisogno di fare in modo che quando l'utente carica una certa pagina, e se si verificano certe condizioni automaticamente si crei una copia di backup del database con struttura e dati che prende il nome di backup_26_03_05.txt e ovviamente cambi data, e che lo salvi in una cartella online.

Qualcuno può aiutarmi? :D

inviato 11 anni fa
faina
X 0 X

Chiedi poco!  :o

Ti posso indicare alcune fonti che potrebbero aiutarti:

Un tutorial in italiano per realizzare un script di backup:

http://www.mrwebmaster.it/tutorial/php/tutorial272.htm

Un tutorial in inglese che mostra come usare diverse tecniche (query e chiamate di sistema) per effettuare il backup:

http://www.php-mysql-tutorial.com/perform-mysql-backup-php.php

Due classi da www.phpclasses.org (devi registrarti al sito per scaricarle, è gratuito):

http://www.phpclasses.org/browse/package/1066.html

http://phpclasses.solarix.biz/browse/package/1748.html

una classe di phpsoft.it

http://www.phpsoft.it/downloads.php (cerca  MySQL_Dump Class)

Ciao Ciao

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Effettivamente sono un pò esigente.

una classe di phpsoft.it

http://www.phpsoft.it/downloads.php (cerca  MySQL_Dump Class)

Ho provato a fare qualcosa con questa classe ma con non molto successo (credo che sia esagerata ma non la sò usare).

Se la conosci ti chiedo:

mettiamo che io ho un database chiamato db1

con due tabelle tb1 e tb2

che hanno ognuna tre campi: id, cp1, cp2

premetto

$db_host = "localhost";

$db_user = "faina";

$db_password = "faina";

$db_name = "db1";

e mi connetto ...

poi

require_once("MySQL_DumpDB.cls.php");

// Set Content Type

header("Content-Type: text/plain");

// Connect to MySQL

//*mysql_connect("HOST", "USER", "PASS");

// Init Class

$dbdump = &new MySQL_DumpDB();

// Try to select DB

$res_db = $dbdump->select_db($db_name,$reset_anyway = TRUE, $dump_data = TRUE);

if ($res_db) {

// If all ok...

echo "Database '$db_name' SELECTED\n";

// Select tables

$res = $dbdump->add_tables(array("assistenza"));

} else {

echo "Database '$db_name' - NON - SELECTED\n";

}

// Read Dump

$dump = $dbdump->get_dump();

if ($dump) {

// ...Full

echo "\n";

echo $dump;

}

Vorrei backuppare struttura e dati di ogni tabella. Come scrivo la funzione in rosso?

 :-\

risposto 11 anni fa
faina
X 0 X

se devi fare il backup di tuttle le tabelle del database puoi seguire l'esempio riportato sul sito che nel tuo caso andrebbe modificato nel seguente modo:

<?php
    // Include la classe per il dump
    require_once("MySQL_DumpDB.cls.php");
    
    // Si connette a MySQL
    mysql_connect("localhost", "faina", "faina");
    
    // Instanzia la classe
    $dbdump = &new MySQL_DumpDB();
    
    // Aggiunge il dump del database, aggiungendo pure il contenuto
    $dbdump->dump_database("db1", TRUE, TRUE);
    
    // Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`
    $dbdump->export_dump(TRUE, FALSE, TRUE);
    
    // Inserisce il DUMP in una variabile, dicendogli di comprimerlo
    $dump = $dbdump->get_dump(TRUE);
    
    // Scrive su file il dump
    $fp = fopen('myqsl_SQLDump.gz' , 'wb');
    fwrite($fp, $dump);
    fclose($fp);
    
    // Avverte l'utente
    echo "Dump salvato correttamente! Per scaricarlo premere <a href=\"myqsl_SQLDump.gz\">qui</a>";
?>

Prova così e fammi sapere

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Mi apre ovviamente la pagina

http://localhost/backup/myqsl_SQLDump.gz

vuota , codice html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML><HEAD>

<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>

<BODY><PRE></PRE></BODY></HTML>

e non succede altro.

Mi sembra di aver letto che occorre scaricare delle librerie ma non conosco ne l'indirizzo tantomeno dove vadano messe. Forse in C:\WINDOWS\SYSTEM ???

Mi sono poi permesso di scrivere:

<?php

    // Include la classe per il dump
    require_once("MySQL_DumpDB.cls.php");
    
    // Si connette a MySQL
include('../header.inc.php');  // Include la connessione 
    
    // Instanzia la classe
    $dbdump = &new MySQL_DumpDB();
    if ($dbdump) {
      echo ("    // Instanzia la classe<br><br>");
      } else {
      echo ("    ERRORE // Instanzia la classe<br><br>");
      }
    
    // Aggiunge il dump del database, aggiungendo pure il contenuto
    $dbdump->dump_database("riparazioni", TRUE, TRUE);
    if ($dbdump) {
      echo ("    // Aggiunge il dump del database, aggiungendo pure il contenuto<br><br>");
      } else {
      echo ("    ERRORE // Aggiunge il dump del database, aggiungendo pure il contenuto<br><br>");
      }

    // Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`
    $dbdump->export_dump(TRUE, FALSE, TRUE);
    if ($dbdump) {
      echo ("    // Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`<br><br>");
      } else {
      echo ("    ERRORE // Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`<br><br>");
      }
    
    // Inserisce il DUMP in una variabile, dicendogli di comprimerlo
    $dump = $dbdump->get_dump(TRUE);
    if ($dbdump) {
      echo ("    // Inserisce il DUMP in una variabile, dicendogli di comprimerlo<br><br>");
      } else {
      echo ("    ERRORE // Inserisce il DUMP in una variabile, dicendogli di comprimerlo<br><br>");
      }

    // Scrive su file il dump
    $fp = fopen('myqsl_SQLDump.gz' , 'wb');
    fwrite($fp, $dump);
    fclose($fp);
    if ($fp) {
      echo ("    // Scrive su file il dump<br><br>");
      } else {
      echo ("    ERRORE // Scrive su file il dump<br><br>");
      }

    
    // Avverte l'utente
    echo "Dump salvato correttamente! Per scaricarlo premere <a href=\"myqsl_SQLDump.gz\">qui</a>";

include('../footer.inc.php');  // Include la disconnessione 
?>

ma il risultato è questo:

// Instanzia la classe

// Aggiunge il dump del database, aggiungendo pure il contenuto

// Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`

// Inserisce il DUMP in una variabile, dicendogli di comprimerlo

// Scrive su file il dump

Dump salvato correttamente! Per scaricarlo premere qui 

... e ... non capisco, sembra funzionare ma non funziona!!!

Sarà davvero un dicorso di librerie???

 :-[ :-[

risposto 11 anni fa
faina
modificato 11 anni fa
Gianni Tomasicchio
X 0 X

prova a modificare lo script che ti ho postando cambiando:

$fp = fopen('myqsl_SQLDump.gz' , 'wb');

con

$fp = fopen('myqsl_SQLDump.sql' , 'wb');

inoltre apri il file che viene generato direttamente, senza cliccare sul link che ti viene mostrato

L'ho appena provato e non ho avuto problemi. Non credo che si tratti di librerie poiché il backup che ho ottenuto non era compresso.

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Allora. Non mi ero accorto che anche con gz mi salvava nella cartella i files. Me lo riconosceva come archivio winrar ma quando lo aprivo mi diceva che non era stato salvato correttamente. Adesso ho cambiato e messo sql ma quando vaado ad aprirlo il file è vuoto  :( :(

risposto 11 anni fa
faina
X 0 X

sei sicuro che sia vuoto? Controlla la dimensione del file in byte. L'estensione con cui lo salvi non è importante (anche se può confondere i programmi, tanto si tratta sempre di un file di testo.

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

0 byte di + nin sò!!! >:( >:( >:(

Ci devo riuscire :'(

risposto 11 anni fa
faina
X 0 X

metti all'inizio del tuo script la seguente istruzione:

error_reporting(E_ALL);

così vediamo se ci sono degli errori.

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Niente di niente!!! Non esiste alcun errore o non me lo visualizza. :tichedoff:

Ti ringrazio per la disponibilità, la qualità e la tempestività delle risposte, e comprendo che le cose da fare stanno esurendosi ma purtroppo non mi funziona proprio.

Adesso provo a buttarlo online per vedere se fosse il mio pc che non è in qualche modo configurato correttamente anche se stò provando su due pc.

Se ti viene in mente qualcosa fammi sapere.

Grazie ;)

risposto 11 anni fa
faina
X 0 X

Questo online:

// Instanzia la classe

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Inetpub\webs\miodominio\prova\backup\MySQL_DumpDB.cls.php on line 104

// Aggiunge il dump del database, aggiungendo pure il contenuto

// Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`

// Inserisce il DUMP in una variabile, dicendogli di comprimerlo

Warning: fopen(myqsl_SQLDump.txt): failed to open stream: Permission denied in D:\Inetpub\webs\miodominio\prova\backup\crea_backup.inc.php on line 50

Warning: fwrite(): supplied argument is not a valid stream resource in D:\Inetpub\webs\miodominio\prova\backup\crea_backup.inc.php on line 51

Warning: fclose(): supplied argument is not a valid stream resource in D:\Inetpub\webs\miodominio\prova\backup\crea_backup.inc.php on line 52

ERRORE // Scrive su file il dump

Dump salvato correttamente! Per scaricarlo premere qui

 :2funny: o  :'( ???

risposto 11 anni fa
faina
X 0 X

Ciao faina,

sono andato a vedere sul codice della classe a cosa corrisponde la riga 104 che ti da problemi ed è evidente che il problema è la query appena precedente:

"SHOW DATABASES LIKE \"{$dbname}\""

Quindi molto probabilmente ha isbagliato a specificare il nome del database di cui vuoi il backup.

Inoltre, c'è una riga che devi cambiare nel seguente modo per disabilitare la compressione

$dump = $dbdump->get_dump();

quindi lo script dovrebbe essere:

<?php
    // Include la classe per il dump
    require_once("MySQL_DumpDB.cls.php");
    
    // Si connette a MySQL
    mysql_connect("localhost", "faina", "faina");
    
    // Instanzia la classe
    $dbdump = &new MySQL_DumpDB();
    
    // Aggiunge il dump del database, aggiungendo pure il contenuto
    $dbdump->dump_database("db1", TRUE, TRUE);
    
    // Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`
    $dbdump->export_dump(TRUE, FALSE, TRUE);
    
    // Inserisce il DUMP in una variabile, dicendogli di comprimerlo
    $dump = $dbdump->get_dump();
    
    // Scrive su file il dump
    $fp = fopen('myqsl_SQLDump.txt' , 'wb');
    fwrite($fp, $dump);
    fclose($fp);
    
    // Avverte l'utente
    echo "Dump salvato correttamente! Per scaricarlo premere <a href=\"myqsl_SQLDump.txt\">qui</a>";
?>

Fammi sapere

risposto 11 anni fa
Gianni Tomasicchio
modificato 11 anni fa
X 0 X

OOOOHHH :D ;) :) finalmente tutto ok in locale.

Per quanto riguarda online invece mi dà i soliti errori sopra riportati. Mi sono accorto che nel mio header includevo il file config.inc che aveva però come istruzione

$db_name = "xxxxxx";

e non

$dbname = "xxxxxx";

quindi ho lasciato

$db_name = "xxxxxx";

e subito dopo ho inserito

$dbname = "xxxxxx";

ma non è cambiato niente :tichedoff:

poi ho provato a inserire all'inizio dell pagina:

echo ("$REMOTE_ADDR <br>");

echo ("$db_user <br>");

echo ("$db_password <br>");

echo ("$db_name <br>");

echo ("$dbname <br>");

ma gli ultimi due risultano identici e GIUSTI.

risposto 11 anni fa
faina
X 0 X

Hai verificato che alla funzione "dump_database" venga passato il nome corretto del database?

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Uso questo sistema per non cambiare config ogni volta che provo in locale o online

<?php
if ($REMOTE_ADDR == '127.0.0.1')
  {
  $db_host = "localhost";
  $db_user = "faina";
  $db_password = "faina";
  $db_name = "database_di_faina";
  }
  elseif ($REMOTE_ADDR != '127.0.0.1')
  {
  $db_host = "xx.xxx.xxx.xx";
  $db_user = "Sqlxxxxx";
  $db_password = "xxxxxxxx";
  $db_name = "Sqlxxxxx_x";
  }
?>

A questo punto il mio script è questo:

SONO GIA' CONNESSO AL DATABASE

<?php
include ('../calcoli/calcola_data_attuale.inc.php');

$nome_backup = 'backup_' . "$giorno" . '_' . "$mese" . '_' . "$anno";

error_reporting(E_ALL);

    // Include la classe per il dump
    require_once("MySQL_DumpDB.cls.php");
    
    // Instanzia la classe
    $dbdump = &new MySQL_DumpDB();
    
    // Aggiunge il dump del database, aggiungendo pure il contenuto
    $dbdump->dump_database("[color=Red]XXXXXXXXXX[/color]", TRUE, TRUE);

    // Esporta il database inserendo i DROP TABLE e usando i backquotes! Non usa USE `NOME_DB`
    $dbdump->export_dump(TRUE, FALSE, TRUE);
    
    // Inserisce il DUMP in una variabile, dicendogli di comprimerlo
    $dump = $dbdump->get_dump();

    // Scrive su file il dump
    $fp = fopen('copie_di_backup/' . "$nome_backup" . '.txt' , 'wb');
    fwrite($fp, $dump);
    fclose($fp);
    
    // Avverte l'utente
    echo 'Dump salvato correttamente! Per scaricarlo premere <a href="copie_di_backup/' . "$nome_backup" . '.txt">qui</a>';
?>

Ho provato in locale a mettere al posto delle XXXXXXXXXX:

$dbdump->dump_database("database_di_faina", TRUE, TRUE); e funziona correttamente

$dbdump->dump_database('database_di_faina', TRUE, TRUE); e funziona correttamente

$dbdump->dump_database("$dbname", TRUE, TRUE); crea un file vuoto

Ho provato online a mettere al posto delle XXXXXXXXXX:

$dbdump->dump_database("$dbname", TRUE, TRUE);

$dbdump->dump_database("Sqlxxxxx_x", TRUE, TRUE);

per entrambi i casi il risultato è:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Inetpub\webs\miodominio\prova\backup\MySQL_DumpDB.cls.php on line 104

Warning: fopen(copie_di_backup/backup_28_03_2005.txt): failed to open stream: Permission denied in D:\Inetpub\webs\miodominio\prova\backup\crea_backup.inc.php on line 27

Warning: fwrite(): supplied argument is not a valid stream resource in D:\Inetpub\webs\miodominio\prova\backup\crea_backup.inc.php on line 28

Warning: fclose(): supplied argument is not a valid stream resource in D:\Inetpub\webs\miodominio\prova\backup\crea_backup.inc.php on line 29

Dump salvato correttamente! Per scaricarlo premere qui :tichedoff: :tichedoff: :tichedoff:

risposto 11 anni fa
faina
modificato 11 anni fa
Gianni Tomasicchio
X 0 X

cambia lo script delle impostazioni nel seguente modo:

<?php
if ($_SERVER['REMOTE_ADDR'] == '127.0.0.1')
{
   $db_host = "localhost";
   $db_user = "faina";
   $db_password = "faina";
   $db_name = "database_di_faina";
}
else
{
   $db_host = "xx.xxx.xxx.xx";
   $db_user = "Sqlxxxxx";
   $db_password = "xxxxxxxx";
   $db_name = "Sqlxxxxx_x";
}
?>

La funzione di dump corretta è questa:

$dbdump->dump_database("$db_name", TRUE, TRUE);

Questo dovrebbe risolvere l'errore:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in[...]

Modifica i permessi di lettura e scrittura per la cartella in cui stai salvando il file di backup. Se sei su Windows assicurati che la cartella non sia impostata in sola lettura. Se sei su Linux imposta i permessi a 777. Dovresti così risolvere gli errori:

Warning: fopen[...]

Warning: fwrite()[...]

Warning: fclose()[...]

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Per quanto riguarda il primo cambiamento il risultato è il solito (e ovviamente dà il solito errore).

Per quanto riguarda il discorso dei permessi, la cartella è settata su 755 ( ho usato cute ftp 7 professional). Ti ricordo che sono su windows.

Purtroppo cute non mi fà cambiare i permessi anzi credo che sia aruba che li impone così in quanto digitando 777 mi viene fuori il seguente errore.

The command was not understood by the server.

Issue the raw FTP command "HELP" to identify all commands supported by the server

Ne sai qualcosa?

risposto 11 anni fa
faina
X 0 X

Allora,

ti conviene affrontare i problemi uno alla volta: per prima cosa non usare il file di inclusione dei parametri, inseriscili direttamente, sopratutto nella funzione "dump_database" in modo che se continui ad avere proglemi stai sicuro che l'errore è nei nomi che passi direttamente.

Inizialmente evita di lanciare le funzioni fopen, fwrite, fclose così da verificare che "dump_database" funzioni. Come ti ho già detto l'errore "Warning: mysql_num_rows()..." è causato dal passaggio del nome del databaser errato.

Risolto questo problema cerca di capire come abilitare i permessi di scrittura su Aruba (che è nota nel complicare le cose...)

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Per i permessi ho già risolto: Ho buttato tutto su hosting linux (che avevo già) e tutto ok.

Adesso rimane il problema (riga 104). Stò messaggiando con l'autore in persona della classe, faccio delle prove, non appena il avessi risolto ti faccio sapere.

Grazie di tutto :D

risposto 11 anni fa
faina
X 0 X

Per il momento mi ha fatto commentare le righe dalla 100 alla 112 e in effetti adesso tutto ok comunque ha detto che provava a risolvere in altro modo e mi faceva sapere.

In ogni caso grazie di tutto e stai sicuro che cercherò di promuovere questo sito in quanto come scrivevo qualche post più su, in quanto a tempestività, cortesia e competenza è proprio O0 .

risposto 11 anni fa
faina
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda