درود .
در صورت نیاز به بک آپ گیری از دیتابیس های MySql که کنترل پنلی بر روی آنها نصب نشده از یک اسکریپت Bash در لینوکس استفاده میکنیم :

در این اسکریپت ما طوری نوشته ایم که پس از بک آپ گیری آن را به FTP منتقل کند :
1. ابتدا یک پوشه ایجاد می کنیم به عنوان مثال backup :
mdir /backup
در سرور FTP یک اکانت FTP با فابلیت خواندن و نوشتن ایجاد می کنیم .
2. سپس وارد پورشه شده یک فایل ایجاد می کنیم به نام ftpbackup.bash و در آن کد های ذیل را منتقل می کنیم :
کد PHP:
#!/usr/bin/env bash
# mysql_backup_to_ftp.sh
# Full MySQL backup -> gzip -> upload to FTP (with lftp fallback to curl)
# Usage: ./mysql_backup_to_ftp.sh
set -euo pipefail

##### CONFIG #####
# MySQL (if you prefer, leave MYSQL_PASS empty and use ~/.my.cnf)
MYSQL_USER="backupuser"
MYSQL_PASS="secretpassword"   # recommended: keep blank and use ~/.my.cnf
MYSQL_HOST="localhost"
MYSQL_PORT="3306"

# Backup destination local
BACKUP_DIR="/var/backups/mysql"
TMP_DIR="${BACKUP_DIR}/tmp"
RETENTION_DAYS=14      # keep local backups for this many days

# FTP destination
FTP_HOST="ftp.example.com"
FTP_USER="ftpuser"
FTP_PASS="ftppassword"    # or leave empty and use .netrc or key-based methods
FTP_REMOTE_DIR="/backups/mysql"   # remote dir on ftp server

# Tools/config
MYSQLDUMP_BIN="$(command -v mysqldump || true)"
LFTP_BIN="$(command -v lftp || true)"
CURL_BIN="$(command -v curl || true)"
GZIP_BIN="$(command -v gzip || true)"
MD5SUM_BIN="$(command -v md5sum || true)"

LOGFILE="${BACKUP_DIR}/backup.log"

##### END CONFIG #####

timestamp() { date +"%Y-%m-%d_%H-%M-%S"; }
now="$(timestamp)"
mkdir -"$BACKUP_DIR" "$TMP_DIR"
exec >>"$LOGFILE2>&1

echo "===== Backup started: $(date) ====="

# Check mysqldump
if [[ -"$MYSQLDUMP_BIN]]; then
  
echo "ERROR: mysqldump not found. Install MySQL client tools."
  
exit 1
fi

BACKUP_FILE
="${BACKUP_DIR}/mysql_all_${now}.sql"
ARCHIVE_FILE="${BACKUP_FILE}.gz"
MD5_FILE="${ARCHIVE_FILE}.md5"

# Clean up on exit
cleanup() {
  echo 
"Cleaning tmp..."
  
rm -rf "${TMP_DIR:?}/"*
}
trap cleanup EXIT

# Create dump
echo "Running mysqldump..."
# Prefer using ~/.my.cnf if MYSQL_PASS is empty; otherwise pass credentials (be careful)
if [[ -"$MYSQL_PASS]]; then
  
"$MYSQLDUMP_BIN--host="$MYSQL_HOST--port="$MYSQL_PORT--user="$MYSQL_USER--single-transaction --routines --events --triggers --all-databases "$BACKUP_FILE"
else
  
# safer to avoid passing password on command line? but for script we include it
  
MYSQL_PWD="$MYSQL_PASS" "$MYSQLDUMP_BIN--host="$MYSQL_HOST--port="$MYSQL_PORT--user="$MYSQL_USER--single-transaction --routines --events --triggers --all-databases "$BACKUP_FILE"
fi

echo "Dump complete: $BACKUP_FILE (size: $(du -h "$BACKUP_FILE" | cut -f1))"

# Compress
echo "Compressing..."
if [[ -"$GZIP_BIN]]; then
  
"$GZIP_BIN--"$BACKUP_FILE"$ARCHIVE_FILE"
  
rm -"$BACKUP_FILE"
else
  
tar -czf "${ARCHIVE_FILE}-"$(dirname "$BACKUP_FILE")" "$(basename "$BACKUP_FILE")"
  
rm -"$BACKUP_FILE"
fi
echo "Archive created: $ARCHIVE_FILE (size: $(du -h "$ARCHIVE_FILE" | cut -f1))"

# Create checksum
if [[ -"$MD5SUM_BIN]]; then
  
"$MD5SUM_BIN" "$ARCHIVE_FILEawk '{print $1}' "$MD5_FILE"
  
echo "MD5: $(cat "$MD5_FILE")"
fi

# Upload to FTP
upload_success=false
echo "Uploading to FTP: ${FTP_HOST}${FTP_REMOTE_DIR}"

# Function using lftp (recommended)
upload_with_lftp() {
  if [[ -
"$LFTP_BIN]]; then
    
return 1
  fi
  
# create remote dir and upload file + md5
  # NOTE: lftp supports ftp/ftps/sftp depending on scheme; for FTPS use "set ftp:ssl-force true" lines if needed
  
LFTP_CMD="set net:max-retries 2; set net:timeout 20; mkdir -p ${FTP_REMOTE_DIR}; cd ${FTP_REMOTE_DIR}; put -E \"${ARCHIVE_FILE}\"; "
  
if [[ -"$MD5_FILE]]; then
    LFTP_CMD
+="put -E \"${MD5_FILE}\"; "
  
fi
  LFTP_CMD
+="bye"
  
if [[ -"$FTP_PASS]]; then
    
"$LFTP_BIN-"${FTP_USER},${FTP_PASS}" "${FTP_HOST}-"$LFTP_CMD"
  
else
    
"$LFTP_BIN-"${FTP_USER}" "${FTP_HOST}-"$LFTP_CMD"
  
fi
}

# Function using curl fallback
upload_with_curl() {
  if [[ -
"$CURL_BIN]]; then
    
return 1
  fi
  
# ensure remote dir - curl can create dirs with --ftp-create-dirs
  
if [[ -"$FTP_PASS]]; then
    
"$CURL_BIN--ftp-create-dirs -"${ARCHIVE_FILE}" "ftp://${FTP_USER}:${FTP_PASS}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$ARCHIVE_FILE")" --silent --show-error --fail
    
if [[ $? -ne 0 ]]; then return 1fi
    
if [[ -"$MD5_FILE]]; then
      
"$CURL_BIN--ftp-create-dirs -"${MD5_FILE}" "ftp://${FTP_USER}:${FTP_PASS}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$MD5_FILE")" --silent --show-error --fail
      
if [[ $? -ne 0 ]]; then return 1fi
    fi
  
else
    
"$CURL_BIN--ftp-create-dirs -"${ARCHIVE_FILE}" "ftp://${FTP_USER}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$ARCHIVE_FILE")" --silent --show-error --fail
    
if [[ $? -ne 0 ]]; then return 1fi
    
if [[ -"$MD5_FILE]]; then
      
"$CURL_BIN--ftp-create-dirs -"${MD5_FILE}" "ftp://${FTP_USER}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$MD5_FILE")" --silent --show-error --fail
      
if [[ $? -ne 0 ]]; then return 1fi
    fi
  fi
  
return 0
}

# Try lftp, then curl
if upload_with_lftpthen
  
echo "Upload (lftp) successful."
  
upload_success=true
elif upload_with_curl
then
  
echo "Upload (curl) successful."
  
upload_success=true
else
  echo 
"ERROR: Upload failed (both lftp and curl attempts failed)."
  
upload_success=false
fi

# Retention: delete local backups older than RETENTION_DAYS
echo "Removing local backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_DIR-maxdepth 1 -type f -mtime +"$RETENTION_DAYS-name "mysql_all_*.sql.gz" -print -delete || true
find 
"$BACKUP_DIR-maxdepth 1 -type f -mtime +"$RETENTION_DAYS-name "mysql_all_*.sql.gz.md5" -print -delete || true

if [[ "$upload_successtrue ]]; then
  
echo "Backup completed and uploaded: $(basename "$ARCHIVE_FILE")"
  
exit 0
else
  echo 
"Backup created locally but upload failed. Check $LOGFILE for details."
  
exit 2
fi 

در فایل بالا چند قسمت نیاز به تغییر دارد :
3. اطلاعات دیتابیس را ویرایش می کنیم
MYSQL_USER="backupuser"
MYSQL_PASS="secretpassword"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
4. اطلاعات FTP را جایگزین می کنیم :
FTP_HOST="ftp.example.com"
FTP_USER="ftpuser"
FTP_PASS="ftppassword"
FTP_REMOTE_DIR="/backup/mysql"
5. فایل را با دستور chmod اجرایی می کنیم :

chmod 700 /backup/ftpbackup.bash
6. اکنون وارد کران شده و بر حسب نیاز تنظیم می کنیم چند مرتبه در روز بک آپ گیری کند :

10 1 * * * /backup/ftpbackup.sh
در اینجا با وارد کردن crontab -e وارد شده وگفته ایم هر شب ساعت 1 و 10 دقیقه بامداد بک آپ گیری را انجام دهد .


در صورت وجود سوال در تاپیک مطرح کنید .