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 una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

De acuerdo con lo dispuesto en el Reglamento (UE) 2016/679 de 27 de abril de 2016, consiento que mis datos sean tratados bajo la responsabilidad de Oscar Gascón Arjol para recibir respuesta a consultas. publicación de comentarios del blog y que las conserve mientras haya un interés mutuo para ello. Me doy por informado que tengo derecho a revocar este consentimiento en cualquier momento y a ejercer los de acceso, rectificación, portabilidad y supresión de mis datos y los de limitación y oposición al tratamiento dirigiéndome por email a me@oscargascon.es. También estoy informado de que puedo reclamar ante la autoridad de control a www.agpd.es.