1.系统:Centos7
2.数据库:MariaDB。
MariaDB是Mysql的分支,所以对数据库的备份操作直接借鉴mysql的备份就好。唯一有些不同的可能是配置的文件位置不一样,以及开启Binlog的方式及文档小有不同。核心命令mysqldump以及binlog命令,mysqladmin命令使用起来都是一样的。
代码主要是转载zhao_xiaosong博主的文章链接:MySQL数据库全量备份与增量备份
原链接有部分代码出问题报错,修改完善同时添加了更详细的注释便于理解。
在/home下面创建存放的数据及运行日志
创建全量备份目录与日志
[root@localhost home]# mkdir -p /home/mysql-back
[root@localhost home]# touch /home/mysql-backlog.log
增量目录与日志
[root@localhost home]# mkdir -p /home/mysql_binback
[root@localhost home]# touch /home/mysql-binbacklog.log
**在/home目录下的各文件目录介绍**
[root@localhost home]# ll
总用量 9020
drwxr-xr-x. 2 root root 4096 7月 8 09:17 mysql-back **存放全量备份的压缩文件地址**
-rw-r--r--. 1 root root 484 7月 6 15:58 mysql-backlog.log **全量备份日志**
drwxr-xr-x. 2 root root 4096 7月 10 10:41 mysql_binback **存放增量备份的压缩文件**
-rw-r--r--. 1 root root 3882 7月 10 01:00 mysql-binbacklog.log **增量备份日志**
-rwxr-xr-x. 1 root root 1736 7月 7 17:41 save-all-data.sh **全量备份脚本**
-rwxr-xr-x. 1 root root 2214 7月 8 13:54 save-today.sh **增量备份脚本**
[root@localhost home]# tree
.
├── mysql-back **存放全量备份的压缩文件地址**
│ ├── LOGLEO.000001_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000002_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000003_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000004_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000005_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000006_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000007_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000008_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000009_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000010_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000011_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000012_20200708_09:13:55.tar.gz
│ ├── LOGLEO.000013_20200708_09:15:42.tar.gz
│ ├── LOGLEO.000014_20200708_09:16:27.tar.gz
│ └── LOGLEO.000015_20200708_09:17:27.tar.gz
├── mysql-backlog.log **全量备份日志**
├── mysql_binback **存放增量备份的压缩文件**
│ ├── LOGLEO.000001_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000002_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000003_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000004_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000005_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000006_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000007_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000008_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000009_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000010_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000011_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000012_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000013_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000014_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000015_20200708_09:41:21.tar.gz
│ ├── LOGLEO.000016 **用解压命令后解压的文件**
│ ├── LOGLEO.000017_20200708_09:44:58.tar.gz
│ ├── LOGLEO.000018
│ ├── LOGLEO.000018_20200708_11:03:15.tar.gz
│ ├── LOGLEO.000019
│ ├── LOGLEO.000019_20200708_11:07:31.tar.gz
│ ├── LOGLEO.000020
│ ├── LOGLEO.000020_20200708_11:08:15.tar.gz
│ ├── LOGLEO.000021
│ ├── LOGLEO.000021_20200708_13:54:59.tar.gz
│ ├── LOGLEO.000022
│ ├── LOGLEO.000022_20200709_01:00:01.tar.gz
│ ├── LOGLEO.000023
│ └── LOGLEO.000023_20200710_01:00:01.tar.gz
├── mysql-binbacklog.log **增量备份日志**
├── save-all-data.sh **全量备份脚本**
└── save-today.sh **增量备份脚本**
2 directories, 54 files
[root@localhost home]# vim /home/save-all-data.sh
#!/bin/bash
# 全备方式,一般在从机上执行,适用于小中型mysql数据库:
source /etc/profile # 加载系统环境变量
source ~/.bash_profile # 加载用户环境变量
# 定义全局变量
#登录数据库用户名
user="root"
#访问数据库密码
password="password"
#访问地址
host="localhost"
#访问数据库端口
port="3306"
#备份数据库名称,多个数据库用空格进行间隔
db=("newLEO" "test")
local="--single-transaction"
#数据库位置
mysql_path="/www/server/mysql"
#备份地址
backup_path="/home/mysql-back"
date=$(date +%Y%m%d_%H:%M:%S)
day=30
#日志路径
backup_log="/home/mysql-backlog.log"
# 判断是否存在目录,不存在则创建目录
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi
# 删除30天以前备份
#find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1
echo "开始备份数据库: ${db[*]}"
# 备份数据库后压缩
backup_sql(){
dbname=$1
#保存的文件名称
backup_name="${dbname}_${date}.sql"
mysqldump -h $host -P $port -u $user -p$password $lock --default-character-set=utf8 --flush-logs -R $dbname > $backup_path/$backup_name
if [[ $? == 0 ]];then
cd $backup_path
# tar --force-local参数压缩带有冒号的压缩包
tar czvf $backup_name.tar.gz $backup_name --force-local
size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
rm -rf $backup_name
echo "$date 备份 $dbname($size) 成功"
else
cd $backup_path
rm -rf $backup_name
echo "$date 备份 $dbname 失败"
fi
}
# 多个库循环备份
length=${#db[@]}
for ((i=0;i<$length;i++));do
backup_sql ${db[i]} >> $backup_log 2>&1
done
echo "备份结束,结果查看 $backup_log"
du $backup_path/*$date* -sh | awk '{print "文件:" $2 ",大小:" $1}'
[root@localhost home]# chmod +x /home/save-all-data.sh
注意:如果你的mysqldump命令无法使用,查看日志报错如下,很可能是mysql不在环境变量中,需到mysql的bin目录下进行mysqldump等命令的执行。
[root@localhost mysql-back]# cat /home/mysql-backlog.log
bash: mysqldump: command not found
20200710_15:04:40 备份 loan 失败
bash: mysqldump: command not found
20200710_15:04:40 备份 sys 失败
bash: mysqldump: command not found
20200710_15:14:32 备份 loan 失败
bash: mysqldump: command not found
20200710_15:14:32 备份 sys 失败
**在【mysqld】下面添加这三行**
[root@localhost bin]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=/home/mysql/mysql-bin
binlog_format=mixed #binlog_format=ROW
**重启mysql**
[root@localhost bin]# service mysql stop
Shutting down MySQL.... SUCCESS!
[root@localhost bin]# service mysql start
Starting MySQL. SUCCESS!
进mysql查看二进制日志功能是否打开
[root@localhost bin]# ./mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON |
| log_bin_basename | /home/mysql/mysql-bin | **这两个文件就是二进制文件即增量备份文件存放地址**
| log_bin_index | /home/mysql/mysql-bin.index | **这是增量备份文件的索引文档**
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-----------------------------+
6 rows in set (0.01 sec)
#!/bin/bash
# 增量备份方式,在从机上执行,适用于中大型mysql数据库
# 同时数据库配置文件必须开启binlog二进制文件
source /etc/profile # 加载系统环境变量
source ~/.bash_profile # 加载用户环境变量
# 定义全局变量
#存放二进制备份文件的压缩包目录
backup_path="/home/mysql_binback"
#二进制备份文件所在位置
mysqlbin_path="/home/mysql/mysql-bin"
backup_log="/home/mysql-binbacklog.log"
#二进制日志的索引文档
mysqlbinfile="/home/mysql/mysql-bin/mysql-bin.index"
date=$(date +%Y%m%d_%H:%M:%S)
day=30
# 刷新新的mysql-bin.0000*文件
mysqladmin -uroot -ppassword flush-logs
statistics=`cat $mysqlbinfile|wc -l`
num=0
# 判断是否存在目录,不存在则创建目录
if [ ! -e $backup_path ];then
mkdir -p $backup_path
fi
# 删除30天以前备份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1
# for循环对比是否存在或是否为最新的文件
echo "开始备份数据库: ..."
for file in `cat $mysqlbinfile`
do
# basename用于截取mysql-bin.0000*文件名,去掉./mysql-bin.0000*前面的./
dbname=`basename $file`
backup_name=`basename $file`_$date
statistics=`expr $num + 1`
cd $backup_path
# 判断是否刷新二进制文件
if [ $num != $statistics ];then
dest=$backup_path/$dbname*
# 判断二进制文件是否存在于要压缩的目录,不存在则备份至此目录
if [ ! -e $dest ];then
#拷贝二进制文件到存放压缩包的目录,为接下来压缩做准备
cp $mysqlbin_path/$dbname $backup_path/
# --force-local,压缩文件若带有冒号需要加上--force-local参数进行压缩解压操作
tar czvf $backup_name.tar.gz $dbname --force-local
size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
rm -rf $dbname
echo "$dbname 备份 $dbname($size) 成功" >> $backup_log
du $backup_path/* -sh | grep mysql-bin | awk '{print "文件:" $2 ",大小:" $1}'
else
echo "$dbname 备份 $dbname 已存在" >> $backup_log
continue
fi
fi
num+=1
done
echo "备份结束,结果查看 $backup_log"
du $backup_path/* -sh | grep mysql-bin | awk '{print "文件:" $2 ",大小:" $1}'
[root@localhost home]# chmod +x /home/save-today.sh
crontab -e
# 每个周日凌晨一点执行数据库全量备份脚本
00 01 * * 0 /home/save-all-data.sh > /dev/null 2>&1
# 周一到周六凌晨一点执行数据库增量备份脚本
00 01 * * 1-6 /home/save-today.sh > /dev/null 2>&1
查看定时任务
[root@localhost mysql-back]# crontab -l
# 每个周日凌晨一点执行数据库全量备份脚本
00 01 * * 0 /home/save-all-data.sh > /dev/null 2>&1
# 周一到周六凌晨一点执行数据库增量备份脚本
00 01 * * 1-6 /home/save-today.sh > /dev/null 2>&1
备份后的文件储存在哪?
/home/mysql-back **存放全量备份的压缩文件地址**
/home/mysql_binback **存放增量备份的压缩文件**
数据库还原策略是:根据当前发生数据丢失的时间,决定选取哪些文件来恢复。
例如:
(1)如果今天是周日,则选择周日凌晨的全量备份来恢复。
(2)如果今天是周二,则选择上周日的全量+本周一、周二的增量来恢复。
(3)如果今天是周五,则选择上周日的全量+本周一、周二、周三、周四、周五的增量来恢复。
(4)其他时间的话,依此类推。
进入/home/mysql-back
[root@localhost ~]#cd /home/mysql-back
[root@localhost mysql_back]#tar --force-local -zxvf LOGLEO.000015_20200708_09:17:27.tar.gz
[root@localhost mysql_back]# mysql -uroot -p你的mysql密码 要还原的数据库名
**查看自己的二进制目录**
[root@localhost ~]#cd /home/mysql-binback
[root@localhost mysql_binback]# ls
LOGLEO.000014_20200708_09:41:21.tar.gz
LOGLEO.000015_20200708_09:41:21.tar.gz
LOGLEO.000017_20200708_09:44:58.tar.gz
LOGLEO.000018_20200708_11:03:15.tar.gz
LOGLEO.000019_20200708_11:07:31.tar.gz
LOGLEO.000020_20200708_11:08:15.tar.gz
LOGLEO.000021_20200708_13:54:59.tar.gz
LOGLEO.000022_20200709_01:00:01.tar.gz
LOGLEO.000023_20200710_01:00:01.tar.gz
**解压文件操作**
[root@localhost mysql_binback]# tar --force-local -zxvf LOGLEO.000023_20200710_01:00:01.tar.gz
LOGLEO.000023
[root@localhost mysql_binback]#mysqlbinlog LOGLEO.000023 | mysql -uroot -p你的数据库密码
以上,就完成了增量备份的还原操作。
实际上还原的操作是可以在增量备份的基础上再进行精细划分,指定还原到某几分钟或几小时内的操作的。但是由于使用的概率太低,以下只作为记录使用,不进行仔细描述排版。
1.可以将二进制转换成sql语句,看着也比较方便,导出sql以后选取需要的执行即可
// 将binlog日志文件关于tide库的sql转出到文件
//将所有的 日志导出成sql语句
mysqlbinlog mysql-bin.000010 > t.sql
// 选择时间范围导出
mysqlbinlog --start-date="2020-07-16 09:02:21" --stop-date="2020-07-16 09:03:26" mysql-bin.000011 > t1.sql
2查看 需要还原的时间段
命令:
mysqlbinlog -v /www/server/data/mysql-bin.000010 --base64-output=DECODE-ROWS
还原语句:
mysqlbinlog /www/server/data/mysql-bin.000010 \
--start-datetime='2020-07-16 09:02:21' \
--stop-datetime='2020-07-16 09:03:21' -d t1 | mysql -uroot -p93a694440d9be704