Backup de base de datos en Zend Framework

Escrito por Víctor Mundet en 03/04/2010

Zend FrameworkDebido al desarrollo de un proyecto personal en PHP y Zend Framework (con MySQL), me he visto con la necesidad de tener un sistema automático de copias de seguridad.

A continuación tenéis el código para generar una copia de seguridad de la base de datos, un fichero por tabla y luego un fichero con todas las tablas. Dependiendo de vuestras necesidades, preferiréis un sistema u otro. Aunque yo opto por ambos a la vez.

Para empezar, vamos a definir rutas y obtener objetos de BD. En este paso, cada uno debe hacerlo a su forma, en mi caso en el Bootstrap he creado el objeto Zend_Db y lo he puesto en el Zend_Registry. Para poder obtenerlo y utilizarlo en casos como éste.


$rootPath = "../backups/";
$destination = $rootPath . "mysql-" . date("Y.m.d");

mkdir($destination);

$db = Zend_Registry::get('db');
$config = $db->getConfig();

Una vez que tenemos los objetos, procedemos a recorrer todas las tablas y hacer dumps de cada una de ellas.


$rowset = $db->fetchAll( "SHOW TABLES" );

foreach ($rowset as $row)
{
 $query = "OPTIMIZE TABLE " . $row['Tables_in_' . $config['dbname'] ];
 $db->query( $query );
 $path = $destination . "/{$row['Tables_in_' . $config['dbname'] ]}." . date("Y.m.d") . ".sql";

 //Dump tabla a tabla
 system( "mysqldump --opt -u {$config['username']} -p{$config['password']} -h {$config['host']} {$config['dbname']} {$row['Tables_in_' . $config['dbname'] ]} > $path " );
}

También podemos hacer un dump completo de todas las tablas, como toda la vida.


$path = $destination . "/{$config['dbname']}." . date("Y.m.d") . ".sql";

//Dump de todas las tablas
system( "mysqldump --opt -u {$config['username']} -p{$config['password']} -h {$config['host']} {$config['dbname']} > $path " );

Comprimimos y limpiamos los temporales. ¡Y eso es todo!


//Comprimimos el contenido
system( "tar zcf {$destination}.tar.gz {$destination}"  );
system( "rm -rf $destination" );

$db->closeConnection();
echo "Backup generado! ".$destination;

Este sistema está basado en el código de ‘Pablo Morales’.
Tenéis más información y explicación de como ejecutarlo en cron en su blog.

Tags: / / /

4 Respuestas

  1. rene says:

    lo prove sobre windows y no da sera por el db cuales son los pasos anteriores
    de antemano grasias

  2. rene:
    Anteriormente has de haber creado el objeto Zend_Db, te muestro un ejemplo (lo has de incluir en tu Bootstrap):

    //Función para crear objeto Zend_Db
    protected function _initPluginResource(){
    
        $dbs = $this->getPluginResource("db"); //Obtenemos el recurso 'db' del application.ini
        $adaptador = $dbs->getAdapter(); //Creamos el adapter
    
        $db = Zend_Db::factory($adaptador,$dbs->getParams()); //Creamos objeto Zend_Db
    
        Zend_Registry::set('db', $db); //Lo metemos en Zend_Registry para usarlo más adelante
    
        Zend_Db_Table_Abstract::setDefaultAdapter($db); //Lo marcamos por defecto
    
    }
    

    Revisa que tengas bien el MySQL, y comprueba que tengas el ejecutable mysqldump.
    Aunque a decir verdad… es posible que en Windows falle algo. Únicamente lo he podido testear sobre Linux y Mac.
    Mucha suerte ;)

  3. fredy says:

    muy bueno el tuto. solo tengo un problema, te cuento me genera solo archivo.sql en blanco osea sin contenido. y como hago para que me genere el script de las tablas. y para restaurar como seria?. estare a la espectativa de tu respuesta. saludos amigo.

  4. fredy:
    Por lo que he visto, a mi me pasa lo mismo ahora con mi nuevo hosting. Tiene deshabilitados los comandos de consola tipo exec, system, ini_set y compañía.
    Comprueba que sea eso, si muestras los errores con ‘error_reporting(E_ALL);’, debería salirte lo que te comento.
    En caso de que tu hosting bloquee esos comandos, la alternativa a hacer un backup del mysql es esta: http://www.hashbangcode.com/blog/backup-mysql-database-php-script-420.html
    La otra alternativa es contactar con tu hosting para que te habiliten esos comandos.

    Espero haberte ayudado, ya nos comentas!

Deja tu comentario