从零开始在centos搭建博客(二)

2022年4月25日 143点热度 0人点赞 0条评论

本篇为备份篇。

因为装的东西不多,所以需要备份的只有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 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 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:需要执行的命令

王谷雨

一个苟且偷生的java程序员

文章评论