Mysql--备份

一 备份分类

 1 根据服务是否在线继续

  热备份  读写均不受影响

  温备份  仅可执行读操作/写操作

  冷备份  也称离线备份 读写操作均终止

 2 根据备份时是否直接复制数据文件

  物理备份  直接复制数据文件 速度快

  逻辑备份  将数据对象导出至文本文件中 速度慢 丢失浮点精度(sql语句) 但方便使用文本根据直接进行处理 可移植能力强

 3 根据备份数据内容

  完全备份  备份全部数据

  增量备份  仅备份上次完全备份或增量备份以后变化的数据

  差异备份  仅备份上次完全备份以来变化的数据

 4 备份时间选择

  数据访问量较小的时候做备份

二 备份工具

 1 mysqldump  mysql官方提供的逻辑备份工具 备份和恢复速度较慢 不太合适数据库>50G

  备份:

    表  mysqldump -u用户 -p密码 库名 表1 [表2 ...] > /path/tables.sql

    库  mysqldump -u用户 -p密码 -B 库1 [库2...] > /path/databases.sql

    全备  mysqldump -u用户 -p密码 -A > /path/all.sql

  恢复:

    表  mysql -u用户 -p密码 库名 < /path/tables.sql

    库  mysql -u用户 -p密码 < /path/databases.sql

    全备  mysql -u用户 -p密码 < /path/all.sql

  常用选项:

    -B  做库备份时指定索要备份的库

    -A  全库备份

    -x  给所有的表加锁

    -F  备份后刷新日志(启动新的日志记录)

 2 Xtrabackup

  介绍  Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)

  原理  备份开始时首先会开启一个后台检测进程,实时检测mysq redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,

      之后复制innodb的数据文件,系统表空间文件ibdatax,复制结束后,执行flush tables with readlock,然后复制.frm MYI MYD等文件,

      完成后执行unlock tables,最后停止xtrabackup_log,备份完成

  版本兼容性   MySQL 5.6及之前的版本需要安装 Percona XtraBackup 2.3及以上,安装指导参见官方文档Percona XtraBackup 2.3

          MySQL 5.7版本需要安装 Percona XtraBackup 2.4及以上,安装指导参见官方文档Percona XtraBackup 2.4

          MySQL 8.0版本需要安装 Percona XtraBackup 8.0,安装指导参见官方文档Percona XtraBackup 8.0

  安装  yum -y install xtrabackup

  全备  innobackupex --user=用户 --password=密码 /backup/

      innobackupex --user=用户 --password=密码 --no-timestamp /backup/full/  指定已有目录

  全备还原  innobackupex --apply-log /backup/full    还原准备 以保证数据一致性

        /etc/init.d/mysqld stop           停掉数据库

        rm -rf /data/mysql/*            删除数据目录中所有数据

        innobackupex --copy-back /backup/full    执行还原操作

    可能出现问题:1)找不到datadir

             vim /etc/my.cnf  设置datadir = /data/mysql/

           2)还原后数据库起不来(无权限)

             chown mysql.mysql -R /data/mysql

  增量备份(先做全备)  innobackupex --user=用户 --password=密码 --incremental /backup/(备份后存放路径) --incremental-basedir=/backup/1(备份起始文件)

              innobackupex --user=用户 --password=密码 --incremental /backup/ --incremental-basedir=/backup/2

  增备还原  innobackupex --apply-log --redo-only /backup/1              #合并,还原准备

        innobackupex --apply-log --redo-only /backup/full/ --incremental-dir=/backup/2

        innobackupex --apply-log --redo-only /backup/full/ --incremental-dir=/backup/3

        /etc/init.d/mysqld stop

        rm -rf /data/mysql/*

        innobackupex --copy-back /backup/full

三 定时备份

 下为转载文章 来自:https://www.cnblogs.com/user-sunli/p/13917315.html

 每周的周日进行一次全备;周一到周六每天做上一天增量,每周轮询一次。

 备份方案: xtrabackup全备+增量

[root@localhost ~]# crontab -l
0 3 * * 7 /root/allbak.sh &> /dev/null
0 3 * * 1-6 /root/newbak.sh &> /dev/null
[root@localhost ~]# cat allbak.sh 
#!/bin/bash
[ ! -e /backup ]&& mkdir /backup    #新建个文件夹专门放备份文件
day=date +%F                        #定义日期是时间
user=root
pass=123456
#用innobackupex做完全备份
innobackupex --user $user --password $pass /backup/allbak${day} --no-timestamp
#启用binlog日志,每次完全备份之后,每周刷新一遍binlog日志
mysql -u$user -p$pass -e "flush logs"
[root@localhost ~]# cat newbak.sh
#!/bin/bash
d1=date +%F                     #定义时间,用日期来区分
d2=date +%F -d "-1 days"        #找到昨天的日期,好指明上一次备份的备份文件
dir1=/backup/allbak${d2}        #昨天做的完全备份文件
dir2=/backup/newbak${d2}        #昨天做的增量备份文件
user=root
pass=123456
[ ! -e /backup ]&& mkdir /backup        #如果文件不存在,则创建文件夹
if [ -e ${dir1} ];then          #判断昨天做的是完全备份 Y指定昨天备份的完全备份文件
    innobackupex --user $user --password $pass --incremental /backup/newbak${d1} --incremental-basedir=${dir1} --no-timestamp
elif [ -e ${dir2} ];then        #判断昨天做的是增量备份 Y指定昨天备份的增量备份文件
    innobackupex --user $user --password $pass --incremental /backup/newbak${d1} --incremental-basedir=${dir2} --no-timestamp
else                   #昨天既没有做增量备份,又没有做完全备份,则做一次完全备份。
    innobackupex --user $user --password $pass /backup/allbak${d1} --no-timestamp 
fi
原文地址:https://www.cnblogs.com/Xinenhui/p/14083710.html