Esto es uno de los problemas con los que más tenemos que lidiar los webmasters, cuando existen sitios que muevne grandes cantidades de información, solo por dar una cifra, un blog en WordPress con tan solo 1000 entradas, la base de datos puede llegar a pesar 15 megas (sin comprimir); no todos los phpMyAdmin permiten subir base de datos grandes, imaginemos un WordPress MU con 100 blogs alojados? puede llegar a pesar mucho más, para esto existen soluciones más prácticas.

Se puede usar un comando bastante fácil dependiendo si estamos en Windows o Linux, algunos no tenemos acceso a la consola de nuestro servidor por eso también explicaré como hacerlo desde PHP; bueno, vamos con la parte interesante:
1) Si estamos en un servidor que usa Windows, abriremos una consola, es decir, ir a ejecutar y poner CMD, pondremos el siguiente comando:
mysqldump --opt -u nombredeusuario -p basededatos tabla1 > archivodebackup.txt
Esto nos generará un archivo de texto donde estará la base de datos.
2) En caso estemos en Linux que es lo más normal al usar mySQL usaremos el siguiente comando:
mysqldump --opt -u nombredeusuario --password=clave basededatos > archivodebackup.sql
Con lo anterior hemos creado un backup de la base de datos en un archivo llamado “archivodebackup.sql”.
tar -cfv archivodebackup.sql.tar archivodebackup.sql
Con el comando anterior estamos creando un archivo comprimido en .tar que se llamará “archivodebackup.sql.tar”, esto es bastante importante porque las base de datos pueden pesar mucho si no están comprimidas.
gzip archivodebackup.sql
Con el comando anterior es para en caso no queramos comprimirlo en .tar poder hacerlo en .zip
3) Por último veremos como hacerlo en php para quienes no tienen acceso a la consola del servidor:
Para hacerlo usaremos el siguiente script, esperen que cargue la web y podrán copiarlo usando el botón “view source”.
<?php
/* Usuario para la conexion a Mysql. */
$usurio = "root";
/* Password para la conexion a Mysql. */
$passwd = "root";
/* Host para la conexion a Mysql. */
$host = "localhost";
/* Base de Datos que se seleccionará. */
$bd = "test";
/* Nombre del fichero que se descargará. */
$nombre = "dump.txt";
/* Determina si la tabla será vaciada (si existe) cuando restauremos la tabla. */
$drop = false;
/*
* Array que contiene las tablas de la base de datos que seran resguardadas.
* Puede especificarse un valor false para resguardar todas las tablas
* de la base de datos especificada en $bd.
*
* Ejs.:
* $tablas = false;
* o
* $tablas = array("tabla1", "tabla2", "tablaetc");
*
*/
$tablas = false;
/*
* Tipo de compresion.
* Puede ser "gz", "bz2", o false (sin comprimir)
*/
$compresion = false;
/* Conexion y eso*/
$conexion = mysql_connect($host, $usurio, $passwd)
or die("No se conectar con el servidor MySQL: ".mysql_error());
mysql_select_db($bd, $conexion)
or die("No se pudo seleccionar la Base de Datos: ". mysql_error());
/* Se busca las tablas en la base de datos */
if ( empty($tablas) ) {
$consulta = "SHOW TABLES FROM $bd;";
$respuesta = mysql_query($consulta, $conexion)
or die("No se pudo ejecutar la consulta: ".mysql_error());
while ($fila = mysql_fetch_array($respuesta, MYSQL_NUM)) {
$tablas[] = $fila[0];
}
}
/* Se crea la cabecera del archivo */
$info['dumpversion'] = "1.1b";
$info['fecha'] = date("d-m-Y");
$info['hora'] = date("h:m:s A");
$info['mysqlver'] = mysql_get_server_info();
$info['phpver'] = phpversion();
ob_start();
print_r($tablas);
$representacion = ob_get_contents();
ob_end_clean ();
preg_match_all('/(\[\d+\] => .*)\n/', $representacion, $matches);
$info['tablas'] = implode("; ", $matches[1]);
$dump = <<<EOT
# +===================================================================
# | YoDumpeo! {$info['dumpversion']}
# | por fran86 <fran86@myrealbox.com>
# |
# | Generado el {$info['fecha']} a las {$info['hora']} por el usurio '$usurio'
# | Servidor: {$_SERVER['HTTP_HOST']}
# | MySQL Version: {$info['mysqlver']}
# | PHP Version: {$info['phpver']}
# | Base de datos: '$bd'
# | Tablas: {$info['tablas']}
# |
# +-------------------------------------------------------------------
EOT;
foreach ($tablas as $tabla) {
$drop_table_query = "";
$create_table_query = "";
$insert_into_query = "";
/* Se halla el query que será capaz vaciar la tabla. */
if ($drop) {
$drop_table_query = "DROP TABLE IF EXISTS `$tabla`;";
} else {
$drop_table_query = "# No especificado.";
}
/* Se halla el query que será capaz de recrear la estructura de la tabla. */
$create_table_query = "";
$consulta = "SHOW CREATE TABLE $tabla;";
$respuesta = mysql_query($consulta, $conexion)
or die("No se pudo ejecutar la consulta: ".mysql_error());
while ($fila = mysql_fetch_array($respuesta, MYSQL_NUM)) {
$create_table_query = $fila[1].";";
}
/* Se halla el query que será capaz de insertar los datos. */
$insert_into_query = "";
$consulta = "SELECT * FROM $tabla;";
$respuesta = mysql_query($consulta, $conexion)
or die("No se pudo ejecutar la consulta: ".mysql_error());
while ($fila = mysql_fetch_array($respuesta, MYSQL_ASSOC)) {
$columnas = array_keys($fila);
foreach ($columnas as $columna) {
if ( gettype($fila[$columna]) == "NULL" ) {
$values[] = "NULL";
} else {
$values[] = "'".mysql_real_escape_string($fila[$columna])."'";
}
}
$insert_into_query .= "INSERT INTO `$tabla` VALUES (".implode(", ", $values).");\n";
unset($values);
}
$dump .= <<<EOT
# | Vaciado de tabla '$tabla'
# +------------------------------------->
$drop_table_query
# | Estructura de la tabla '$tabla'
# +------------------------------------->
$create_table_query
# | Carga de datos de la tabla '$tabla'
# +------------------------------------->
$insert_into_query
EOT;
}
/* Envio */
if ( !headers_sent() ) {
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Transfer-Encoding: binary");
switch ($compresion) {
case "gz":
header("Content-Disposition: attachment; filename=$nombre.gz");
header("Content-type: application/x-gzip");
echo gzencode($dump, 9);
break;
case "bz2":
header("Content-Disposition: attachment; filename=$nombre.bz2");
header("Content-type: application/x-bzip2");
echo bzcompress($dump, 9);
break;
default:
header("Content-Disposition: attachment; filename=$nombre");
header("Content-type: application/force-download");
echo $dump;
}
} else {
echo "<b>ATENCION: Probablemente ha ocurrido un error</b><br />\n<pre>\n$dump\n</pre>";
}
?>
Con esto podremos hacer copias de seguridad de nuestra base de datos en mySQL cuando es muy grande y no podemos usando el gestor de base de datos convencional.
Ayudado de Foros del Web



Trackbacks /
Pingbacks