En esta ocasión esta entrada será muy breve y concisa para resolver un problema muy frecuente en aquellos que trabajamos día a día en el entorno web. Seguro que más de una vez os ha llegado un proyecto heredado, una migración de una web o quizás una actualización. Posiblemente tú no seas el programador original y no tienes acceso a un panel de control para extraer el contenido de la BD. Bueno, con este método podrás conseguir el contenido de la Base de Datos en unos segundos sólo con acceso por FTP.

Este escenario es muy frecuente. Te contratan para realizar una migración de una web a otro servidor, quizás una actualización, una puesta al día o simplemente quieres realizar una copia de seguridad de la Base de Datos de un proyecto web. Generalmente esto es muy sencillo de resolver cuando se tiene acceso a un panel de control o al conocido PHPMyAdmin… Pero no siempre es así.

En la realidad existen clientes descuidados que pierden datos de conectividad, malos profesionales que chantajean al cliente y se apropian del desarrollo que ha pagado el cliente, consultoras perezosas que tardan días en responder, etc. Cada cual que haga funcionar su imaginación y probablemente haga corto.

En cualquier caso, no hace falta un script complejo para obtener un volcado. Y en este caso podemos acudir a desarrollos muy cuidados como https://github.com/ifsnop/mysqldump-php que ofrece un montón de funcionalidades, como compresión de datos y otras funcionalidades.

Y también otras soluciones batalleras para realizar un dump de MySQL por PHP, que yo he mismo he probado y que os puedo garantizar funciona perfectamente. Simplemente con subir el script, completar los datos de configuración y ejecutarlos via web tendréis un volcado de la BDD y os ahorrará un montón de tiempo y probablemente tickets con inoperativas consultoras web.

Os incluyo el código también.

<?php
    // db config
    $dbhost = "dbhost";
    $dbuser = "dbuser";
    $dbpass = "dbpass";
    $dbname = "dbname";
    // db connect
    $pdo = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
    // file header stuff
    $output = "-- PHP MySQL Dump\n--\n";
    $output .= "-- Host: $dbhost\n";
    $output .= "-- Generated: " . date("r", time()) . "\n";
    $output .= "-- PHP Version: " . phpversion() . "\n\n";
    $output .= "SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\";\n\n";
    $output .= "--\n-- Database: `$dbname`\n--\n";
    // get all table names in db and stuff them into an array
    $tables = array();
    $stmt = $pdo->query("SHOW TABLES");
    while($row = $stmt->fetch(PDO::FETCH_NUM)){
        $tables[] = $row[0];
    }
    // process each table in the db
    foreach($tables as $table){
        $fields = "";
        $sep2 = "";
        $output .= "\n-- " . str_repeat("-", 60) . "\n\n";
        $output .= "--\n-- Table structure for table `$table`\n--\n\n";
        // get table create info
        $stmt = $pdo->query("SHOW CREATE TABLE $table");
        $row = $stmt->fetch(PDO::FETCH_NUM);
        $output.= $row[1].";\n\n";
        // get table data
        $output .= "--\n-- Dumping data for table `$table`\n--\n\n";
        $stmt = $pdo->query("SELECT * FROM $table");
        while($row = $stmt->fetch(PDO::FETCH_OBJ)){
            // runs once per table - create the INSERT INTO clause
            if($fields == ""){
                $fields = "INSERT INTO `$table` (";
                $sep = "";
                // grab each field name
                foreach($row as $col => $val){
                    $fields .= $sep . "`$col`";
                    $sep = ", ";
                }
                $fields .= ") VALUES";
                $output .= $fields . "\n";
            }
            // grab table data
            $sep = "";
            $output .= $sep2 . "(";
            foreach($row as $col => $val){
                // add slashes to field content
                $val = addslashes($val);
                // replace stuff that needs replacing
                $search = array("\'", "\n", "\r");
                $replace = array("''", "\\n", "\\r");
                $val = str_replace($search, $replace, $val);
                $output .= $sep . "'$val'";
                $sep = ", ";
            }
            // terminate row data
            $output .= ")";
            $sep2 = ",\n";
        }
        // terminate insert data
        $output .= ";\n";
    }   
    // output file to browser
    header('Content-Description: File Transfer');
    header('Content-type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $dbname . '.sql');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . strlen($output));
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
    header('Pragma: public');
    echo $output;

Espero que os ahorre mucho tiempo y problemas.

Comparte si te ha gustado
  •  
  •  
  •  
  •  
  •  

Autor:
Última actualización:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *