Debido 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.

lo prove sobre windows y no da sera por el db cuales son los pasos anteriores
de antemano grasias
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
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.
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!