Domanda

Ho bisogno di un modo per esportare facilmente e quindi importare i dati in una tabella di MySQL da un server remoto al mio server di casa.Non ho accesso diretto al server, e non di utilità come phpMyAdmin installato.Ho, tuttavia, hanno la capacità di mettere gli script PHP sul server.

Come posso ottenere i dati?

Ti faccio questa domanda puramente per registrare il mio modo per farlo

È stato utile?

Soluzione

Si potrebbe utilizzare SQL per questo:

$file = 'backups/mytable.sql';
$result = mysql_query("SELECT * INTO OUTFILE '$file' FROM `##table##`");

Quindi basta puntare un browser o un client FTP nella directory/file (backup/mytable.sql).Questo è anche un bel modo per fare un backup incrementale, dato il nome di un timestamp per esempio.

Per ottenere nuovo per il vostro DataBase dal file che è possibile utilizzare:

$file = 'backups/mytable.sql';
$result = mysql_query("LOAD DATA INFILE '$file' INTO TABLE `##table##`");

L'altra opzione è quella di utilizzare PHP per richiamare un comando di sistema sul server ed eseguire 'mysqldump':

$file = 'backups/mytable.sql';
system("mysqldump --opt -h ##databaseserver## -u ##username## -p ##password## ##database | gzip > ".$file);

Altri suggerimenti

Io l'ho fatto per l'esportazione di file CSV e quindi di importazione con qualsiasi utilità è disponibile.Mi piace molto l'uso del php://stream di output.

$result = $db_con->query('SELECT * FROM `some_table`');
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}

Si dovrebbe anche considerare phpMinAdmin che è solo un file, quindi è facile da caricare e di installazione.

SOLUZIONE DI LAVORO (ultima versione:Export.php + Import.php )

EXPORT_TABLES("localhost","user","pass","db_name");

CODICE:

//https://github.com/tazotodua/useful-php-scripts
function EXPORT_TABLES($host,$user,$pass,$name,  $tables=false, $backup_name=false ){
    $mysqli = new mysqli($host,$user,$pass,$name); $mysqli->select_db($name); $mysqli->query("SET NAMES 'utf8'");
    $queryTables = $mysqli->query('SHOW TABLES'); while($row = $queryTables->fetch_row()) { $target_tables[] = $row[0]; }   if($tables !== false) { $target_tables = array_intersect( $target_tables, $tables); }
    foreach($target_tables as $table){
        $result = $mysqli->query('SELECT * FROM '.$table);  $fields_amount=$result->field_count;  $rows_num=$mysqli->affected_rows;     $res = $mysqli->query('SHOW CREATE TABLE '.$table); $TableMLine=$res->fetch_row();
        $content = (!isset($content) ?  '' : $content) . "\n\n".$TableMLine[1].";\n\n";
        for ($i = 0, $st_counter = 0; $i < $fields_amount;   $i++, $st_counter=0) {
            while($row = $result->fetch_row())  { //when started (and every after 100 command cycle):
                if ($st_counter%100 == 0 || $st_counter == 0 )  {$content .= "\nINSERT INTO ".$table." VALUES";}
                    $content .= "\n(";
                    for($j=0; $j<$fields_amount; $j++)  { $row[$j] = str_replace("\n","\\n", addslashes($row[$j]) ); if (isset($row[$j])){$content .= '"'.$row[$j].'"' ; }else {$content .= '""';}     if ($j<($fields_amount-1)){$content.= ',';}      }
                    $content .=")";
                //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler
                if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {$content .= ";";} else {$content .= ",";} $st_counter=$st_counter+1;
            }
        } $content .="\n\n\n";
    }
    $backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql";
    header('Content-Type: application/octet-stream');   header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"".$backup_name."\"");  echo $content; exit;
}

Se si dispone di FTP/SFTP accesso si può solo andare avanti e caricare phpMyAdmin te.

Sto usando questo pacchetto poco per rendere automatizzato mysql backup di un server ho solo accesso FTP per:
http://www.taw24.de/download/pafiledb.php?PHPSESSID=b48001ea004aacd86f5643a72feb2829&action=viewfile&fid=43&id=1
Il sito è in tedesco, ma il download è un po ' di inglese la documentazione.

Una rapida occhiata su google si trasforma anche questa, ma non l'ho usato io:
http://snipplr.com/view/173/mysql-dump/

Si potrebbe prendere in considerazione guardando: http://www.webyog.com Questo è un grande strumento GUI di amministrazione, e hanno davvero pulito HTTP Tunneling funzione (non sono sicuro se questo è solo in enterprise che costa un paio di dollari).

In sostanza, o caricare uno script che forniscono nel tuo spazio web (script php) e punto di sqlyog manager e si può accedere al database(s).Usa questo script per tunnel proxy/richieste/domande tra il vostro home client e il server.

So che almeno 1 persona che utilizza questo metodo con ottimi risultati.

Qui è un PHP script che ho realizzato che eseguirà il backup di tutte le tabelle nel database.Esso si basa su questo http://davidwalsh.name/backup-mysql-database-php con alcuni miglioramenti.Prima di tutto sarà impostato correttamente foreign key restrictions.

Nel mio set up, lo script viene eseguito in un determinato giorno della settimana, diciamo lunedì.In caso non eseguire il lunedì, sarà ancora martedì (per esempio) per creare il .sql il file con la data del lunedì precedente, quando si doveva correre.Essa cancella .sql file da 4 settimane fa, e quindi non sempre mantiene gli ultimi 4 copie di backup.Ecco il codice:

<?php

backup_tables();

// backup all tables in db
function backup_tables()
{
    $day_of_backup = 'Monday'; //possible values: `Monday` `Tuesday` `Wednesday` `Thursday` `Friday` `Saturday` `Sunday`
    $backup_path = 'databases/'; //make sure it ends with "/"
    $db_host = 'localhost';
    $db_user = 'root';
    $db_pass = '';
    $db_name = 'movies_database_1';

    //set the correct date for filename
    if (date('l') == $day_of_backup) {
        $date = date("Y-m-d");
    } else {
        //set $date to the date when last backup had to occur
        $datetime1 = date_create($day_of_backup);
        $date = date("Y-m-d", strtotime($day_of_backup.' -7 days'));
    }

    if (!file_exists($backup_path.$date.'-backup'.'.sql')) {

        //connect to db
        $link = mysqli_connect($db_host,$db_user,$db_pass);
        mysqli_set_charset($link,'utf8');
        mysqli_select_db($link,$db_name);

        //get all of the tables
        $tables = array();
        $result = mysqli_query($link, 'SHOW TABLES');
        while($row = mysqli_fetch_row($result))
        {
            $tables[] = $row[0];
        }

        //disable foreign keys (to avoid errors)
        $return = 'SET FOREIGN_KEY_CHECKS=0;' . "\r\n";
        $return.= 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";' . "\r\n";
        $return.= 'SET AUTOCOMMIT=0;' . "\r\n";
        $return.= 'START TRANSACTION;' . "\r\n";

        //cycle through
        foreach($tables as $table)
        {
            $result = mysqli_query($link, 'SELECT * FROM '.$table);
            $num_fields = mysqli_num_fields($result);
            $num_rows = mysqli_num_rows($result);
            $i_row = 0;

            //$return.= 'DROP TABLE '.$table.';'; 
            $row2 = mysqli_fetch_row(mysqli_query($link,'SHOW CREATE TABLE '.$table));
            $return.= "\n\n".$row2[1].";\n\n"; 

            if ($num_rows !== 0) {
                $row3 = mysqli_fetch_fields($result);
                $return.= 'INSERT INTO '.$table.'( ';
                foreach ($row3 as $th) 
                { 
                    $return.= '`'.$th->name.'`, '; 
                }
                $return = substr($return, 0, -2);
                $return.= ' ) VALUES';

                for ($i = 0; $i < $num_fields; $i++) 
                {
                    while($row = mysqli_fetch_row($result))
                    {
                        $return.="\n(";
                        for($j=0; $j<$num_fields; $j++) 
                        {
                            $row[$j] = addslashes($row[$j]);
                            $row[$j] = preg_replace("#\n#","\\n",$row[$j]);
                            if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
                            if ($j<($num_fields-1)) { $return.= ','; }
                        }
                        if (++$i_row == $num_rows) {
                            $return.= ");"; // last row
                        } else {
                            $return.= "),"; // not last row
                        }   
                    }
                }
            }
            $return.="\n\n\n";
        }

        // enable foreign keys
        $return .= 'SET FOREIGN_KEY_CHECKS=1;' . "\r\n";
        $return.= 'COMMIT;';

        //set file path
        if (!is_dir($backup_path)) {
            mkdir($backup_path, 0755, true);
        }

        //delete old file
        $old_date = date("Y-m-d", strtotime('-4 weeks', strtotime($date)));
        $old_file = $backup_path.$old_date.'-backup'.'.sql';
        if (file_exists($old_file)) unlink($old_file);

        //save file
        $handle = fopen($backup_path.$date.'-backup'.'.sql','w+');
        fwrite($handle,$return);
        fclose($handle);
    }
}

?>

Io uso mysqldump tramite la riga di comando :

exec("mysqldump sourceDatabase -uUsername -p'password'  > outputFilename.sql");

Quindi basta scaricare il file risultante e hai fatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top