This script backup MySQL databses to a '.sql' file in the same folder.
<?php
/**
* Multi-User MySQL Backup Script
* Saves each database into its own .sql file in the current directory
*/
// Number of backups to keep per database (adjust as needed)
$keep_backups = 2;
// List of databases with their corresponding user credentials
$databases = [
[
'user' => 'username',
'pass' => 'password',
'host' => 'database_host',
'dbs' => ['db1']
],
[
'user' => 'username1',
'pass' => 'password1',
'host' => 'database_host',
'dbs' => ['db2']
]
];
// Loop through each entry
foreach ($databases as $entry) {
$user = $entry['user'];
$pass = $entry['pass'];
$host = $entry['host'];
foreach ($entry['dbs'] as $db) {
$filename = $db . "_" . date("Y-m-d_H-i-s") . ".sql";
// Command to dump database
$command = sprintf(
'mysqldump --no-tablespaces --user=%s --password=%s --host=%s %s > %s',
escapeshellarg($user),
escapeshellarg($pass),
escapeshellarg($host),
escapeshellarg($db),
escapeshellarg($filename)
);
echo "Backing up database: $db to $filename\n";
system($command, $retval);
if ($retval === 0) {
echo "✅ Success: $db\n";
// Clean up old backups for this database (only if backup succeeded)
$files = glob($db . '_*.sql');
if (count($files) > $keep_backups) {
// Sort by file modification time (oldest first)
usort($files, function($a, $b) {
return filemtime($a) - filemtime($b);
});
// Delete the oldest files beyond the keep limit
$to_delete = array_slice($files, 0, count($files) - $keep_backups);
foreach ($to_delete as $old_file) {
if (unlink($old_file)) {
echo "🗑️ Deleted old backup: " . basename($old_file) . "\n";
} else {
echo "⚠️ Failed to delete: " . basename($old_file) . "\n";
}
}
}
} else {
echo "❌ Failed: $db\n";
}
}
}
echo "All backups completed.\n";
?>