• User Newbie

    Dump database MySql

    ciao ragazzi,
    ho da porvi un problema che non riesco a risolvere...:bho:

    devo fare un backup di struttura+dati di un database, però senza poter accedere a PhpMyAdmin, quindi devo fare tutto con delle funzioni apposite da php.

    ho trovato alcune classi online, ma provandole ho riscontrato un problema comune: se una tabella ha due chiavi primarie viene presa solo la seconda e questo comporta degli inserimenti errati nel momento del ripristino del dump.

    questa è la tabella:

    
    CREATE TABLE IF NOT EXISTS `agenda_concerne` (
      `aco_age_id` int(10) unsigned NOT NULL default '0',
      `aco_util_id` smallint(5) unsigned NOT NULL default '0',
      `aco_rappel_ok` tinyint(3) unsigned NOT NULL default '0',
      `aco_termine` tinyint(3) unsigned NOT NULL default '0',
      PRIMARY KEY  (`aco_age_id`,`aco_util_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    

    ci sono anche altri problemi nelle strutture, ad esempio non esportano in modo corretto la sintassi:

    
    `Colonna` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
    
    

    ora mi trovo in una situazione molto critica...le tabelle non sono statiche, quindi possono cambiare e da qui la necessità d'avere il dump anche della struttura. Per quanto riguarda i dati posso trovare il modo di gestire i vari problemi di apici, slash e simile...ma con la struttura come posso fare?

    Ho cercato di capire come PhpMyAdmin crei il file SQL di esportazione, ma non sono riuscito a ricavarlo, infatti penso utilizzi al suo interno la funzione mysql_dump....oppure non so proprio!!!:(:(:(:(

    Ogni consiglio è molto gradito:D:D

    grazie a tutti

    Gio


  • Consiglio Direttivo

    Ciao giopeco

    senza l'uso di PhpMyAdmin non saprei aiutarti molto, forse puoi dare un'occhio a questo post, magari ti torna utile 😉
    :ciauz:


  • ModSenior

    mysqldumper

    scaricati questo script... con questo puoi fare un dump del vecchio database e importarlo sul nuovo server senza problemi 😄


  • User Newbie

    @Thedarkita said:

    mysqldumper

    scaricati questo script... con questo puoi fare un dump del vecchio database e importarlo sul nuovo server senza problemi 😄

    l'ho scaricato....è una valida alternativa a PhpMyAdmin, ma io dovrei integrare una specie di "pulsante" per creare un backup e con questo tipo di script non è possibile...

    In poche parole, io devo creare un file SQL con un click, senza tanti giri/accessi/impostazioni, deve essere una cosa molto immediata...dite che dovrei andare a spulciare all'interno dei file php di mysqldumper per capire che funzioni utilizza per creare il file sql!?!??!?!⭕o


  • User Newbie

    @Samyorn said:

    Ciao giopego

    senza l'uso di PhpMyAdmin non saprei aiutarti molto, forse puoi dare un'occhio a questo post, magari ti torna utile 😉
    :ciauz:

    Grazie a Samyorn e al link sono riuscito a risolvere il problema!!!!
    sostanzialmente il programma che si trova indicato in quella discussione "MyBackup" scritto in Python ma con del codice php per creare il dump del database è stato la mia salvezza!:vai::vai:

    Avendo la necessità di esportare il database con un click e poterlo poi reimportare tramite phpMyAdmin, ho apportato delle piccole modifiche al codice originale e sono giunto ad una definizione del file sql perfettamente compatibile con l'importazione in PMA.

    se può esservi utile vi inserisco il codice qui sotto.

    Ciao
    GIo

    [php]
    <?
    /*
    Questo script è preso dal sito planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=772&lngWId=8
    a questo indirizzo trovate anche un tutorial e lo stesso codice per utilizzare lo script.
    Sono state apportate piccolissime modifiche al file per renderlo un po più semplice
    e sicuro.


    Changelog

    5 Nov 2007 : risolto bug caratteri accentati, fixed bug sui tag html
    3 Nov 2007 : modificato il metodo get_table_def() per compatibilità mysql5 (Giuseppe Piraino)

    */

    //Sintassi per richiamare il file back.php?password=1
    //questo file (backup.php) può essere rinominato in questo caso la sintassi diventa ad esempio
    //nuovonome.php?password=tuapassword

    if(!isset($_GET['password']) || $_GET['password']!=1)exit("For open this page you must digit a password!");

        $target="file";
        if($target=="file")
        {
            header('Content-Type: application/octetstream');
            header('Content-Disposition: filename="backup.sql"');
            $asfile="download";
        }
    
        
        $crlf="\r\n";
        $localhost="localhost";
        $dbuser='root';
        $dbpass='';
        $dbname='db_name';
        $link = mysql_connect($localhost, $dbuser, $dbpass);
        $database = mysql_select_db($dbname); 
    
        //$dbname = "newobs";
    
        $dump_buffer="";
    
        $tables = mysql_query("show tables from $dbname");
        $num_tables = mysql_num_rows($tables);
    
        if($num_tables == 0)
        {
            echo "# No Tables Found";
            exit;
        }
        //MODIFICATI ALCUNI COMMENTI
        $dump_buffer.= "# DatabaseBackup $crlf";
        $dump_buffer.= "# Backup made:$crlf";
        $dump_buffer.= "# ".date("F j, Y, g:i a")."$crlf";
        $dump_buffer.= "# Database: $dbname$crlf";
        $dump_buffer.= "# Backed up tables : $dbname $crlf";
        $dump_buffer.= "$crlf#$crlf";
        $i = 0;
        while($i < $num_tables)
        {
            $table = mysql_tablename($tables, $i);
            //echo $table . "<br>";
                $dump_buffer.= "#--------------------------------------------------------$crlf";
                $dump_buffer.= "$crlf#$crlf";
                $dump_buffer.= "# Table structure for table '$table'$crlf";
                $dump_buffer.= "#$crlf$crlf";
                $db = $table;
                $dump_buffer.= get_table_def($table, $crlf,$dbname).";$crlf";
                $dump_buffer.= "$crlf#$crlf";
                $dump_buffer.= "# Dumping data for table '$table'$crlf";
                $dump_buffer.= "#$crlf$crlf";
                $tmp_buffer="";
                get_table_content($dbname, $table, 0, 0, 'my_handler', $dbname);
                $dump_buffer.=$tmp_buffer;
                
            $i++;
            $dump_buffer.= "$crlf";
        }
        echo $dump_buffer;
        exit;
    
    
    //fixed bug/optimized for mysql>=5.0 (Giuseppe Piraino) ;
    function get_table_def($table, $crlf,$dbname)
    {
        if($table=mysql_query("SHOW CREATE TABLE `$table`")){
            list($table_name, $create_table)=mysql_fetch_row($table);
            return $create_table;
        }
        return False;        
    }
    
    
    function get_table_content($db, $table, $limit_from = 0, $limit_to = 0,$handler)
    {
        // Defines the offsets to use
        if ($limit_from > 0) {
            $limit_from--;
        } else {
            $limit_from = 0;
        }
        if ($limit_to > 0 && $limit_from >= 0) {
            $add_query  = " LIMIT $limit_from, $limit_to";
        } else {
            $add_query  = '';
        }
    
        get_table_content_fast($db, $table, $add_query,$handler);
    
    }
    
    function get_table_content_fast($db, $table, $add_query = '',$handler)
    {
        $result = mysql_query('SELECT * FROM ' . $db . '.' . $table . $add_query) or die();
        if ($result != false) {
    
            @set_time_limit(1200); // 20 Minutes
    
            // Checks whether the field is an integer or not
            for ($j = 0; $j < mysql_num_fields($result); $j++) {
                $field_set[$j] = mysql_field_name($result, $j);
                $type          = mysql_field_type($result, $j);
                if ($type == 'tinyint' || $type == 'smallint' || $type == 'mediumint' || $type == 'int' ||
                    $type == 'bigint'  ||$type == 'timestamp') {
                    $field_num[$j] = true;
                } else {
                    $field_num[$j] = false;
                }
            } // end for
    
            // Get the scheme
            if (isset($GLOBALS['showcolumns'])) {
                $fields        = implode(', ', $field_set);
                $schema_insert = "INSERT INTO `$table` ($fields) VALUES (";
            } else {
                $schema_insert = "INSERT INTO `$table` VALUES (";
            }
    
            $field_count = mysql_num_fields($result);
    
            $search  = array("\x0a","\x0d","\x1a","è","é","à","ì","í","ò","ù","'"); 
            //MODIFICATO IL REPLACE SEARCH
            $replace = array("\\n","\\r","\Z","&egrave;","&eacute","&agrave;","&igrave;","&iacute;","&ograve;","&ugrave;","''");
    
    
            while ($row = mysql_fetch_row($result)) {
                for ($j = 0; $j < $field_count; $j++) {
                    if (!isset($row[$j])) {
                        $values[]     = 'NULL';
                    } else if (!empty($row[$j])) {
                        // a number
                        if ($field_num[$j]) {
                            $values[] = "'" . $row[$j]. "'"; //fixed mysql5 - insert of number need quote! (Giuseppe Piraino); 
                        }
                        // a string
                        else {
                            //$values[] = "'" . str_replace($search, $replace, addslashes($row[$j])) . "'"; MODIFICA DI QUESTA RIGA PER OVVIARE AGLI SLASH
    
    
                            $values[] = "'" . str_replace($search, $replace, $row[$j]) . "'";
                        }
                    } else {
                        $values[]     = "''";
                    } // end if
                } // end for
    
                $insert_line = $schema_insert . implode(',', $values) . ')';
                unset($values);
    
                // Call the handler
                $handler($insert_line);
            } // end while
        } // end if ($result != false)
    
        return true;
    }
    
    
    function my_handler($sql_insert)
    {
        global $crlf, $asfile;
        global $tmp_buffer;
        //Giuseppe Piraino - 5 Nov 2007 - This code is inconsistent
        //uncomment only if you have mysql<=4.1
        //if(empty($asfile))
        //    $tmp_buffer.= htmlspecialchars("$sql_insert;$crlf");
        //else
        $tmp_buffer.= "$sql_insert;$crlf";
    }
    
    
    /* Giuseppe Piraino - this functions are unused
    function faqe_db_error()
    {
        return mysql_error();
    }
    
    function faqe_db_insert_id($result)
    {
        return mysql_insert_id($result);
    }
    */
    

    ?>

    [/php]


  • User Attivo

    Mille grazie per questo codice utilissimo e soprattutto funzionante :festa: