美文网首页
mysql定时备份

mysql定时备份

作者: 走在成长的道路上 | 来源:发表于2018-10-31 18:47 被阅读0次

最近把公司 devops 总算搞起来了,然后把线上的 mysql 数据库定期备份到 oss 上。

中间遇到不少头痛问题,比如 oss 挂载到 centos 中,docker 备份时脚本直接执行正常,放到 crontab 中执行失败,不能发送邮件等。

工作环境

   系统: centos 7
   硬件: Aliyun ECS

oss 挂载

  1. 安装ossfs

aliyun 仓库 中存在 类似 亚马逊云 oss mount 的工具,然后通过如下方式进行安装即可:

# wget https://github.com/aliyun/ossfs/releases/download/v1.80.5/ossfs_1.80.5_centos7.0_x86_64.rpm
# yum localinstall ossfs_1.80.5_centos7.0_x86_64.rpm --nogpgcheck
  1. 账户配置

创建 /etc/passwd-ossfs 文件并添加如下内容:

--- 在 passwd-ossfs 文件中放入 bucket:AccessKeyID:AccessKeySecret 格式存放即可 ---
# echo bucket:XXXX:XXXXX > /etc/passwd-ossfs

--- 修改 passwd-ossfs 访问权限 ---
# chmod 640 /etc/passwd-ossfs
  1. 手动挂载
--- 非阿里云主机 url 使用外部访问链接 ---
# ossfs bucket /srv/ossfs -ourl=http://oss-cn-hangzhou.aliyuncs.com

--- 阿里云主机中 url 使用 内部链接 节约流量 ---
# ossfs bucket /srv/ossfs -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com
  1. 自动挂载

修改 /etc/fstab 文件,实现自动 mount, 在其中增加如下配置即可

--- 非阿里云主机 url 使用外部访问链接 ---
ossfs#bucket /srv/ossfs fuse _netdev,url=http://oss-cn-hangzhou.aliyuncs.com,allow_other 0 0

--- 阿里云主机中 url 使用 内部链接 节约流量 ---
ossfs#bucket /srv/ossfs fuse _netdev,url=http://oss-cn-hangzhou-internal.aliyuncs.com,allow_other 0 0

然后使用 mount -a 来进行测试即可,如果没有报错即配置正确

ossfs 只能用 root 来进行操作

mail 命令发送邮件

由于 aliyun 主机把 25 端口封掉了,所以简单的配置 /etc/mail.rc 不一定好使,这里需要配 465 端口来进行发送邮件

  1. 工具安装
# yum install -y mailx
  1. 配置帐号
    阿里云封掉 25 端口后,使用 465 端口进行发送邮件,因此在 /etc/mail.rc 文件中进行如下修改:
set from=xxx@xxx.com
set smtp=smtps://smtp.exmail.qq.com:465
set smtp-auth-user=xxx@xxx.com
set smtp-auth-password=xxxxxx
set smtp-auth=login
set ssl-verify=ignore
# 证书存放位置
set nss-config-dir=/etc/pki/nssdb/

导入证书:

# echo -n | openssl s_client -connect smtp.exmail.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/exmail.qq.crt
# certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/exmail.qq.crt
# certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/exmail.qq.crt
# certutil -L -d /etc/pki/nssdb/
  1. 测试
$ echo '日志内容' | mail -s '系统日志'  xxx@qq.com

定时备份db

mysql 执行在 docker 环境中,在宿主机上执行 docker 命令来生成相应的内容

#!/bin/bash

# 容器名称
docker_name=mysql

data_dir="/srv/ossfs/backup/db/"
docker exec -t ${docker_name} mysqldump -uuser -ppasswd --all-databases > "$data_dir/data_`date +%Y%m%d`.sql"
if [ $? -ne 0 ];then
    # 任务失败,发送邮件
    echo -e "Failed to backup the databases..." | mail -s 'Backup failed!!!' admin@xxx.com
    exit -1
fi
# 删除 7 天前的备份
find $data_dir -mtime +7 -name 'data_[1-9].sql' -exec rm -rf {} \;

然后通过 crontab -e 添加如下内容

0 2 * * * sh /srv/crons/mysql-backup.sh > /srv/logs/backup/mysql_dumps.log 2>&1

通过上述方式备份时 docker exec -it ... 中的 i 选项需要去掉,详细参考 # Error “The input device is not a TTY”

k8s 定时任务

  1. 定义备份存储位置:
# kubectl create -f - <<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-backup
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: glusterfs-raid0
EOF
  1. 定义定时任务
# kubectl create -f - <<EOF
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: mysql-backup
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: mysql-backup
            imagePullPolicy: IfNotPresent
            image: mysql
            env:
            - name: MYSQL_BACKUP_USER
              value: root
            - name: MYSQL_BACKUP_USER_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-user-pwd
                  key: mysql-root-pwd
            - name: MYSQL_HOST
              value: mysql
            command:
            - /bin/sh
            - -c
            - |
              set -ex
              mysqldump --host=$MYSQL_HOST --user=$MYSQL_BACKUP_USER \
                        --password=$MYSQL_BACKUP_USER_PASSWORD \
                        --routines --databases appdb --single-transaction \
                        > /mysql-backup/mysql-`date +"%Y%m%d"`.sql
            volumeMounts:
            - name: mysql-backup
              mountPath: /mysql-backup
          restartPolicy: OnFailure
          volumes:
          - name: mysql-backup
            persistentVolumeClaim:
              claimName: mysql-backup
EOF

参考 在K8S集群中一步步构建一个复杂的MySQL数据库

相关文章

  • Linux笔记

    Linux定时任务 Mysql备份 Linux+Mysql定时备份 * * * * * user task分 时 ...

  • 实战-MySQL定时增量备份(2)

    阅读本文大约需要 9 分钟 实战-MySQL定时全量备份(1) 实战-MySQL定时增量备份(2) 实战-将MyS...

  • shell自动备份mysql脚本

    作用 定时执行mysql全量备份,并上传到备用服务器。使用mysqldump备份mysql,scp上传文件到备份服...

  • linux mysql 每天定时备份

    功能:mysql 每天定时备份, 并删除7天以前的备份mysql_dumps.sh: 通过linux cron设置...

  • shell 定期备份mysql

    mysql数据库需要每天定时备份,于是写了个脚本,加到crontab里面,每天定时备份,直接上脚本

  • shell定时备份mysql

    在服务器上用shell定时备份mysql 1. 在crontab中加入定时备份任务 20 1 * * * cd /...

  • MySQL定时备份

    1. 新建目录备份目录 # mkdir -p /apps/mysql_backup 2. 新建mysql_back...

  • mysql定时备份

    最近把公司 devops 总算搞起来了,然后把线上的 mysql 数据库定期备份到 oss 上。 中间遇到不少头痛...

  • mysql定时备份

    定时任务设置 3小时备份一次

  • MySQL 定时备份

    ZERO 持续更新 请关注:https://zorkelvll.cn/blogs/zorkelvll/artic...

网友评论

      本文标题:mysql定时备份

      本文链接:https://www.haomeiwen.com/subject/nfaatqtx.html