درود .
در صورت نیاز به بک آپ گیری از دیتابیس های MySql که کنترل پنلی بر روی آنها نصب نشده از یک اسکریپت Bash در لینوکس استفاده میکنیم :
در این اسکریپت ما طوری نوشته ایم که پس از بک آپ گیری آن را به FTP منتقل کند :
1. ابتدا یک پوشه ایجاد می کنیم به عنوان مثال 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 -p "$BACKUP_DIR" "$TMP_DIR"
exec >>"$LOGFILE" 2>&1
echo "===== Backup started: $(date) ====="
# Check mysqldump
if [[ -z "$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 [[ -z "$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 [[ -n "$GZIP_BIN" ]]; then
"$GZIP_BIN" -9 -c "$BACKUP_FILE" > "$ARCHIVE_FILE"
rm -f "$BACKUP_FILE"
else
tar -czf "${ARCHIVE_FILE}" -C "$(dirname "$BACKUP_FILE")" "$(basename "$BACKUP_FILE")"
rm -f "$BACKUP_FILE"
fi
echo "Archive created: $ARCHIVE_FILE (size: $(du -h "$ARCHIVE_FILE" | cut -f1))"
# Create checksum
if [[ -n "$MD5SUM_BIN" ]]; then
"$MD5SUM_BIN" "$ARCHIVE_FILE" | awk '{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 [[ -z "$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 [[ -f "$MD5_FILE" ]]; then
LFTP_CMD+="put -E \"${MD5_FILE}\"; "
fi
LFTP_CMD+="bye"
if [[ -n "$FTP_PASS" ]]; then
"$LFTP_BIN" -u "${FTP_USER},${FTP_PASS}" "${FTP_HOST}" -e "$LFTP_CMD"
else
"$LFTP_BIN" -u "${FTP_USER}" "${FTP_HOST}" -e "$LFTP_CMD"
fi
}
# Function using curl fallback
upload_with_curl() {
if [[ -z "$CURL_BIN" ]]; then
return 1
fi
# ensure remote dir - curl can create dirs with --ftp-create-dirs
if [[ -n "$FTP_PASS" ]]; then
"$CURL_BIN" --ftp-create-dirs -T "${ARCHIVE_FILE}" "ftp://${FTP_USER}:${FTP_PASS}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$ARCHIVE_FILE")" --silent --show-error --fail
if [[ $? -ne 0 ]]; then return 1; fi
if [[ -f "$MD5_FILE" ]]; then
"$CURL_BIN" --ftp-create-dirs -T "${MD5_FILE}" "ftp://${FTP_USER}:${FTP_PASS}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$MD5_FILE")" --silent --show-error --fail
if [[ $? -ne 0 ]]; then return 1; fi
fi
else
"$CURL_BIN" --ftp-create-dirs -T "${ARCHIVE_FILE}" "ftp://${FTP_USER}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$ARCHIVE_FILE")" --silent --show-error --fail
if [[ $? -ne 0 ]]; then return 1; fi
if [[ -f "$MD5_FILE" ]]; then
"$CURL_BIN" --ftp-create-dirs -T "${MD5_FILE}" "ftp://${FTP_USER}@${FTP_HOST}${FTP_REMOTE_DIR}/$(basename "$MD5_FILE")" --silent --show-error --fail
if [[ $? -ne 0 ]]; then return 1; fi
fi
fi
return 0
}
# Try lftp, then curl
if upload_with_lftp; then
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_success" = true ]]; 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 دقیقه بامداد بک آپ گیری را انجام دهد .
در صورت وجود سوال در تاپیک مطرح کنید .