最近要对Mysql数据库进行备份,然后发现我服务器上的数据库被黑了,一直没有发现.还要给我要0.03个比特币哈哈哈哈~
当然我数据库没啥重要的东西,并且有快照,所以大家还是要注意开放的端口,别丢失了数据.
Mysql备份与恢复
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去执行以及加载语句,转化存储格式,重建引擎
优点:
基于文件的物理备份
容易跨平台,跨操作系统以及版本
恢复起来会更快(不需要执行任何的mysql语句,不需要构建索引等等)
缺点:
文件大
部分情况下不可以跨平台,跨操作系统或者mysql版本
备份原理:
拷贝数据文件丶拷贝数据页
对innodb表可以实现热备
对myisam表可以实现锁表自动拷贝文件
mkdir /data/tmp
cd /data/tmp
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
根据脚本中的备份位置,查看是否已经进行了备份
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/ # 全备份目录
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