Pregunta

Necesito una manera de exportar y luego importar fácilmente datos en una tabla MySQL desde un servidor remoto a mi servidor doméstico.No tengo acceso directo al servidor y no hay utilidades instaladas como phpMyAdmin.Sin embargo, tengo la capacidad de colocar scripts PHP en el servidor.

¿Cómo accedo a los datos?

Hago esta pregunta simplemente para registrar mi forma de hacerlo.

¿Fue útil?

Solución

Podrías usar SQL para esto:

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

Luego simplemente apunte un navegador o cliente FTP al directorio/archivo (backups/mytable.sql).Esta también es una buena forma de realizar copias de seguridad incrementales, dándole al nombre del archivo una marca de tiempo, por ejemplo.

Para volver a ingresarlo a su base de datos desde ese archivo, puede usar:

$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);

Otros consejos

Lo hice exportando a CSV y luego importando con cualquier utilidad disponible.Me gusta bastante el uso del flujo 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;
}

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

SOLUCIÓN DE TRABAJO (última versión en:Exportar.php + Importar.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;
}

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

Estoy usando este pequeño paquete para realizar copias de seguridad automatizadas de MySQL desde un servidor al que solo tengo acceso 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 también tiene documentación en inglés.

Una búsqueda rápida en Google también muestra esto, pero yo no lo he usado:
http://snipplr.com/view/173/mysql-dump/

Podrías considerar mirar: http://www.webyog.comEsta es una excelente herramienta de administración de GUI y tiene una función de túnel HTTP realmente interesante (no estoy seguro de si esto es solo en empresas, lo que cuesta unos pocos dólares).

Básicamente, usted carga un script que ellos proporcionan en su espacio web (script php) y le indica el administrador sqlyog y puede acceder a las bases de datos.Utiliza este script para hacer un túnel/representar las solicitudes/consultas entre su cliente doméstico y el servidor.

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

Aquí hay un PHP script que hice que hará una copia de seguridad de todas las tablas en su base de datos.Se basa en esto http://davidwalsh.name/backup-mysql-database-php con algunas mejoras.En primer lugar, se configurará correctamente. foreign key restrictions.

En mi configuración, el script se ejecutará en un determinado día de la semana, digamos el lunes.En caso de que no se ejecutara el lunes, aún se ejecutará el martes (por ejemplo), creando el .sql archivo con la fecha del lunes anterior, cuando se suponía que debía ejecutarse.se borrará .sql archivo 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);
    }
}

?>

Yo uso mysqldump a través de la línea de comando:

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

Luego simplemente descarga el archivo resultante y listo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top