Guía 50 – Backup Online de Base de Datos

En esta guía se explica el uso de la librería mysqldump-php que nos permite hacer backup de las tablas, vistas, funciones, trigger,  etc., de los objetos de un esquema de MySQL o MariaDB.

Tiene muchas posibilidades configurable a través de su array de propiedades. En el ejemplo están las básicas que he considerado cómo mínimas. Ante nuevos requisitos, podéis probar vosotros por vuestra cuenta o indicádmelo para buscar una alternativa entre ambos.

Objetivo

Hacer un backup de todos los objetos (tablas, vistas, trigger, funciones, etc.) del esquema de base de datos en el que esté conectada una aplicación de PHPRunner.

DEMO: https://fhumanes.com/video/videoclub/

user:  admin/admin

Para explicar esta funcionalidad he utilizado un aplicativo que ya disponía y que está explicado en este artículo.

Solución Técnica

Como he indicado, de las alternativas que existen en GitHUB la que más me ha gustado es mysqldump-php y lo he hecho es integrar esta librería en las aplicaciones PHPRunner.

He creado un nuevo directorio «backup», donde he incluido esta estructura y ficheros.

(1).- Es el directorio donde reside los ficheros de la librería.

(2).- Es el script que utilizando la librería anterior, hace el backup.

(3).- Es el directorio donde se van a crear los ficheros de backup de la base de datos..

 

El fichero «index.php«, contiene:

<?php

//   require_once("../include/dbcommon.php"); // DataBase PHPRunner

include __DIR__."/mysqldump-php_2.9/autoload.php";

use Ifsnop\Mysqldump as IMysqldump;

$host = $_SESSION['db_host'];
$user = $_SESSION['db_user'];
$pwd = $_SESSION['db_pwd'];
$port = $_SESSION['db_port'];
$sys_dbname = $_SESSION['db_sys_dbname'];

$now = date("Y-m-d H:i:s");  // Date by now
$specials = array(":", " ");
$now = str_replace($specials, "_", $now);

$dumpSettings = array(
    // 'exclude-tables' => array('/^travis*/'),
    // 'compress' => IMysqldump\Mysqldump::GZIP,
    'no-data' => false,
    'add-drop-table' => true,
    'single-transaction' => true,
    'lock-tables' => true,
    'add-locks' => true,
    'extended-insert' => false,
    'disable-keys' => true,
    'skip-triggers' => false,
    'add-drop-trigger' => true,
    'routines' => true,
    'databases' => false,
    'add-drop-database' => false,
    'hex-blob' => true,
    'no-create-info' => false,
    // 'where' => '',
    'default-character-set' => IMysqldump\Mysqldump::UTF8MB4,
    'complete-insert' => true
    );
$pref_file_backup = 'Videoclub_';

$http_referer = $_SERVER['HTTP_REFERER'];
$http_referer_ar = explode('/',$http_referer);
// Ajustar a las características de tu URL | Adjust the characteristics of your URL
$file = $http_referer_ar[0].'//'.$http_referer_ar[2].'/'.$http_referer_ar[3].'/'.$http_referer_ar[4].'/'.'backup/backup_files/'.$pref_file_backup.$now.'.sql';
// Ajustar a las características de tu URL | Adjust the characteristics of your URL


try {
    $dump = new IMysqldump\Mysqldump('mysql:host='.$host.';dbname='.$sys_dbname , $user, $pwd , $dumpSettings);
    $dump->start(__DIR__.'/backup_files/'.$pref_file_backup.$now.'.sql');
} catch (\Exception $e) {
    echo 'mysqldump-php error: ' . $e->getMessage();
}

// Dejar sólo los 5 export de base de datos, más recientes.| Leave only the 5 recent database export.
$arrFiles = glob(__DIR__.'/backup_files/'.$pref_file_backup.'*');

rsort($arrFiles);  // Ordenar de mayor a menor

if (count($arrFiles) > 5 ) {
    for ($i = 5; $i < count($arrFiles); $i++) {
        unlink($arrFiles[$i]); // Delete ancient files
    }   
}

Como se puede leer, el script se divide en estas partes:

  • Recuperación de la información de conexión a la base de datos. Un poco más adelante, explico como se cargar estas variables de sesión.
  • Confección del array de las opciones y obtención de valores para dar nombre al fichero que va a contener el backup.
  • Creación de backup físicamente utilizando la librería.
  • Eliminación de posibles ficheros de backup antiguos. Sólo deja los 5 últimos ciclos de los ficheros de backup.

En la ventana de configuración de la conexión es donde se cargan las variables de sesión.

Para la opción del menú se define una vista de PHPRunner (da igual la tabla que se use), es para que esta opción de «backup» sólo se ofrezca al perfil de «admin». Se programa este evento (Before process):

La verdad es que la solución ha quedado muy «potente» y es muy rápida, pudiendo disponer de un backup de la base de datos, casi de forma inmediata.

Para cualquier duda, contactar conmigo a través de mi email [email protected]

Para que lo podáis instalar en vuestro PC y hacer cuantas pruebas requiráis, os facilito el proyecto PHPRunner.

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner