I've been working on a little POC to move the backup process to our data/database server and run it on this server (without Apache) webserver. Ken suggested this option and I spent some time on investigating this subject. Finally I've got it working now in our Redhat environment.
What I did was install php and an instance of Moodle (same version as on our website), wrote a little bash script that I run in the Linux cron. I took the course that didn't backup via the Moodle cron anymore and managed to make a backup that took 3 hours now instead of the 7 hours before. We use an NFS share for the Moodledata on the DB server.
Problem I encountered was the Caching store of Memcache that prevented the backup.php script to run. I managed to solve this in my backup bash script (temporary disabled/enabled the Memcache caching store in muc/config.php)
Our environment: Redhat 7, Moodle 3.1.5+, Apache 2.4, PHP 5.6, Mariadb 10.1.29
My bash script I wrote and that I scheduled in the Linux cron for Apache user:
#!/bin/bash
# ------------------------------------------------------------------------------
# Script: backup_moodle_courses.sh
#
# - Backup a list of courses with admin/cli/backup.php
#
# Writer: Alain Raap
# Date: 24-01-2019
# ------------------------------------------------------------------------------
exec > >(tee -i /var/log/backup_moodle_courses.log)
exec 2>&1
# ------------------------------------------------------------------------------
# Set parameters
# ------------------------------------------------------------------------------
SCRIPT="backup_moodle_courses"
MOODLE_ROOT="/var/www/moodle"
MOODLE_DATA="/moodledata"
COURSES="${MOODLE_ROOT}/admin/cli/courses.txt"
COMMAND="${MOODLE_ROOT}/admin/cli/backup.php"
PHP="/usr/bin/php -d log_errors=1 -d error_reporting=E_ALL -d display_errors=0 -d html_errors=0 -d memory_limit=2048M"
MUC="${MOODLE_DATA}/muc/config.php"
BACKUP_PATH="${MOODLE_DATA}/backups/"
echo "${SCRIPT}: Start backup script"
# ------------------------------------------------------------------------------
# Change MUC (Remove Moodle-memcache store)
# ------------------------------------------------------------------------------
echo "${SCRIPT}: Remove Moodle-memcache store from muc/config.php"
sed -i -e "s/'store' => 'Moodle-memcache'/'store' => 'default_application'/" $MUC
# ------------------------------------------------------------------------------
# Read input file with course-id's to backup
# ------------------------------------------------------------------------------
while read COURSE_LINE ; do
ID="$(echo ${COURSE_LINE} | cut -d',' -f1)";
NAME="$(echo ${COURSE_LINE} | cut -d',' -f2)";
echo "${SCRIPT}: Backup of course: " $ID " - " $NAME;
echo "$PHP $COMMAND --courseid=${ID} --destination=${BACKUP_PATH}"
$PHP $COMMAND --courseid=${ID} --destination=${BACKUP_PATH}
done < ${COURSES}
# ------------------------------------------------------------------------------
# Change MUC (Restore Moodle-memcache store)
# ------------------------------------------------------------------------------
echo "${SCRIPT}: Restore Moodle-memcache store in muc/config.php"
sed -i -e "s/'store' => 'default_application'/'store' => 'Moodle-memcache'/" $MUC
echo "${SCRIPT}: End backup script"
exit 0
The inputfile for the bash script courses.txt (id and fullname of courses)
1001,course 1
1002,course 2
1003,course 3