实验:备份mysql数据库
- 冷备份
1) 停止服务
[root@centos01 ~]# systemctl stop mysq
2) 备份数据
[root@centos01 ~]#mkdir /backup
[root@centos01 ~]# tar zcf /backup/mysql_backup-$(date +%F).tar.gz /usr/local/mysql/data/
tar: 从成员名中删除开头的“/” ··········
3) 模拟数据库丢失
[root@centos01 ~]# mv /usr/local/mysql/data/ /opt/ 剪切
4) 恢复数据
[root@centos01 ~]#mkdir restore 创建目录
[root@centos01 ~]# tar zxf /backup/mysql_backup-2020-06-22.tar.gz -C ./restore
[root@centos01 ~]# mv ./restore/usr/local/mysql/data/ /usr/local/mysql 剪切
5) 重启服务
systemctl start mysql
- 使用mysqldump备份恢复数据库
实验案例:完整备份和增量备份与恢复
实验环境
莫学校近期在进行期中考试,要求数据库管理员负责一班,二班学生的考试成绩录入。为保证数据的可靠性,数据库管理员在录入学生成绩后均要做数据库备份,并且为了测试备份数据是否可用,模拟数据丢失故障,进行数据还原。
需求描述
在数据库表中,分三次录入学生考试成绩,具体的考试成绩信息分别参见表1~3
表1 一班学生成绩
姓名 班级 学号 语文 数学 英语 理综
张三 一班 20170822 110 105 92 235
李四 一班 20170820 95 115 110 260
王五 一班 20170818 95 103 108 270
赵六 一班 20170816 100 109 112 265
表2 二班学生成绩(1)
姓名 班级 学号 语文 数学 英语 理综
李宁 二班 20170824 92 98 105 235
陈铭 二班 20170826 111 107 96 204
表3 二班学生成绩(2)
姓名 班级 学号 语文 数学 英语 理综
付杰 二班 20170828 115 118 116 268
郭尚 二班 20170830 111 99 80 259
首次录入成绩后,做该表的完全备份,后两次成绩的录入之后,分别做增量备份。
模拟数据丢失,并使用增量备份分别基于位置和时间点恢复一班所有学生成绩与二班陈铭 - 创建数据库与表
[root@centos01 ~]# mysql -u root -ppwd@123 -e ’create database benet;’ 创建数据库’
[root@centos01 ~]# mysql -u root -ppwd@123 -e 'create table benet. student (姓名 char(5),班级 char(10),学号 char(10),语文 int,数学 int,英语 int,理综 int,primary key (学号));’ 创建表
- 分三次录入学生成绩,并在分别进行完整备份和增量备份。
1)完整备份恢复
录入一班成绩查看并完整备份
Mysql> Insert into benet.student values (‘’.’’.’’.’’.’’.’’.’*’); *代表插入的数据
备份表
[root@centos01 ~]# mysqldump -u root -p benet student > benet_table_student.sql
备份库
[root@centos01 ~]# mysqldump -u root -p --database benet > database_benet.sql
备份所有库
[root@centos01 ~]# mysqldump -u root -p --opt --all-database > all_database.sql
故障恢复表
模拟故障
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘delete from benet.student;’ 删除表
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘select * from benet.student;’ 查看
恢复验证
[root@centos01 ~]# mysql -u root -p benet <./benet_table_student.sql 恢复表
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘select * from benet.student;’ 查看
故障恢复库
模拟故障
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘drop database benet;’ 删除benet
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘show databases’ 查看库
创建空库并恢复
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘create database benet;’ 创建benet
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘show databases’ 查看
[root@centos01 ~]# mysql -u root -p benet < ./database_benet.sql 恢复到benet
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘select * from benet.student;’ 查看表内容是否恢复
所有库故障恢复
模拟故障
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘drop database benet;’
恢复
[root@centos01 ~]# mysql -u root -p < ./all_databases.sql 恢复所有数据库
[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.csdnimhn/TpcK20201009095828224.png#pic_center9(https://img-blog.csdnimg.cn/20201009095828224.png#pic_center)]
验证
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘select * from benet.student;’
2)增量备份恢复
开启mysql二进制日志功能 (源代码安装默认已开启不用管)
[root@centos01 ~]# vim /etc/my.cnf 进入
49 log-bin=mysql-bin 开启功能
保存的默认位置
[root@centos01 ~]# ls /usr/local/mysql/data/
查看二进制日志文件
[root@centos01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000005
配置二进制切割 刷新二进制日志
[root@centos01 ~]# mysqladmin -u root -ppwd@123 flush-logs
一般故障恢复
插入新数据
切割日志进行刷新
[root@centos01 ~]# mysqladmin -u root -ppwd@123 flush-logs
查看最新日志文件
[root@centos01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000006
备份二进制文件到当下目录
[root@centos01 ~]# cp /usr/local/mysql/data/mysql-bin.000006 ./
模拟故障删除benet
恢复完整备份数据但新数据没有
使用二进制文件恢复增量备份数据
[root@centos01 ~]# mysqlbinlog --no-defaults mysql-bin.000006 | mysql -u root -ppwd@123
[root@centos01 ~]# mysql -u root -ppwd@123 -e ''select * from benet.student;
基于位置恢复
模拟故障
恢复完整备份
新数据使用二进制日志恢复
- 开始到指定(只恢复李宁)查看日志文件
[root@centos01 ~]# mysqlbinlog --stop-position=‘405’ ./mysql-bin.000006 | mysql -u root -ppwd@123
验证
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘select * from benet.student;’
- 指定到结束(只恢复陈铭)
恢复验证
[root@centos01 ~]# mysqlbinlog --start-position=‘405’ ./mysql-bin.000006 | mysql -u root -ppwd@123
[root@centos01 ~]# mysql -u root -ppwd@123 -e ‘select * from benet.student;’
基于时间恢复
一样是模拟故障
恢复完整备份数据
使用二进制恢复新数据基于时间
开始到指定
[root@centos01 ~]# mysqlbinlog --stop-datetime=‘2020-06-23 22:08:35’ ./mysql-bin.000006 | mysql -u root -ppwd@123
指定到结束
[root@centos01 ~]# mysqlbinlog --start-datetime=‘2020-06-23 22:08:35’ ./mysql-bin.000006 | mysql -u root -ppwd@123
指定到指定
[root@centos01 ~]# mysqlbinlog --start-datetime=‘2020-06-23 22:07:57’ --stop-datetime=‘2020-06-23 22:11:37’ ./mysql-bin.000006 | mysql -u root -ppwd@123