DEV Community

Cover image for Automating Backup and Restore Processes with Python, Bash, and PowerShell
Oliver Bennet for GraphPe

Posted on

Automating Backup and Restore Processes with Python, Bash, and PowerShell

In the world of IT, backups are a lifeline. Losing critical data can bring entire systems down, leading to financial loss, customer dissatisfaction, and operational disruptions. Automated backup and restore processes are essential for protecting your data and ensuring that you can recover quickly when something goes wrong.

In this Scripting Saturdays post, we’ll explore how to automate backup and restore processes using three powerful scripting languages: Python, Bash, and PowerShell. You’ll learn how to schedule backups, create custom restore points, and automate the entire process to ensure your data remains secure and recoverable.

Why Automate Backups and Restores?

Manual backup procedures are error-prone and can easily be overlooked, especially in environments with large amounts of data or complex infrastructure.

Here are the key benefits of automating these processes:

  • Data Protection and Reliability
    Regularly scheduled backups ensure that you have a recent copy of your data available at all times. Automation reduces the risk of human error, ensuring that backups happen consistently, and you’re not relying on memory or manual intervention.

  • Fast Recovery
    Automated restore scripts make recovery faster and more predictable. In the event of a system crash, hardware failure, or data corruption, an automated restore process allows you to get back up and running with minimal downtime.

  • Compliance
    Many industries, including finance and healthcare, have strict data retention and backup requirements. Automating backups ensures that you meet these compliance standards without the need for manual oversight.

  • Scalability
    As your infrastructure grows, so does the complexity of managing backups. Automated solutions can scale with your environment, ensuring that each server or database is backed up regularly without extra administrative effort.

Backup Strategy: Full vs Incremental

Before diving into the automation scripts, it’s important to understand the two main types of backups: Full **and **Incremental.

  • Full Backup: A complete copy of all data. This method is more time-consuming and requires more storage space, but it provides a comprehensive restore point.

  • Incremental Backup: Only the data that has changed since the last backup is saved. This method is faster and uses less storage space but requires all previous incremental backups to restore fully.

Depending on your needs, you can combine both strategies—running full backups weekly and incremental backups daily, for example—to balance storage and speed.

Automating Backups with Python

Python’s versatility and ease of integration with APIs make it a fantastic choice for automating backups in a wide range of environments, from simple file systems to cloud storage like AWS S3, Azure Blob, or Google Cloud Storage.

1. Full File Backup with Python
Let’s start with a simple example of a full file system backup, using Python to copy all files from a directory to a backup location.

import os
import shutil
import datetime

def backup_files(source_dir, backup_dir):
    # Create a timestamped directory for the backup
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    dest_dir = os.path.join(backup_dir, f"backup_{timestamp}")

    # Copy files to the backup directory
    try:
        shutil.copytree(source_dir, dest_dir)
        print(f"Backup completed successfully. Files copied to {dest_dir}")
    except Exception as e:
        print(f"Backup failed: {e}")

source_directory = "/path/to/source"
backup_directory = "/path/to/backup"

backup_files(source_directory, backup_directory)
Enter fullscreen mode Exit fullscreen mode

2. Incremental Backup Using Python
Incremental backups in Python can be achieved by comparing timestamps of files and only copying those that have been modified since the last backup.

import os
import shutil
import time

def incremental_backup(source_dir, backup_dir, last_backup_time):
    # Create a timestamped backup directory
    timestamp = time.strftime("%Y-%m-%d_%H-%M-%S")
    dest_dir = os.path.join(backup_dir, f"incremental_backup_{timestamp}")

    if not os.path.exists(dest_dir):
        os.makedirs(dest_dir)

    # Walk through the source directory
    for root, dirs, files in os.walk(source_dir):
        for file in files:
            file_path = os.path.join(root, file)
            # Check if the file was modified after the last backup
            if os.path.getmtime(file_path) > last_backup_time:
                # Copy only modified files
                dest_file_path = os.path.join(dest_dir, os.path.relpath(file_path, source_dir))
                dest_file_dir = os.path.dirname(dest_file_path)
                if not os.path.exists(dest_file_dir):
                    os.makedirs(dest_file_dir)
                shutil.copy2(file_path, dest_file_path)
                print(f"Copied: {file_path}")

    print(f"Incremental backup completed to {dest_dir}")

last_backup_timestamp = time.time() - 86400  # 24 hours ago
incremental_backup("/path/to/source", "/path/to/backup", last_backup_timestamp)
Enter fullscreen mode Exit fullscreen mode

Cloud Backup with Python
Python’s boto3 library allows you to back up files directly to AWS S3. Here's an example of uploading files to S3 after performing a backup.

import boto3
import os

def backup_to_s3(source_dir, bucket_name):
    s3_client = boto3.client('s3')

    for root, dirs, files in os.walk(source_dir):
        for file in files:
            file_path = os.path.join(root, file)
            s3_client.upload_file(file_path, bucket_name, file)
            print(f"Uploaded {file} to S3")

backup_to_s3("/path/to/backup", "my-s3-bucket")
Enter fullscreen mode Exit fullscreen mode

Automating Backups with Bash

For Linux users, Bash scripts offer an efficient and lightweight way to automate backup tasks. Bash is perfect for scheduling backups through cron jobs and handling system-level tasks.

1. Full System Backup with Bash
Here’s a simple Bash script that creates a tarball of a specified directory and stores it in a backup folder with a timestamp.

#!/bin/bash

SOURCE_DIR="/path/to/source"
BACKUP_DIR="/path/to/backup"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.tar.gz"

# Create a tarball of the source directory
tar -czf $BACKUP_FILE $SOURCE_DIR

echo "Backup completed. File saved to $BACKUP_FILE"
Enter fullscreen mode Exit fullscreen mode

You can schedule this script to run automatically using a cron job:

0 2 * * * /path/to/backup_script.sh
Enter fullscreen mode Exit fullscreen mode

This cron job runs the backup script every day at 2 AM.

2. Incremental Backup with Bash
Bash’s rsync utility is commonly used for incremental backups, as it only copies changed files and minimizes the time and space required.

Example Bash Incremental Backup Using rsync:

#!/bin/bash

SOURCE_DIR="/path/to/source"
BACKUP_DIR="/path/to/backup"

# Perform incremental backup using rsync
rsync -av --delete $SOURCE_DIR $BACKUP_DIR

echo "Incremental backup completed."
Enter fullscreen mode Exit fullscreen mode

Automating Backups with PowerShell

For Windows administrators, PowerShell provides a robust environment for automating backup tasks. With deep integration into the Windows operating system, PowerShell can handle both file system and system state backups.

1. Full File Backup with PowerShell
PowerShell can be used to automate the process of creating backups and scheduling them with Task Scheduler.

Example PowerShell Script for Full Backup:

$source = "C:\path\to\source"
$backup = "C:\path\to\backup\backup_$(Get-Date -Format 'yyyy-MM-dd_HH-mm-ss').zip"

# Create a compressed ZIP file backup
Compress-Archive -Path $source -DestinationPath $backup

Write-Output "Backup completed. File saved to $backup"
Enter fullscreen mode Exit fullscreen mode

2. Incremental Backup with PowerShell
Incremental backups can be automated using PowerShell’s ability to compare file modification times and selectively copy changed files.

Example PowerShell Incremental Backup Script:

$source = "C:\path\to\source"
$backup = "C:\path\to\backup"
$lastBackup = (Get-Date).AddDays(-1)  # Check files modified in the last 24 hours

# Perform incremental backup
Get-ChildItem $source -Recurse | Where-Object { $_.LastWriteTime -gt $lastBackup } | ForEach-Object {
    $dest = Join-Path $backup $_.FullName.Substring($source.Length)
    if (!(Test-Path (Split-Path $dest))) {
        New-Item -ItemType Directory -Path (Split-Path $dest)
    }
    Copy-Item $_.FullName -Destination $dest
}

Write-Output "Incremental backup completed."
Enter fullscreen mode Exit fullscreen mode

Restoring Backups

Backing up data is only half the story. Being able to restore that data quickly is equally important.

Here are scripts for restoring from the backups created in each language:

Restoring with Python

import shutil

def restore_backup(backup_dir, restore_dir):
    shutil.copytree(backup_dir, restore_dir, dirs_exist_ok=True)
    print(f"Restore completed from {backup_dir} to {restore_dir}")

restore_backup("/path/to/backup", "/path/to/restore")
Enter fullscreen mode Exit fullscreen mode

Restoring with Bash

#!/bin/bash

BACKUP_FILE="/path/to/backup.tar.gz"
RESTORE_DIR="/path/to/restore"

# Extract the backup tarball
tar -xzf $BACKUP_FILE -C $RESTORE_DIR

echo "Restore completed to $RESTORE_DIR"
Enter fullscreen mode Exit fullscreen mode

Restoring with PowerShell

$backup = "C:\path\to\backup.zip"
$restore = "C:\path\to\restore"

# Extract the backup ZIP file
Expand-Archive -Path $backup -DestinationPath $restore

Write-Output "Restore completed to $restore"
Enter fullscreen mode Exit fullscreen mode

Conclusion

Automating backup and restore processes is crucial for ensuring the safety and availability of your data. By leveraging Python, Bash, and PowerShell, you can create flexible, scalable backup solutions that protect your critical files and infrastructure. Whether you're working in a cloud environment, managing a small server, or operating a large enterprise system, automating backups will save you time, reduce risks, and help you recover from failures quickly and efficiently.

Stay tuned for the next Scripting Saturdays post, where we'll cover automating server deployment with scripts!

🔗 Support my Work

▶️ Support by Subscribing my YouTube
▶️ Explore more open-source tutorials on my website
▶️ Follow me on X
Buy me a Coffee

Top comments (0)