2008-09-17 10 views
24

Necesito una manera de exportar fácilmente y luego importar datos en una tabla MySQL desde un servidor remoto a mi servidor doméstico. No tengo acceso directo al servidor y no hay instaladas utilidades como phpMyAdmin. Sí, tengo la capacidad de poner scripts PHP en el servidor.Forma fácil de exportar una tabla SQL sin acceso al servidor o phpMyADMIN

¿Cómo puedo obtener los datos?

hago esta pregunta puramente dejar constancia de mi manera de hacerlo

+0

posible duplicado de [Exportar base de datos MySQL con PHP solamente] (http://stackoverflow.com/questions/22195493/export-mysql-database-using-php-only) –

Respuesta

38

usted podría utilizar SQL para esto:

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

A continuación, sólo apuntar un navegador o un cliente FTP en el directorio/archivo (copias de seguridad/mytable.sql). Esta es también una buena forma de realizar copias de seguridad incrementales, dado el nombre de archivo, una marca de tiempo, por ejemplo.

Para ponerlo de nuevo en su base de datos de ese archivo se puede utilizar:

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

La otra opción es usar PHP para invocar un comando del sistema en el servidor y ejecutar 'mysqldump':

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

En cualquier script que ejecute el SELET * INTO OUTFILE, puede hacer un encabezado ('Location:'. $ File) para descargar inmediatamente el archivo. – Jrgns

+1

Tenga en cuenta que el uso de este método requiere que explícitamente 'GRANT FILE ON *. * TO' youruser '@' localhost '; '. También tenga en cuenta que el archivo se está escribiendo con el usuario de MySQL y que MySQL en su instalación puede estar sujeto a restricciones de AppArmor. – DustWolf

+0

¿Hay alguna manera de escupir esto en el html? No me permiten cambios en el servidor CHMOD y no hay permisos de escritura. ¿Puedo escupirlo en JSAON incluso cargarlo en la página? ¿Esto produce los atributos de la tabla también? Como tipo y longitud y tamaño, etc. Gracias – Kreeverp

16

lo hice mediante la exportación a CSV, y luego importar con cualquier utilidad está disponible. Me gusta bastante el uso de la secuencia de salida php: //.

$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; 
} 
3

Si tiene acceso FTP/SFTP, puede simplemente cargar y cargar phpMyAdmin usted mismo.

estoy usando este pequeño paquete para hacer copias de seguridad de MySQL automatizadas de un servidor que sólo tienen acceso a FTP:
http://www.taw24.de/download/pafiledb.php?PHPSESSID=b48001ea004aacd86f5643a72feb2829&action=viewfile&fid=43&id=1
El sitio está en alemán, pero la descarga tiene alguna documentación Inglés también.

Una rápida de Google también da vuelta a esta, pero no he utilizado yo mismo:
http://snipplr.com/view/173/mysql-dump/

+0

Si la posibilidad de subir phpMyAdmin era una opción, lo habría hecho. – Jrgns

+0

¡Me encanta el fragmento, sin embargo! – Jrgns

-1

utilizo mysqldump a través de la línea de comandos:

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

A continuación, sólo tiene que descargar el archivo resultante y yo lo hiciste

+0

El comando no siempre funciona en el alojamiento compartido y/o puede ser un poco problemático de usar (archivo de 0 bytes). Una solución full-php siempre debería funcionar. – LuBre

3

Se podría considerar la búsqueda de: http://www.webyog.com Esta es una gran herramienta de administración visual, y tienen una función de túnel HTTP muy ordenado (no estoy seguro si esto es sólo en la empresa, que cuesta unos cuantos dólares).

Básicamente, usted carga una secuencia de comandos que proporcionan en su espacio web (script php) y le apuntan al administrador de sqlyog y puede acceder a la (s) base (s) de datos. Utiliza esta secuencia de comandos para tunelizar/proxy las solicitudes/consultas entre su cliente doméstico y el servidor.

Conozco al menos 1 persona que utiliza este método con excelentes resultados.

9

También debería considerar phpMinAdmin, que es solo un archivo, por lo que es fácil de cargar y configurar.

6

solución de trabajo (versión más reciente en: Export.php + Import.php)

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

CÓDIGO:

//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; 
} 
2

Aquí es un script PHP Hice lo que se copia de seguridad de todas las tablas en la base de datos. Se basa en este http://davidwalsh.name/backup-mysql-database-php con algunas mejoras. En primer lugar, configurará correctamente foreign key restrictions.

En mi configuración, el script se ejecutará en un día determinado de la semana, digamos el lunes. En caso de que no se ejecute el lunes, aún se ejecutará el martes (por ejemplo), creando el archivo .sql con la fecha del lunes anterior, cuando se suponía que se debía ejecutar. Borrará el archivo .sql de hace 4 semanas, por lo que siempre conserva las últimas 4 copias de seguridad. Aquí está el código:

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

?> 
Cuestiones relacionadas