Façon facile d'exporter une table SQL sans accès au serveur ou à phpMyADMIN

j'ai besoin d'un moyen pour facilement exporter et ensuite importer des données dans une table MySQL à partir d'un serveur distant vers mon serveur domestique. Je n'ai pas d'accès direct au serveur, et aucun utilitaire tel que phpMyAdmin n'est installé. J'ai cependant la possibilité de mettre des scripts PHP sur le serveur.

Comment puis-je obtenir les données?

je pose cette question purement pour noter ma façon de le faire

24
demandé sur OMG Ponies 2008-09-17 14:45:29

8 réponses

vous pouvez utiliser SQL pour ceci:

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

ensuite il suffit de pointer un navigateur ou un client FTP vers le répertoire/fichier (sauvegardes/mytable.SQL.) C'est aussi une bonne façon de faire des sauvegardes incrémentielles, étant donné que le nom du fichier est un timestamp par exemple.

pour le récupérer dans votre base de données à partir de ce fichier, vous pouvez utiliser:

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

l'autre option est D'utiliser PHP pour invoquer une commande système sur le serveur et exécuter 'mysqldump':

$file = 'backups/mytable.sql';
system("mysqldump --opt -h ##databaseserver## -u ##username## -p ##password## ##database | gzip > ".$file);
38
répondu lewis 2017-06-13 19:23:30

Je l'ai fait en exportant vers CSV, puis en important avec n'importe quel utilitaire disponible. J'aime bien l'utilisation du php://flux de sortie.

$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;
}
17
répondu Jrgns 2008-09-17 10:48:24

vous devriez également considérer phpMinAdmin qui est seulement un fichier, donc il est facile de télécharger et de se configurer.

11
répondu Shinhan 2008-09-18 21:31:44

WORKING SOLUTION (dernière version au: exportation.php + Import.php )

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

CODE:

//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;
}
8
répondu T.Todua 2015-06-01 07:42:57

si vous avez un accès FTP/SFTP vous pouvez simplement aller de l'avant et télécharger phpMyAdmin vous-même.

j'utilise ce petit paquet pour faire des sauvegardes mysql automatisées à partir d'un serveur auquel je n'ai accès que par FTP:

http://www.taw24.de/download/pafiledb.php?PHPSESSID=b48001ea004aacd86f5643a72feb2829&action=viewfile&fid=43&id=1

Le site est en allemand, mais le téléchargement a aussi de la documentation en anglais.

un rapide google trouve aussi cela, mais je ne l'ai pas utilisé moi-même:

http://snipplr.com/view/173/mysql-dump /

3
répondu Lasar 2008-09-17 11:02:57

vous pourriez envisager de regarder: http://www.webyog.com C'est un excellent outil d'administration GUI, et ils ont une fonctionnalité de tunnel HTTP vraiment soignée (Je ne suis pas sûr que ce soit seulement dans l'entreprise qui coûte quelques dollars).

essentiellement, vous téléchargez un script qu'ils fournissent dans votre espace web (script php) et point sqlyog manager à elle et vous pouvez accéder à la base de données(s). Il utilise ce script pour tunnel / proxy les requêtes / requêtes entre votre maison le client et le serveur.

je connais au moins une personne qui utilise cette méthode avec de grands résultats.

3
répondu DreamWerx 2008-09-17 16:57:40

voici un script PHP que j'ai créé pour sauvegarder toutes les tables de votre base de données. Il est basé sur ce http://davidwalsh.name/backup-mysql-database-php avec quelques améliorations. Tout d'abord, il sera correctement mis en place foreign key restrictions .

dans ma configuration, le script tournera un certain jour de la semaine, disons lundi. Dans le cas où il n'a pas fonctionné le lundi, il continuera à fonctionner le mardi (Par exemple), créant le fichier .sql avec le Date du lundi précédent, quand il était censé fonctionner. Il effacera le fichier .sql d'il y a 4 semaines, donc il conserve toujours les 4 dernières sauvegardes. Voici le code:

<?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);
    }
}

?>
2
répondu Vali Munteanu 2015-08-20 13:09:40

j'utilise mysqldump via la ligne de commande :

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

ensuite, il vous suffit de télécharger le fichier résultant et votre fait.

-1
répondu SeanDowney 2008-09-17 16:22:38