Add advanced Plex database recovery and restoration scripts

- Introduced `recover-plex-database.sh` for comprehensive database recovery with multiple strategies, logging, and rollback capabilities.
- Added `restore-plex.sh` for safe restoration of Plex backups, including validation and dry-run options.
- Created `plex-db-manager.sh` to consolidate database management functionalities, including integrity checks and service management.
- Enhanced logging and error handling across all scripts for better user feedback and troubleshooting.
- Implemented safety measures to prevent running scripts as root and ensure proper service management during operations.
This commit is contained in:
Peter Wood
2025-06-21 07:23:33 -04:00
parent 30a252a500
commit 9b83924597
13 changed files with 1410 additions and 300 deletions

View File

@@ -0,0 +1,182 @@
#!/bin/bash
################################################################################
# Plex Built-in Backup Status Checker
################################################################################
#
# Author: Peter Wood <peter@peterwood.dev>
# Description: Simple utility to check the status of Plex's built-in scheduled
# backups that replaced the custom backup system.
#
# Usage:
# ./check-plex-builtin-backups.sh # Show backup status
# ./check-plex-builtin-backups.sh --help # Show help
#
################################################################################
# Color codes
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Plex database path
PLEX_DB_PATH="/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases"
NAS_BACKUP_PATH="/mnt/share/media/backups/plex"
show_help() {
echo "Plex Built-in Backup Status Checker"
echo ""
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --help, -h Show this help message"
echo " --detailed Show detailed file information"
echo ""
echo "This script checks the status of Plex's built-in scheduled backups"
echo "which replaced the custom backup system on June 21, 2025."
echo ""
echo "Plex automatically creates backups every 3 days with pattern:"
echo " *.backup.YYYYMMDD_HHMMSS"
echo ""
exit 0
}
check_backup_status() {
local detailed="${1:-false}"
echo -e "${BLUE}===============================================${NC}"
echo -e "${BLUE} Plex Built-in Backup Status Check${NC}"
echo -e "${BLUE}===============================================${NC}"
echo ""
# Check if Plex database directory exists
if [ ! -d "$PLEX_DB_PATH" ]; then
echo -e "${RED}❌ Error: Plex database directory not found${NC}"
echo -e " Expected: $PLEX_DB_PATH"
return 1
fi
echo -e "${GREEN}✅ Plex database directory found${NC}"
echo -e " Location: $PLEX_DB_PATH"
echo ""
# Check for built-in backup files
local backup_files
backup_files=$(find "$PLEX_DB_PATH" -name "*.backup.*" 2>/dev/null)
if [ -z "$backup_files" ]; then
echo -e "${YELLOW}⚠️ No built-in backup files found${NC}"
echo -e " This might indicate Plex backups haven't run yet"
echo -e " or the backup schedule is not configured."
echo ""
else
local backup_count
backup_count=$(echo "$backup_files" | wc -l)
echo -e "${GREEN}✅ Found $backup_count built-in backup file(s)${NC}"
echo ""
# Show latest backup
local latest_backup
latest_backup=$(echo "$backup_files" | xargs -I {} ls -t {} | head -1)
if [ -n "$latest_backup" ]; then
local backup_date
backup_date=$(stat -c %y "$latest_backup" 2>/dev/null | cut -d' ' -f1,2 | cut -d'.' -f1)
local backup_size
backup_size=$(du -h "$latest_backup" 2>/dev/null | cut -f1)
echo -e "${GREEN}📅 Latest backup:${NC}"
echo -e " File: $(basename "$latest_backup")"
echo -e " Date: $backup_date"
echo -e " Size: $backup_size"
echo ""
fi
# Show detailed info if requested
if [ "$detailed" = true ]; then
echo -e "${BLUE}📋 All backup files:${NC}"
echo "$backup_files" | while IFS= read -r file; do
if [ -f "$file" ]; then
ls -lah "$file" 2>/dev/null | while IFS= read -r line; do
echo " $line"
done
fi
done
echo ""
fi
# Check backup frequency (should be every 3 days)
if [ "$backup_count" -ge 2 ]; then
local newest_backup
local second_newest_backup
newest_backup=$(echo "$backup_files" | xargs -I {} ls -t {} | head -1)
second_newest_backup=$(echo "$backup_files" | xargs -I {} ls -t {} | head -2 | tail -1)
if [ -n "$newest_backup" ] && [ -n "$second_newest_backup" ]; then
local newest_time
local second_time
newest_time=$(stat -c %Y "$newest_backup" 2>/dev/null)
second_time=$(stat -c %Y "$second_newest_backup" 2>/dev/null)
if [ -n "$newest_time" ] && [ -n "$second_time" ]; then
local time_diff=$((newest_time - second_time))
local days_diff=$((time_diff / 86400))
echo -e "${BLUE}⏱️ Backup frequency check:${NC}"
echo -e " Days between last two backups: $days_diff"
if [ "$days_diff" -ge 2 ] && [ "$days_diff" -le 4 ]; then
echo -e " ${GREEN}✅ Frequency looks normal (every ~3 days)${NC}"
else
echo -e " ${YELLOW}⚠️ Frequency might be unusual${NC}"
fi
echo ""
fi
fi
fi
fi
# Check NAS backup location
echo -e "${BLUE}📁 NAS Backup Location Check:${NC}"
if [ -d "$NAS_BACKUP_PATH" ]; then
echo -e "${GREEN}✅ NAS backup directory accessible${NC}"
echo -e " Location: $NAS_BACKUP_PATH"
local old_custom_backups
old_custom_backups=$(find "$NAS_BACKUP_PATH" -name "plex-backup-*.tar.gz" 2>/dev/null | wc -l)
if [ "$old_custom_backups" -gt 0 ]; then
echo -e " ${YELLOW}📦 Found $old_custom_backups legacy custom backup files${NC}"
echo -e " ${YELLOW} (These are from the old custom backup system)${NC}"
fi
else
echo -e "${RED}❌ NAS backup directory not accessible${NC}"
echo -e " Expected: $NAS_BACKUP_PATH"
fi
echo ""
# Summary
echo -e "${BLUE}📊 Summary:${NC}"
echo -e "${GREEN}✅ Custom backup system: DISABLED (June 21, 2025)${NC}"
echo -e "${GREEN}✅ Plex built-in backups: ACTIVE${NC}"
echo -e "${BLUE} Backup frequency: Every 3 days (automatic)${NC}"
echo -e "${BLUE} Manual tools available: plex-db-manager.sh, plex.sh${NC}"
echo ""
}
# Parse command line arguments
case "${1:-}" in
--help|-h)
show_help
;;
--detailed)
check_backup_status true
;;
"")
check_backup_status false
;;
*)
echo "Unknown option: $1"
echo "Use --help for usage information"
exit 1
;;
esac