用到的软件包在百度网盘中
链接:https://pan.baidu.com/s/1--klDCt3afjt9QSPBS0lGA?pwd=sxau 提取码:sxau
一,相关概念
数据备份:就是把当前服务器上的数据拷贝一份,放到其他的存储设备里
恢复数据: 使用放到其他存储设备里的备份数据,还原丢失的数据。
数据备份方式:
物理备份:拷贝数据库目录下的文件
逻辑备份:使用软件提供的备份命令对数据做备份
数据备份策略 :
1、完全备份 :备份所有数据, 一台数据库服务器上的所有数据, 一个数据库下所有数据 一张表里的所有数据。
2,增量备份:备份上次备份后,新产生的数据
3、差异备份:备份自完全备份后,新产生的数据。
备份策略的使用方式:
完全备份+增量备份
完全备份+差异备份
二、完全备份
2.1、物理方式对数据做备份与恢复
适合线下数据库服务器(需要停止数据库服务)
# 备份数据
[root@host50 ~]# systemctl stop mysqld
[root@host50 ~]# mkdir /bakdir
[root@host50 ~]# cp -r /var/lib/mysql /bakdir/mysql.bak 拷贝数据库目录
[root@host50 ~]# cd /var/lib/mysql
[root@host50 ~]# tar -zcf /bakdir/mysql.tar.gz ./* 打包压缩数据库目录下文件
# 查看备份文件
[root@host50 ~]# ls /bakdir/
mysql.bak mysql.tar.gz
[root@host50 ~]#
# 模拟数据丢失
[root@host50 ~]# rm -rf /var/lib/mysql/*
# 恢复数据
[root@host50 ~]# cp -r /bakdir/mysql.bak/* /var/lib/mysql/
[root@host50 ~]# chown -R mysql:mysql /var/lib/mysql
[root@host50 ~]# systemctl start mysqld
[root@host50 ~]# mysql -uroot -p密码
mysql> show databases; # 能够看所有的库
2.2、逻辑方式对数据备份与恢复
- 适合线上数据库服务器,备份和恢复数据库服务必须是运行的
# 完全备份命令
]# mysqldump -uroot -p密码 库名 > /目录名/备份文件名.sql
库名的表示方式:
库名 表名 #备份库中一张表的所有数据
库名 表名1 表名2 #备份多张表的所有数据
-B 库名 #备份1个库的所数据
-B 库名1 库名2 #备份多个库的所数据
-A 或 --all-databases #备份服务器的所有数据
# 完全恢复数据命令
]# mysql -uroot -p密码 [库名] < /目录名/备份文件名.sql
说明:使用表的备份文件恢复数据时必须写库名,
不然数据库服务不知道把数据恢复那个库里
# 备份数据例子
# 存储备份文件的目录要事先创建
--master-data 做完全备份数据时 ,在备份文件里记录使用的日志名和偏移量
[root@host52 ~]# mysqldump -uroot -pNSD2107...a --master-data -B db1 > /root/db1.sql
[root@host52 ~]#grep master52 /root/db1.sql
CHANGE MASTER TO MASTER_LOG_FILE='master52.000001', MASTER_LOG_POS=2000;
[root@host50 ~]# mysqldump -uroot -p密码 tarena salary > /bakdir/tarena_salary.sql
[root@host50 ~]# mysqldump -uroot -p密码 -B tarena > /bakdir/tarena.sql
[root@host50 ~]# mysqldump -uroot -p密码 -B db1 tarena > /bakdir/twodb.sql
[root@host50 ~]# mysqldump -uroot -p密码 -A > /bakdir/allbak.sql
[root@host50 ~]# ls /bakdir/
allbak.sql tarena.sql tarena_salary.sql mysql.bak mysql.tar.gz twodb.sql
# 恢复数据例子
# 删除数据
mysql> delete from tarena.salary;
mysql> exit
# 恢复数据
[root@host50 ~]# mysql -uroot -p密码 tarena < /bakdir/ tarena_salary.sql
# 查看表记录
[root@host50 ~]# mysql -uroot -p密码
Mysql> select count(*) from tarena.salary;
# 使用库的备份文件恢复数据
mysql> drop database tarena;
mysql> exit;
#使用库的备份文件恢复数据 不需要写库名
[root@host50 ~]# mysql -uroot -p密码 < /bakdir/tarena.sql
# 管理员登陆查看数据
[root@host50 ~]# mysql -uroot -p密码
mysql> show databases;
mysql> use tarena;
mysql> show tables;
# 编写计划任务每周周一晚上23点备份服务的所有数据 用系统日期做备份文件名
# 编写备份脚本
vim /root/allbak.sh
#!/bin/bash
mysqldump -uroot -p密码 -A > /bakdir/`date +%F`allbak.sql
:wq
Chmod +x /root/allbak.sh
]#crontab -e
00 23 * * 1 /root/allbak.sh
# mysqldump的备份缺点:
1 mysqldump 在备份数据和恢复数据的时候会锁表
2 使用 mysqldump备份命令生成备份文件恢复数据,
只能把数据恢复备份时刻的数据。
# 锁表 数据库备份需要时间,在备份的过程中,对数据库的查询、和存储都无法进行,
要等到表的数据备份完成,然后进行释放,释放成功后,才可以进行数据的查询和存储
三、增量备份
使用第三方软件 percona
提供的备份命令 innobackupex
对数据做备份和恢复
特点:在线热备不锁表 适合生产环境下备份业务。
第一步:安装提供命令的软件(软件需要自己下载)
]#yum -y install libev-4.15-1.el6.rf.x86_64.rpm
]#yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
]#which innobackupex
/usr/bin/innobackupex
]# innobackupex --help
]# man innobackupex 按q 退出帮助
3.1 数据增量备份与恢复
- 说明:增量备份是备份上次备份后新产生的数据 所以在执行增量备份之前 必须要先有一次完全备份 不然的话无法得知那些数据是新数据 通常增量备份前的首次备份 是 完全备份 比如 每周的周一都对数据做完全备份 每周的周二到周日 对数据都做增量备份
首次完全备份命令
]#innobackupex -uroot -p密码 /备份目录名 --no-timestamp
--no-timestamp 不用时间戳创建子目录存储备份数据
增量备份命令
]#innobackupex -uroot -p密码 --incremental /目录名 --incremental-basedir=/目录名 --no-timestamp
# 命令选项解释
--incremental 增量备份
--incremental-basedir=/目录名 # “目录名”是上次备份目录,作为此次增量备份的参考
增量恢复命令
#准备恢复数据
]#innobackupex --apply-log --redo-only /首次备份目录名
#合并数据 (合并的顺序要与增量备份的顺序一致)
]#innobackupex --apply-log --redo-only /首次备份目录名 --incremental-dir=/目录名
#拷贝数据
]#innobackupex --copy-back /完全备份目录
--apply-log --redo-only 准备恢复数据
--incremental-dir 增量备份数据存放目录
--copy-back 拷贝数据到数据库目录下
增量恢复数据具体操作步骤:
1) 停止数据库服务
2) 清空数据库目录
3) 准备恢复数据
4) 合并准备恢复数据
5) 恢复数据
6) 修改数据库目录的所有者和组用户为mysql
7) 启动服务
8) 查看数据
增量备份的例子:
- 统一在 host50(192.168.88.50) 主机做练习
- 每周的周一对数据做完全备份 每周的周二到周日对数据做增量备份
# 周一 执行完全备份
[root@host50 ~]# innobackupex -uroot -p密码 /fullbak --no-timestamp
# 向表里添加新数据 (多执行几遍)
mysql> insert into tarena.user(name,shell) values("fff","fff");
# 周二 执行增量备份
[root@host50 ~]# innobackupex -uroot -p密码 --incremental /new1dir --incremental-basedir=/fullbak --no-timestamp
# 向表里添加新数据 多执行几遍
mysql> insert into tarena.user(name,shell) values("zzz","zzz");
# 周三 执行增量备份
[root@host50 ~]# innobackupex -uroot -p密码 --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp
# 向表里添加新数据
mysql> insert into tarena.user(name,shell) values("www","wwww"); (多执行几遍)
# 周四 执行增量备份
[root@host50 ~]# innobackupex -uroot -p密码 --incremental /new3dir --incremental-basedir=/new2dir --no-timestamp
增量恢复
- (使用增量备份文件恢复数据)
模拟数据丢失
[root@host50 ~]# mysql -uroot -pNSD2107...a -e 'drop database tarena'
[root@host50 ~]# mysql -uroot -pNSD2107...a -e 'drop database mysql'
具体操作步骤:
1) 停止数据库服务
[root@host50 ~]# systemctl stop mysqld
2) 清空数据库目录
[root@host50 ~]# rm -rf /var/lib/mysql/*
3) 准备恢复数据 (告诉程序innobackupex从什么位置开始合并数据)
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/ # 从第一次完全备份目录开始
4) 合并数据
# 合并第1次增量备份数据
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/
--incremental-dir=/new1dir
# 合并第2次增量备份数据
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/
--incremental-dir=/new2dir
# 合并第3次增量备份数据
[root@host50 ~]# innobackupex --apply-log --redo-only /fullbak/
--incremental-dir=/new3dir
5) 恢复数据 (把合并后的数据拷贝到数据库目录下)
[root@host50 ~]# innobackupex --copy-back /fullbak
6) 修改数据库目录的所有者和组用户为mysql
[root@host50 ~]# chown -R mysql:mysql /var/lib/mysql
7) 启动服务
[root@host50 ~]# systemctl start mysqld
8)查看数据
[root@host50 ~]# mysql -uroot -p密码
MySQL> show databases;
差异备份
- 首先要有一个完全备份
- 与完全备份相比较,进行的备份
# 周一 执行完全备份
[root@host50 ~]# innobackupex -uroot -p密码 /fullbak --no-timestamp
# 向表里添加新数据 (多执行几遍)
mysql> insert into tarena.user(name,shell) values("fff","fff");
# 周二进行差异备份,与完全备份进行比较
[root@host50 ~]# innobackupex -uroot -p123qqq...A --incremental /new1dir --incremental-basedir=/fullbak
# 周三进行差异备份 与完全备份进行比较
[root@host50 ~]# innobackupex -uroot -p123qqq...A --incremental /new2dir --incremental-basedir=/fullbak
#备份恢复和增量备份操作步骤一样,差异备份每次备份都是和第一次的完全备份进行比较,所以,差异备份方式,恢复数据时,第一次的完全备份和最后一次的差异备份合并,得到的就是完整的数据,增量备份,都是和上一次的数据进行比较,所以合并数据时,需要将完全备份开始后的每次增量备份,全部合并才能得到完整数据。
以上备份都可以写作脚本,添加到计划任务中,进行备份执行