Mysql数据库热备份

1. 前言

最近要对Mysql数据库进行备份,然后发现我服务器上的数据库被黑了,一直没有发现.还要给我要0.03个比特币哈哈哈哈~
Mysql数据库热备份_第1张图片
在这里插入图片描述
当然我数据库没啥重要的东西,并且有快照,所以大家还是要注意开放的端口,别丢失了数据.

2. 备份

Mysql备份与恢复

使用mysqldump命令(逻辑备份)

mysqldump -h host -P port -uusername -ppassword --all-databases > /data/db.sql
备份所有的数据库到/data/db.sql

注意:
端口号前面的p是大写.
/data/db.sql这个文件要存在
查看/data/db.sql是否成功生成

优点:
恢复简单,可以使用管道将他们输入到mysql
与存储引擎无关,不需要考虑存储引擎

缺点:
必须使用数据库服务器完成,需要更多的cpu周期
逻辑备份还原慢,需要mysql去执行以及加载语句,转化存储格式,重建引擎

使用xtrabackup备份(物理备份)

优点:
基于文件的物理备份
容易跨平台,跨操作系统以及版本
恢复起来会更快(不需要执行任何的mysql语句,不需要构建索引等等)
缺点:
文件大
部分情况下不可以跨平台,跨操作系统或者mysql版本
备份原理:
拷贝数据文件丶拷贝数据页
对innodb表可以实现热备
对myisam表可以实现锁表自动拷贝文件

使用xtrabackup进行数据库备份与恢复

准备安装目录
mkdir /data/tmp 
cd /data/tmp 
下载安装xtrabackup
shell > wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
shell > yum -y install epel-release
shell > yum -y install rsync libev-devel numactl-devel perl-DBD-MySQL
shell > rpm -ivh percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

注意: 这部分可以搜索mysql对应版本进行安装
innobackupex –help 测试是是否已经安装成功

设置相关的参数

备份用的账户 root
密码 test
端口 6379
Mysql的sock文件 /var/lib/mysql/mysql.sock
Innobackupex的绝对路径 /usr/bin/innobackupex
Mysql的配置文件 /etc/my.cnf

定时任务执行脚本

可以使用crontab来写脚本
也可以使用systemd将脚本作为服务来定时执行
这里参考博客写了一个简单的systemd定时执行任务
http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html

mysqlBackup.service
[

Unit]
Description=MysqlBackup
[service]
ExeStart=/bin/bash /home/scripts/mysqlBackup.sh  # 脚本位置

执行systemctl start mysqlBackup.service
可以看到备份文件就已经执行了一次
然后写一个定时器定时执行

mysqlBackup.timer

[Unit]
Description=Run mysqlBackup every 24 hours
[Timer]
OnUnitActiveSec=24h
Unit=mysqlBackup.service
[Install]
WantedBy=multi-user.target

Timer中的定时可以修改为每天凌晨1点执行
OnUnitActiveSec=--* 01:00:00

启动创建的定时器
systemctl start mysqlBackup.timer
查看定时器的状态
systemctl status mysqlBackup.timer
关闭定时器
systemctl stop mysqlBackup.timer
定时器开机自启动
systemctl enable mysqBackup.timer
关闭定时器的开机自启动
systemctl disable mysqlBackup.timer
查看日志
journalctl -u mysqlBackup
根据脚本中的备份位置,查看是否已经进行了备份

备份恢复
  1. 找到要恢复的文件
    全量备份的目录以及增量备份的目录
  2. 查看日志备份的日志是否有报错
    cat agent_mysql_xtrabackup.log
  3. 合并数据
    a.全备目录重放已经提交的事务
innobackupex --defaults-file=/etc/my.cnf   --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --apply-log  --redo-only /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/    #这里写全备文件的目录

b.增量备份与全量备份合并

innobackupex --defaults-file=/etc/my.cnf   --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --apply-log  --redo-only /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/ --incremental-dir=/data/db_xtrabackup/2020-01-03/incre/2020-01-03_17-14-39/  #前面的目录是全备份目录,后面的是增量备份的目录

c. 在全备目录(已经合并的)开始回滚没有提交的事务

innobackupex --defaults-file=/etc/my.cnf   --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --apply-log /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/ # 全备份目录
  1. 进行数据恢复
    a. 关闭数据库
    service mysqld stop
    b. 移出原来的数据库目录(找到Mysql的数据库目录)
    使用下面的命令查询MySQL的数据目录
    mv /var/lib/mysql /data/mysql_bak/
    c. 重新创建mysql的数据目录
    mkdir -p /var/lib/mysql
    d. 将备份的数据恢复到mysql
innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql/ --copy-back /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/  # 已经合并的全备份目录

e. 授权
chown -R mysql.mysql /var/lib/mysql/ # 数据目录
f. 启动mysql
service mysqld start
g. 连接mysql测试数据是否已经恢复成功

脚本文件参考

#!/bin/bash
# XtraBackup Use
# MySQL Server Backup
#每次增量备份都是基于全备目录,数据恢复:全备数据+最后一次增备数据合并
USER=root                                                    #备份使用的用户
PASSWORD=root                                                 # 密码
PORT=6379                                                     # 端口
INSTALL_DIR=/data/tmp                                        #Xtrabackup安装路径
SOCKET_FILE=/var/lib/mysql/mysql.sock                                 #MySQL sock文件
XTRABACKUP_BIN=/usr/bin/innobackupex                         #innobackupex绝对路径
DEFAULTS_FILE=/etc/my.cnf                        				#MySQL配置文件
BACK_DATA=/data/db_xtrabackup/`date +%F`                     #DB备份的主目录
BACK_DATA_FULLBACKUP=${BACK_DATA}/full                       #全量备份的目录
BACK_DATA_INCREBACKUP=${BACK_DATA}/incre                     #增量备份的目录
BACK_LOG=${BACK_DATA}/agent_mysql_xtrabackup.log             #记录DB备份过程日志文件
XTRABACKUP_LOG=${BACK_DATA}/record_xtrabackup_status.log     #记录xtrabackup备份过程的输出信息
FULLBACKUP_INTERVAL=86400                                    #全库备份的间隔周期,单位:秒 这里是一天
BACKUP_TIME=10                                                #数据备份时间,即日志保存多少天(单位:天)
LOCKFILE='.xtrabackup.pid'                                   #加锁
# 安装Xtrabackup服务
#function Install_XtraBackup(){
#if [ ! -d ${INSTALL_DIR} ];then
#     mkdir -p ${INSTALL_DIR}
#  fi
#
#  if [ ! -f ${XTRABACKUP_BIN} ];then
#     echo " Install Percona Repository! " >>/dev/null 2>&1
#     cd ${INSTALL_DIR}
#     yum -y install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm >>/dev/null 2>&1
#     # yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm >>/dev/null 2>&1
#     yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm >>/dev/null 2>&1
#     yum install -y percona-xtrabackup-24 >>/dev/null 2>&1
#
##     innobackupex --help >>/dev/null 2>&1
##     Check=$?
##        if [ $Check -ne 0 ];then
##           echo "Install Xtrabackup Failed !"
##           exit 0
##        fi
#   fi
#}

# DB全备
function Back_All(){
  if [ ! -e "${SOCKET_FILE}" ];then
     exit 0
  fi

  if [ ! -d ${BACK_DATA_FULLBACKUP} ];then
     mkdir -p ${BACK_DATA_FULLBACKUP}
  fi

  if [ ! -d ${BACK_DATA_INCREBACKUP} ];then
     mkdir -p ${BACK_DATA_INCREBACKUP}
  fi

  #函数开始运行的时间点,用来与全备文件做时间对比
  START_TIME=`date +%s`

  #查找最新的完全备份
  LATEST_FULL_BACKUP=`/bin/find ${BACK_DATA_FULLBACKUP} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
  #查找最新全备文件的创建时间
  LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y ${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP}`
  #最新全备文件的创建时间与当前的时间差
  FULL_TIME_DIFF=$((${START_TIME}-${LATEST_FULL_BACKUP_CREATED_TIME}))

  #如果间隔小于86400秒,那么就基于全量备份做增量备份
  if [ ${LATEST_FULL_BACKUP} ] && [ ${FULL_TIME_DIFF} -lt ${FULLBACKUP_INTERVAL} ];then
     echo "                       " >> ${BACK_LOG}
     echo " `date +%Y/%m/%d-%H:%M`" >> ${BACK_LOG}
     echo " 基于全备目录:${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP},做增量备份 !" >> ${BACK_LOG}
     #调试使用1
     #echo "增量备份--incremental  ${BACK_DATA_INCREBACKUP}/${LATEST_INCRE_BACKUP}"
     #echo "全备目录--incremental-basedir= ${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP}"
     ${XTRABACKUP_BIN} --defaults-file=${DEFAULTS_FILE} --user=${USER} --password=${PASSWORD} --port=${PORT} --socket=${SOCKET_FILE} --incremental ${BACK_DATA_INCREBACKUP} --incremental-basedir=${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP} --parallel=2 --throttle=200 2>${XTRABACKUP_LOG} ;sleep 1
     SUCESS_BACKUP=`/bin/awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" ${XTRABACKUP_LOG}`
     LOG_LATEST_INCRE_BACKUP=`/bin/find ${BACK_DATA_INCREBACKUP} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`

     #查看备份日志,判断备份是否成功
     if [ `/usr/bin/tail -1 ${XTRABACKUP_LOG} | grep 'completed OK!' | wc -l` -eq 1 ];then
        #`grep 'incremental' ${LATEST_FULL_BACKUP}/xtrabackup_checkpoints | wc -l` -eq 1
        echo " 增量备份1成功,目录地址:${BACK_DATA_INCREBACKUP}/${LOG_LATEST_INCRE_BACKUP}" >>${BACK_LOG}
     else
        echo " innobackupex 增量备份命令执行失败! " >>${BACK_LOG}
        echo " -------------错误日志------------- " >>${BACK_LOG}
        tail -10 ${XTRABACKUP_LOG}                  >>${BACK_LOG}
        echo " ---------------------------------- " >>${BACK_LOG}
        exit 1
     fi
  fi

  #如果全备目录不存在,那么就重新全备一个文件
  if [ ! ${LATEST_FULL_BACKUP} ] || [ ${FULL_TIME_DIFF} -gt ${FULLBACKUP_INTERVAL} ];then

     echo "                        "             >> ${BACK_LOG}
     echo " `date +%Y/%m/%d-%H:%M` "             >>${BACK_LOG}
     echo " 正在执行全新的完全备份 ========>> "  >>${BACK_LOG}
     ${XTRABACKUP_BIN} --defaults-file=${DEFAULTS_FILE} --user=${USER} --password=${PASSWORD} --port=${PORT} --parallel=2 --throttle=200 ${BACK_DATA_FULLBACKUP} --socket=${SOCKET_FILE} 2>${XTRABACKUP_LOG} ;sleep 1
     SUCESS_BACKUP=`/bin/awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" ${XTRABACKUP_LOG}`

     #查看备份日志,判断备份是否成功
     if [ `/usr/bin/tail -1 ${XTRABACKUP_LOG} | grep 'completed OK!' | wc -l` -eq 1 ];then
	     #`grep 'full-backuped' ${LATEST_FULL_BACKUP}/xtrabackup_checkpoints | wc -l` -eq 1
        echo " 数据成功备份到:${SUCESS_BACKUP} " >>${BACK_LOG}
     else
        echo " innobackupex 全备命令执行失败! "     >>${BACK_LOG}
        echo " -------------错误日志------------- " >>${BACK_LOG}
        tail -10 ${XTRABACKUP_LOG}                  >>${BACK_LOG}
        echo " ---------------------------------- " >>${BACK_LOG}
        exit 1
     fi
  fi
}

#删除过期的备份文件[暂定10天]
function Delete_File(){
  EXPIRED_FILE=`/bin/find /data/db_xtrabackup/ -maxdepth 1 -type d -mtime +${BACKUP_TIME} -name "20*"`

  echo " `date +%Y/%m/%d-%H:%M`"  >>${BACK_LOG}
  echo " 检查是否有过期的文件:"  >>${BACK_LOG}
  if [ ${EXPIRED_FILE} ];then
     echo " 找到了过期文件:${EXPIRED_FILE} "  >>${BACK_LOG}
     /bin/find /data/db_xtrabackup/ -maxdepth 1 -type d -mtime +${BACKUP_TIME} -name "20*" | xargs -I '{}' rm -fr {}
     echo " `date +%Y/%m/%d_%H:%M`, 过期文件:${EXPIRED_FILE} 已被删除!" >>${BACK_LOG}
  else
     echo " 不存在过期的文件! "  >>${BACK_LOG}
  fi
}

function Main(){
  touch ${LOCKFILE}
  exec 57<>${LOCKFILE}
  flock -xn 57
  if [[ $? -eq 1 ]]; then
     echo "$0 is Running, please wait"
     exit 3
  fi

#  Install_XtraBackup
  Back_All
  Delete_File

  exec 57>&-
}

Main

###############################################################################################################################################################
#数据恢复流程:
#1、在备份目录/data/db_backup/xtrabackup/下,找到需要恢复的文件
#		1.1、/data/db_backup/xtrabackup/2018-07-26/full               #全备文件目录
#		1.2、/data/db_backup/xtrabackup/2018-07-26/incre           #增量备份文件目录
#
#2、拷贝文件到主库机器,并检查数据的完整性
#		2.1、检查全备及增备目录下的xtrabackup_checkpoints文件
#		backup_type = full-backuped
#		from_lsn = 0
#		to_lsn = 1639857
#		last_lsn = 1639857
#		compact = 0
#		recover_binlog_info = 0
#
#		2.2、检查备份日志是否报错:
#		cat agent_mysql_xtrabackup.log
#
#3、开始合并数据
#		3.1、全备目录上重放已提交的事务:
#		innobackupex --defaults-file=/etc/my.cnf   --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --apply-log  --redo-only /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/                   #这里写全备文件

#		3.2、增量备份数据与全量备份数据合并,数据最终合并到全量备份目录内:
#			# --redo-onl 后是全备文件
#			# --incremental-dir= 指定增量备份2的目录(如果增量备份多次,那就指向最后一次增量备份的目录,这里指向的是增量备份2的目录)
#		innobackupex --defaults-file=/etc/my.cnf   --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --apply-log  --redo-only /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/ --incremental-dir=/data/db_xtrabackup/2020-01-03/incre/2020-01-03_17-14-39/
#
#		3.3、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
#		innobackupex --defaults-file=/etc/my.cnf   --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --apply-log /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/
#
#4、开始恢复数据:
#    4.1、关闭数据库
#    service mysqld stop
#    4.2、移除数据目录
#    mv /var/lib/mysql/ /data/mysql_bak/
#    4.3、重新创建MySQL数据目录
#    mkdir -p /var/lib/mysql/
#    4.4、将全备数据(全备+增备)恢复到MySQL
#    innobackupex --defaults-file=/etc/my.cnf  --user=root --password=root --port=6379 --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql/ --copy-back /data/db_xtrabackup/2020-01-03/full/2020-01-03_17-13-39/
#    4.5、授权
#    chown -R mysql.mysql /var/lib/mysql/
#    4.6、启动MySQL
#    service mysqld start
#
#5、检查
#########################################################################
该脚本参考了博客 https://blog.csdn.net/sinat_29214327/article/details/81517233?tdsourcetag=s_pctim_aiomsg

你可能感兴趣的:(mysql)