MariaDB/mysql定时全量增量备份脚本

MariaDB/Mysql定时全量增量备份脚本

  • 环境
  • 前言
  • 生成目录及日志
  • 全量备份
        • 编辑全量备份脚本
        • 添加可执行权限
  • 增量备份
        • 打开二进制日志备份功能
        • 编写增量备份脚本
        • 添加可执行权限
  • Crontab定时执行脚本
  • 还原数据
    • 数据的还原规则
    • 全量备份还原
    • 增量备份还原
  • 后话
    • 还原到指定时间范围

环境

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 失败

以上错误,相应的应该在原本的代码上添加如下改动:
MariaDB/mysql定时全量增量备份脚本_第1张图片

增量备份

打开二进制日志备份功能

**在【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定时执行脚本

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

你可能感兴趣的:(linux数据库,mysql,mysql,备份,每月,每周,每天,增量备份,mysql,灾备,热备,数据库)