نمایش نتایج: از شماره 1 تا 1 , از مجموع 1

موضوع: آموزش بک آپ گیری از دیتابیس های MySql با Bash

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    عضو دائم asrhosting آواتار ها
    تاریخ عضویت
    Sep 2009
    محل سکونت
    ایالات نصر آباد جرقویه
    نوشته ها
    1,129
    تشکر تشکر کرده 
    565
    تشکر تشکر شده 
    2,420
    تشکر شده در
    1,458 پست

    Lightbulb آموزش بک آپ گیری از دیتابیس های MySql با Bash

    درود .
    در صورت نیاز به بک آپ گیری از دیتابیس های 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 دقیقه بامداد بک آپ گیری را انجام دهد .


    در صورت وجود سوال در تاپیک مطرح کنید .
    میزبانی هاست لینوکس و ویندوز | نمایندگی دایرکت ادمین ، سی پنل ، پلسک روی سرورهای ایران
    ارائه سرور مجازی از ایران با پهنای باند نامحدود و لایسنس رایگان دایرکت ادمین ، سی پنل ، پلسک

  2. تعداد تشکر ها از asrhosting به دلیل پست مفید


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. آموزش اتصال ریموت به دیتابیس MySQL در Cpanel
    توسط fanza در انجمن سی پنل CPanel
    پاسخ ها: 0
    آخرين نوشته: March 8th, 2019, 11:08
  2. آموزش ساخت یوزر جدید در دیتابیس MySQL بدون کنترل پنل هاستینگ
    توسط ebrahimsh در انجمن مباحث و منابع آموزشی
    پاسخ ها: 0
    آخرين نوشته: January 21st, 2017, 21:29
  3. آموزش ساختن دیتابیس MySQL دردایرکت ادمین
    توسط TegraHost در انجمن دايرکت ادمين DirectAdmin
    پاسخ ها: 0
    آخرين نوشته: April 10th, 2016, 12:07
  4. اسکریپت بک آپ اتوماتیک از دیتابیس و انتقال به سرور مجزا( Bash )
    توسط iMohsen در انجمن مباحث و منابع آموزشی
    پاسخ ها: 1
    آخرين نوشته: March 10th, 2014, 20:06

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •