1. 程式人生 > 其它 >從零開始在centos搭建部落格(二)

從零開始在centos搭建部落格(二)

本篇為備份篇。

因為裝的東西不多,所以需要備份的只有mysql和wordpress的資料夾。

備份mysql

  1. mysql備份命令

    使用mysqldump命令,格式如下:

    # 這是格式
    mysqldump -u${username} -p${dbrootpwd} --databases ${DBname} > ${DumpFile}
    # 這是例子
    mysqldump -uroot -proot --databases wordpress > /home/backup.sql
    

    使用${}代表的是變數,請自行替換

    username:資料庫使用者名稱

    dbrootpwd:資料庫使用者的密碼

    DBname:需要備份的資料庫

    DumpFile:輸出的檔案路徑+檔名

  2. 搭配docker使用

    因為mysql使用的是docker安裝的,伺服器所在的Centos中是沒有mysql的相關命令的,執行命令需要到mysql的docker容器中。

    # 這是格式
    docker exec -it ${container} ${sqlCmd}
    # 這是例子
    docker exec -it 123321 mysqldump -uroot -proot --databases wordpress > /home/backup.sql
    

    使用${}代表的是變數,請自行替換

    container:docker容器的別名或id

    sqlCmd:需要執行的備份命令

  3. 備份指令碼

    此指令碼是基於oneinstack修改的

    邏輯是:

    • mysqldump生成xxx.sql檔案
    • 壓縮xxx.sql為xxx.tgz
    • 刪除xxx.sql和舊的壓縮檔案

    新建db_bk.sh檔案,以下是內容:

    #!/bin/bash
    # 引用同目錄下的options.conf檔案
    . ./options.conf
    
    # 傳遞引數
    DBname=$1
    # 日誌
    LogFile=${backup_dir}/db.log
    # 臨時檔案
    DumpFile=${backup_dir}/DB_${DBname}_$(date +%Y%m%d_%H).sql
    # 新的壓縮檔案
    NewFile=${backup_dir}/DB_${DBname}_$(date +%Y%m%d_%H).tgz
    # 舊的壓縮檔案
    OldFile=${backup_dir}/DB_${DBname}_$(date +%Y%m%d --date="${expired_days} days ago")*.tgz
    # 備份目錄不存在則建立
    [ ! -e "${backup_dir}" ] && mkdir -p ${backup_dir}
    
    # 使用mysql的show databases判斷資料庫是否存在
    DB_tmp=`docker exec -it mysql mysql -uroot -p${dbrootpwd} -e "show databases\G" | grep ${DBname}`
    [ -z "${DB_tmp}" ] && { echo "[${DBname}] not exist" >> ${LogFile} ;  exit 1 ; }
    
    # 刪除舊的壓縮檔案
    if [ -n "`ls ${OldFile} 2>/dev/null`" ]; then
      rm -f ${OldFile}
      echo "[${OldFile}] Delete Old File Success" >> ${LogFile}
    else
      echo "[${OldFile}] Delete Old Backup File" >> ${LogFile}
    fi
    
    # 判斷新的壓縮檔案是否已存在
    if [ -e "${NewFile}" ]; then
      echo "[${NewFile}] The Backup File is exists, Can't Backup" >> ${LogFile}
    else
    	# 生成臨時備份檔案
      docker exec -it mysql mysqldump -uroot -p${dbrootpwd} --databases ${DBname} > ${DumpFile}
      # 進入到備份目錄
    	pushd ${backup_dir} > /dev/null
    	# 壓縮臨時檔案
      tar czf ${NewFile} ${DumpFile##*/} >> ${LogFile} 2>&1
    	# 輸出日誌
      echo "[${NewFile}] Backup success ">> ${LogFile}
    	# 刪除臨時檔案
      rm -f ${DumpFile}
    	# 退回之前的目錄
      popd > /dev/null
    fi
    

    以下是options.conf檔案的部分內容

    # mysql相關
    backup_dir=/home/backup
    dbrootpwd='root'
    expired_days=5
    
  4. 執行指令碼

    # 這是格式
    ./db_bk.sh #{DBname}
    # 這是例子,資料庫名為wordpress
    ./db_bk.sh wordpress
    

備份wordpress

  1. 編寫指令碼

    備份wordpress其實只需要備份wordpress所在的html目錄即可。

    所以指令碼也很簡單,就是壓縮相關目錄,刪除舊的壓縮檔案。

    新建website_bk.sh檔案,以下是內容:

    #!/bin/bash
    
    . ./options.conf
    
    # 變數定義
    WebSite=$1
    LogFile=${backup_dir}/web.log
    NewFile=${backup_dir}/Web_${WebSite}_$(date +%Y%m%d_%H).tgz
    OldFile=${backup_dir}/Web_${WebSite}_$(date +%Y%m%d --date="${expired_days} days ago")*.tgz
    # 備份資料夾不存在則建立
    [ ! -e "${backup_dir}" ] && mkdir -p ${backup_dir}
    # 需要備份的目錄不存在則退出
    [ ! -e "${wwwroot_dir}/${WebSite}" ] && { echo "[${wwwroot_dir}/${WebSite}] not exist" >> ${LogFile} ;  exit 1 ; }
    
    # 判斷大小,如果小於1024m
    if [ `du -sm "${wwwroot_dir}/${WebSite}" | awk '{print $1}'` -lt 1024 ]; then
      if [ -n "`ls ${OldFile} 2>/dev/null`" ]; then
        rm -f ${OldFile}
        echo "[${OldFile}] Delete Old File Success" >> ${LogFile}
      else
        echo "[${OldFile}] Delete Old Backup File" >> ${LogFile}
      fi
    
    	# 如果檔案已存在,則不重複備份
      if [ -e "${NewFile}" ]; then
        echo "[${NewFile}] The Backup File is exists, Can't Backup" >> ${LogFile}
      else
        pushd ${wwwroot_dir} > /dev/null
        tar czf ${NewFile} ./${WebSite} >> ${LogFile} 2>&1
        echo "[${NewFile}] Backup success ">> ${LogFile}
        popd > /dev/null
      fi
    else
      rsync -crazP --delete ${wwwroot_dir}/${WebSite} ${backup_dir}
    fi
    

    以下是options.conf檔案的部分內容

    backup_dir=/home/backup
    wwwroot_dir=/home/docker-workspace/wordpress
    website_name=html
    expired_days=5
    
  2. 執行指令碼

    ./website_bk.sh html
    

備份OSS

使用的是ossutil

以下是相關命令:

# 上傳檔案
./ossutil64 cp -f file_url cloud_url
# 刪除命令
./ossutil64 rm oss://bucketname[/prefix]

定時執行

備份的指令碼需要定時執行,這裡用的是crontab。

  1. 安裝

    一般centos都有安裝crontab,檢查是否安裝:

    rpm -qa | grep crontab
    

    安裝命令:

    yum -y install vixie-cronyum -y install crontabs
    
  2. 使用

    crontab -e進入編輯頁或者vi /etc/crontab

    區別在於:前者配置是針對當前使用者的,後者是針對系統的

    新增執行指令碼的定時任務:

    # 這是格式
    ${cron} ${cmd}
    # 這是例子
    0 0 * * 1 /home/xxx.sh > /dev/null 2>&1 
    

    使用${}代表的是變數,請自行替換

    cron:cron表示式,注意,crontab所使用的cron表示式,與java使用的cron有所區別,是不包含秒的,看 /etc/crontab的註釋就知道了

    cmd:需要執行的命令