Backup Mysql dtabase with PHP and mysqldump

php mysql backup dump

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";
?>
Back to Scripts