Estoy usando la secuencia de comandos Copia de seguridad de la base de datos por David Walsh (http://davidwalsh.name/backup-mysql-database-php) para hacer una copia de seguridad de mi base de datos MYSQL como un archivo .sql en mi servidor.¿Por qué mi script de copia de seguridad de base de datos no funciona en php?
Creé un usuario llamado backup y le di todos los privilegios (solo para estar seguro). Luego puse el código en un archivo php y configuré un trabajo cron para ejecutar el archivo php.
Este es el código:
/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{
$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);
$return.= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";
for ($i = 0; $i < $num_fields; $i++)
{
while($row = mysql_fetch_row($result))
{
$return.= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$num_fields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}
//save file
$handle = fopen('../backup/db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
fwrite($handle,$return);
fclose($handle);
}
backup_tables('localhost','alupto_backup','pass','*');
Cuando el trabajo de cron se ejecuta, la copia de seguridad no funciona y recibo un correo electrónico con el error que aparece:
Advertencia: mysql_fetch_row(): argumento suministrado no es un recurso válido de resultados MySQL en /home5/ideapale/public_html/amator ders_basic/admin/backup.php en la línea
En la línea 18 es el código:
while($row = mysql_fetch_row($result))
cuando ejecuto el SQL (VER TABLA) en phpMyAdmin, funciona bien y me muestra una lista de todas las tablas. Pero por alguna razón, recibo un error cuando el archivo php intenta ejecutar el SQL.
¿Por qué mi script de copia de seguridad de la base de datos no funciona?
Y usa el 'ereg_replace()' obsoleto solo para agregar a la lista. –
shellexec? ¿Por qué incluso usar PHP para ejecutar un programa a través de cron? –
Ok, nunca me di cuenta de eso. ¿Conoces un buen tutorial que muestra cómo usar shellexec() para ejecutar mysqldump? – zeckdude