2

In this post Ben Lessani - Sonassi said to not use the built in backup tool. Is it still true for Magento 2?

2 Answers 2

-1

it is true for any application built in backup. because you have to backup application with external independent tools. the time your application will fail you will lose everything...

simple to use bash script: https://gist.github.com/magenx/07503580876a372b2b54

if you like you can search for any commercial tools.

-2

Yeah, I also agree with Ben Lessani - Sonassi and wrote my own bash script to backup code + db. File: mage2-db-code-backup.sh

#!/bin/bash

#
# Script to backup Magento2 Codebase + Database
#
# @author   Raj KB <[email protected]>
# @website  http://www.magepsycho.com
# @version  0.1.0

# UnComment it if bash is lower than 4.x version
shopt -s extglob

################################################################################
# CORE FUNCTIONS - Do not edit
################################################################################
#
# VARIABLES
#
_bold=$(tput bold)
_underline=$(tput sgr 0 1)
_reset=$(tput sgr0)

_purple=$(tput setaf 171)
_red=$(tput setaf 1)
_green=$(tput setaf 76)
_tan=$(tput setaf 3)
_blue=$(tput setaf 38)

#
# HEADERS & LOGGING
#
function _debug()
{
    if [[ "$DEBUG" = 1 ]]; then
        "$@"
    fi
}

function _header()
{
    printf '\n%s%s==========  %s  ==========%s\n' "$_bold" "$_purple" "$@" "$_reset"
}

function _arrow()
{
    printf '➜ %s\n' "$@"
}

function _success()
{
    printf '%s✔ %s%s\n' "$_green" "$@" "$_reset"
}

function _error() {
    printf '%s✖ %s%s\n' "$_red" "$@" "$_reset"
}

function _warning()
{
    printf '%s➜ %s%s\n' "$_tan" "$@" "$_reset"
}

function _underline()
{
    printf '%s%s%s%s\n' "$_underline" "$_bold" "$@" "$_reset"
}

function _bold()
{
    printf '%s%s%s\n' "$_bold" "$@" "$_reset"
}

function _note()
{
    printf '%s%s%sNote:%s %s%s%s\n' "$_underline" "$_bold" "$_blue" "$_reset" "$_blue" "$@" "$_reset"
}

function _die()
{
    _error "$@"
    exit 1
}

function _safeExit()
{
    exit 0
}

#
# UTILITY HELPER
#
function _seekConfirmation()
{
  printf '\n%s%s%s' "$_bold" "$@" "$_reset"
  read -p " (y/n) " -n 1
  printf '\n'
}

# Test whether the result of an 'ask' is a confirmation
function _isConfirmed()
{
    if [[ "$REPLY" =~ ^[Yy]$ ]]; then
        return 0
    fi
    return 1
}


function _typeExists()
{
    if type "$1" >/dev/null; then
        return 0
    fi
    return 1
}

function _isOs()
{
    if [[ "${OSTYPE}" == $1* ]]; then
      return 0
    fi
    return 1
}

function _checkRootUser()
{
    #if [ "$(id -u)" != "0" ]; then
    if [ "$(whoami)" != 'root' ]; then
        echo "You have no permission to run $0 as non-root user. Use sudo"
        exit 1;
    fi

}

function _printPoweredBy()
{
    local mp_ascii
    mp_ascii='
   __  ___              ___               __
  /  |/  /__ ____ ____ / _ \___ __ ______/ /  ___
 / /|_/ / _ `/ _ `/ -_) ___(_-</ // / __/ _ \/ _ \
/_/  /_/\_,_/\_, /\__/_/  /___/\_, /\__/_//_/\___/
            /___/             /___/
'
    cat <<EOF
${_green}
Powered By:
$mp_ascii

 >> Store: ${_reset}${_underline}${_blue}http://www.magepsycho.com${_reset}${_reset}${_green}
 >> Blog:  ${_reset}${_underline}${_blue}http://www.blog.magepsycho.com${_reset}${_reset}${_green}

################################################################
${_reset}
EOF
}

################################################################################
# SCRIPT FUNCTIONS
################################################################################
function _printUsage()
{
    echo -n "$(basename "$0") [OPTION]...

Backup Magento2 Codebase + Database.
Version $VERSION

    Options:
        -sd,    --src-dir          Source directory (from where backup file will be created)
        -dd,    --dest-dir         Destination directory (to where the backup file will be moved)
        -bt,    --type             Backup Type. Default: all
                                   Options:
                                   1. db (for database only)
                                   2. code (for codebase only)
                                   3. all (for database + codebase)
        -sm,    --skip-media       Skip media folder from code backup.
                                   Default: 1
        -h,     --help             Display this help and exit
        -v,     --version          Output version information and exit

    Examples:
        $(basename "$0") --type=all --skip-media=1 --src-dir=... --dest-dir=...

"
    _printPoweredBy
    exit 1
}

function processArgs()
{
    # Parse Arguments
    for arg in "$@"
    do
        case $arg in
            -bt=*|--type=*)
                M2_BACKUP_TYPE="${arg#*=}"
            ;;
            -sd=*|--src-dir=*)
                M2_SRC_DIR="${arg#*=}"
            ;;
            -dd=*|--dest-dir=*)
                M2_DEST_DIR="${arg#*=}"
            ;;
            -sm=*|--skip-media=*)
                M2_SKIP_MEDIA="${arg#*=}"
            ;;
            -bn=*|--backup-name=*)
                M2_BACKUP_NAME="${arg#*=}"
            ;;
            --debug)
                DEBUG=1
            ;;
            -h|--help)
                _printUsage
            ;;
            *)
                _printUsage
            ;;
        esac
    done

    validateArgs
    sanitizeArgs
}

function validateArgs()
{
    ERROR_COUNT=0
    if [[ -z "$M2_BACKUP_TYPE" ]]; then
        _error "Backup type parameter missing."
        ERROR_COUNT=$((ERROR_COUNT + 1))
    fi

    if [[ ! -z "$M2_BACKUP_TYPE" && "$M2_BACKUP_TYPE" != @(db|code|all) ]]; then
        _error "Backup type must be one of db|code|all."
        ERROR_COUNT=$((ERROR_COUNT + 1))
    fi

    if [[ -z "$M2_SRC_DIR" ]]; then
        _error "Source directory parameter missing."
        ERROR_COUNT=$((ERROR_COUNT + 1))
    fi

    if [[ ! -z "$M2_SRC_DIR" && ! -f "$M2_SRC_DIR/app/etc/env.php" ]]; then
        _error "Source directory must be Magento 2 root folder."
        ERROR_COUNT=$((ERROR_COUNT + 1))
    fi

    if [[ -z "$M2_DEST_DIR" ]]; then
        _error "Destination directory parameter missing."
        ERROR_COUNT=$((ERROR_COUNT + 1))
    fi

    if [[ ! -z "$M2_DEST_DIR" ]] && ! mkdir -p "$M2_DEST_DIR"; then
        _error "Unable to create destination directory."
        ERROR_COUNT=$((ERROR_COUNT + 1))
    fi

    echo "$ERROR_COUNT"
    [[ "$ERROR_COUNT" -gt 0 ]] && exit 1
}

function sanitizeArgs()
{
    # remove trailing /
    if [[ ! -z "$M2_SRC_DIR" ]]; then
        M2_SRC_DIR="${M2_SRC_DIR%/}"
    fi

    if [[ ! -z "$M2_DEST_DIR" ]]; then
        M2_DEST_DIR="${M2_DEST_DIR%/}"
    fi
}

function prepareBackupName()
{
    if [[ -z "$M2_BACKUP_NAME" ]]; then
        #MD5=`echo \`date\` $RANDOM | md5sum | cut -d ' ' -f 1`
        DATETIME=$(date + "%Y-%m-%d-%H%-M%-%S")
        M2_BACKUP_NAME="mage2-backup.$DATETIME"
    fi
}

function prepareCodebaseFilename()
{
    M2_CODE_BACKUP_FILE="${M2_DEST_DIR}/${M2_BACKUP_NAME}.tar.gz"
}

function prepareDatabaseFilename()
{
    M2_DB_BACKUP_FILE="${M2_DEST_DIR}/${M2_BACKUP_NAME}.sql.gz"
}

function createDbBackup()
{
    _success "Dumping MySQL..."
    local host username password dbName
    host=$(grep host "${M2_SRC_DIR}/app/etc/env.php" | cut -d "'" -f 4)
    username=$(grep username "${M2_SRC_DIR}/app/etc/env.php" | cut -d "'" -f 4)
    password=$(grep password "${M2_SRC_DIR}/app/etc/env.php" | cut -d "'" -f 4)
    dbName=$(grep dbname "${M2_SRC_DIR}/app/etc/env.php" |cut -d "'" -f 4)

    # @todo option to skip log tables
    mysqldump -h "$host" -u "$username" -p"$password" "$dbName" | gzip > "$M2_DB_BACKUP_FILE"
    _success "Done!"
}

function createCodeBackup()
{
    _success "Archiving Codebase..."
    if [[ "$M2_SKIP_MEDIA" == 1 ]]; then
        tar -zcf "$M2_CODE_BACKUP_FILE" --exclude="./var" --exclude="./pub/media" --exclude="./pub/static" -C "${M2_SRC_DIR}" .
    else
        tar -zcf "$M2_CODE_BACKUP_FILE" --exclude="./var" --exclude="./pub/static" -C "${M2_SRC_DIR}" .
    fi
    _success "Done!"
}

function printSuccessMessage()
{
    _success "Magento2 Backup Completed!"

    echo "################################################################"
    echo ""
    echo " >> Backup Type           : ${M2_BACKUP_TYPE}"
    echo " >> Backup Source         : ${M2_SRC_DIR}"
    if [[ $M2_BACKUP_TYPE = @(db|database|all) ]]; then
        echo " >> Database Dump File    : ${M2_DB_BACKUP_FILE}"
    fi

    if [[ $M2_BACKUP_TYPE = @(codebase|code|all) ]]; then
        echo " >> Codebase Archive File : ${M2_CODE_BACKUP_FILE}"
    fi

    echo ""
    echo "################################################################"
    _printPoweredBy

}

################################################################################
# Main
################################################################################
export LC_CTYPE=C
export LANG=C

DEBUG=0
_debug set -x
VERSION="0.1.0"

M2_SRC_DIR=
M2_DEST_DIR=
M2_BACKUP_TYPE=all
M2_SKIP_MEDIA=1
M2_BACKUP_NAME=
M2_DB_BACKUP_FILE=
M2_CODE_BACKUP_FILE=

function main()
{
    [[ $# -lt 1 ]] && _printUsage

    processArgs "$@"

    prepareBackupName
    prepareCodebaseFilename
    prepareDatabaseFilename

    if [[ "$M2_BACKUP_TYPE" = @(database|db|all) ]]; then
        createDbBackup
    fi

    if [[ "$M2_BACKUP_TYPE" = @(codebase|code|all) ]]; then
        createCodeBackup
    fi

    printSuccessMessage

    exit 0
}

main "$@"

_debug set +x

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.