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
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);
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;
}
vous devriez également considérer phpMinAdmin qui est seulement un fichier, donc il est facile de télécharger et de se configurer.
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;
}
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 /
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.
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);
}
}
?>
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.