
Respaldar bases de datos MySQL
Seguramente alguna vez has tenido perdida de información por no realizar copias de seguridad de las bases de datos con regularidad. Para los administradores de bases de datos y desarrolladores que están a cargo de trabajar directamente con la base de datos, el realizar respaldos es una de las tareas más comunes.
Aunque siempre la mejor manera de hacer respaldos puede ser utilizando una consola directamente en el servidor, en muchas ocasiones y por diferentes motivos no se tiene acceso a una terminal, esto podría ocurrir en casos cuando estamos trabajando en un Hosting compartido, o no tenemos acceso directamente al servidor.
En estas situaciones la mejor opción es crear un script que se encargue de realizar esta tarea sin necesidad de una terminal, y en este artículo les enseñare una forma sencilla y rápida de respaldar todas nuestras bases de datos con una clase escrita en PHP.
Crear clase BackUp
El único requerimiento necesario para el funcionamiento de esta clase es tener habilitado PDO, aunque la lógica que se aplica en esta clase puede ser utilizada con la clase Mysqli. El primer paso es crear una clase con el nombre de BackUp o como ustedes deseen llamarla.
Seguidamente se definen 3 variables, la primera es el usuario de la base de datos, la segunda la contraseña para ese usuario y la tercera es la variable que vamos a utilizar para asignarle la instancia de la clase PDO, en este caso se ha llamado db.
class BackUp{
protected $user = 'root';
protected $password = '';
protected $db = null;
}
En el constructor de la clase vamos a crear un nuevo objeto de la clase PDO, asignándoselo al atributo db de la clase.
public function __construct()
{
$this->db = new PDO("mysql:host=localhost;dbname=prueba;",$this->user,$this->password,array(PDO::ATTR_PERSISTENT => true));
$this->db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
Función showDB
La primera función de esta clase la llamaremos showDB, esta función será la encargada de hacer una consulta a la base de datos con el fin de recuperar los nombres de todas las bases de datos que se encuentran en nuestro servidor. Simplemente ejecutamos la consulta show databases que nos devuelve el nombre de todas las bases de datos; posteriormente, guardamos el resultado en un arreglo, como primer parámetro se guarda un booleano que nos indique todo ha salido bien al ejecutar la consulta, y como segundo parámetro guardamos el resultado de la consulta.
protected function showDB(){
$stat = null;
try{
$stmt = $this->db->prepare("SHOW DATABASES");
$stmt->execute();
$stat = [true, $stmt->fetchAll(PDO::FETCH_ASSOC)];
}catch(PDOException $ex){
$stat = [false, $ex->getMessage()];
}
return $stat;
}
Función backupDatabase
Luego, definimos la segunda función que va a realizar toda la magia de respaldar cada una de las bases de datos de nuestro servidor. En este caso crearemos una función llamada backupDatabase. En esta función, primero se crea un arreglo con las bases de datos que no queremos respaldar, bases de datos como information_schema, las cuales son bases de datos propias de mysql y no de nuestra incumbencia. Luego llamamos la función showDB definida anteriormente, y revisamos que no haya ningún error con el booleano guardado dentro del arreglo.
public function backupDatabase()
{
$restric_db = array('information_schema','mysql','performance_schema','phpmyadmin');
$db = $this->showDB();
if (!$db[0]) {
echo "Ha ocurrido un error " . $db[1];
return;
}
echo "Iniciando proceso de backup ...
";
$location = getcwd().'/'.date("Y-m-d_his");
echo "Comprobando si existe directorio
";
if (!file_exists($location)) {
mkdir($location, 0777, true);
echo "Directorio creado : ".$location."
";
}
foreach ($db[1] as $key) {
if(!in_array($key['Database'], $restric_db))
{
$name = $location.'/'.$key['Database'].'-'.date('Y-m-d--H-i-s').'.sql';
if(strtoupper(PHP_OS) == strtoupper("LINUX"))
{
if ($this->password == '') {
$command = "mysqldump -u ".$this->user." ".$key['Database']." --routines > $name";
} else {
$command = "mysqldump -u ".$this->user." -p".$this->password." ".$key['Database']." --routines > $name";
}
} else {
if($this->password == '') {
$command = "C:/xampp/mysql/bin/mysqldump -u ".$this->user." ".$key['Database']." --routines > $name";
}else {
$command = "C:/xampp/mysql/bin/mysqldump -u ".$this->user." -p".$this->password." ".$key['Database']." --routines > $name";
}
}
exec($command,$output);
echo "Base de datos : ".$key['Database'].", guardada : $name
";
}
}
}
Se crea una variable llamada location en la cual se guarda la ruta del directorio donde se guardarán los archivos del respaldo. Luego, se comprueba que no exista el directorio en el servidor y en caso de que no exista se crea por primera vez.
El siguiente paso a seguir es recorrer cada uno de los nombres de las bases de datos, y respaldar cada una de ellas, para eso utilizamos un ciclo foreach. Comprobamos que no se respalde ninguna de las bases de datos que habíamos guardado en el arreglo restric_db.
Después comprobamos el tipo de sistema operativo, para ejecutar el debido comando, además revisamos si la contraseña del usuario esta vacía o no. Con el comando mysqldump le indicamos a mysql que queremos hacer un backup a una base de datos, este comando va seguido del usuario, la contraseña, el nombre de la base de datos que queremos respaldar, y el nombre del archivo donde se guardara el respaldo.
Cabe destacar que la ruta del comando mysqldump debe ser la ruta donde está instalado el servicio de mysql dentro del servidor, y esto puede cambiar dependiendo del tipo de servidor que se tenga instalado, para este caso se tenía instalado XAMPP.
Con la función exec ejecutamos el comando y generamos el output que es el archivo .sql que se guardara en la carpeta de respaldo. Este proceso se repite para cada una de las bases de datos que tengamos en nuestro servidor mysql, hasta respaldar cada una de ellas.
Probar la clase BackUp
Para respaldar nuestras bases de datos solamente nos queda crear un objeto de la clase BackUp, y luego con el objeto de la instancia de la clase llamamos el método backupDatabase.
require 'BackUp.php';
$backup = new BackUp();
$backup->backupDatabase();
Contenido del articulo
- Comentarios
Comentarios
No hay comentarios. Inicia sesión para comentar.