超详细MySql备份策略
2018-09-03 21:29
477 查看
数据备份的重要性
在生产环境中,数据的安全性是至关重要的,任何数据的丢失都可能产生严重的后果。重要性可以体现为以下几点:1.提高系统的高可用性和灾难可恢复性,在数据库崩溃时,没有数据库备份就没法找到数据
2.使用数据备份还原数据库,是数据库崩溃时提供数据恢复最小代价的最优方案,重新添加数据,代价太大
3.没有数据就没有一切,数据库备份是一种防灾难的强力手段
造成数据丢失的原因
程序错误人为错误
计算机失败
磁盘失败
灾难(如火灾、地震)和偷窃
数据备份的分类
1、从物理与逻辑的角度,备份可分为物理备份和逻辑备份
逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份。注意备份之前要锁表物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)
冷备份:是在关闭数据库的时候进行的(打压缩包)
热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件。运行状态下,大多数操作都会记录在日志中,通过日志回放的方式恢复,只需要备份日志
2、从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份
完全备份:每次对数据进行完整的备份差异备份:备份那些自从上次完全备份之后被修改过的文件。注意这里只针对上次完全备份,中间不管会不会再次出现备份
增量备份:只有那些在上次完全备份或者增量备份后修改的文件才会被备份。注意这里是基于上一次备份,上一次备份方式不管是什么,将多出来的进行备份
实验环境
系统环境:CentOS7.4服务器IP地址:192.168.100.71
yum挂载目录:/mnt/sr0
相关源码信息:mysql-5.7.17
命令步骤
一、使用tar命令打包文件夹备份
1、安装xz软件包
[root@redhat7_1 ~]# yum -y install xz #使用xz压缩格式,压缩率较大2、备份数据目录
[root@redhat7_1 ~]# tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/ #将mysql数据目录进行备份,至/opt/目录下,以当前时间作为后缀,防止文件名重复3、查看备份数据
[root@redhat7_1 ~]# ls /opt/4、查看备份前后数据大小
5、恢复备份数据
[root@redhat7_1 ~]# tar Jxvf /opt/mysql-2018-08-30.tar.xz /usr/local/mysql/data/6、引入周期性计划任务
[root@redhat7_1 ~]# crontab -e #编辑周期性计划任务[root@redhat7_1 ~]# crontab -l
二、使用mysqldump工具备份
1、创建测试数据
mysql> create database school default character set utf8 collate utf8_general_ci; #创建数据库mysql> use school; #进入school数据库
#创建"student"表并添加数据
mysql> create table student(Sid int not null primary key auto_increment,Sname char(10),Saddress varchar(50),Sscore decimal(5,2));
mysql> insert into student(Sname,Saddress,Sscore) values('huamanlou','nanjing',99); #添加数据
mysql> insert into student(Sname,Saddress,Sscore) values('zhanzhao','kaifeng',95);
mysql> insert into student(Sname,Saddress,Sscore) values('xiaoqi','shanghai',91);
#创建"teache"表并添加数据
mysql> create table teacher(Tid int not null primary key auto_increment,Tname varchar(20));
mysql> insert into teacher(Tname) values('Mr Zhang');
mysql> insert into teacher(Tname) values('Mr Wang');
mysql> insert into teacher(Tname) values('Mrs Liu');
2、mysqldump命令对单个库进行完全备份
[root@redhat7_1 ~]# mysqldump -uroot -p school > /opt/school.sql #对"school"库进行备份[root@redhat7_1 ~]# vim /opt/school.sql #查看备份sql文件
3、mysqldump命令对多个库进行完全备份
[root@redhat7_1 ~]# mysqldump -u root -p --databases mysql school > /opt/mysql-school-mysql.sql[root@redhat7_1 ~]# vim /opt/mysql-school-mysql.sql #查看备份sql文件
4、对所有库进行完全备份
[root@redhat7_1 ~]# mysqldump -u root -p --opt --all-databases > /opt/all-data.sql[root@redhat7_1 ~]# vim /opt/all-data.sql
5、指定表或表结构
[root@redhat7_1 ~]# mysqldump -u root -p school student > /opt/school_student.sql[root@redhat7_1 ~]# vim /opt/school_student.sql
[root@redhat7_1 ~]# mysqldump -u root -p -d school student > /opt/school_stu.sql
[root@redhat7_1 ~]# vim /opt/school_stu.sql
三、恢复数据库操作
1、使用source恢复数据库的操作
[root@redhat7_1 ~]# mysqldump -u root -p --databases school > /opt/mysql_schooldb.sql #备份数据[root@redhat7_1 ~]# mysql -u root -p
mysql> drop database school;
mysql> show databases;
mysql> source /opt/mysql_school.sql #导入school;
mysql> select from school.student;
mysql> select from school.teacher;
2、使用mysql命令恢复数据
[root@redhat7_1 ~]# mysqldump -u root -p school student > /opt/school_student.sql #备份"student"表数据[root@redhat7_1 ~]# mysql -u root -p
mysql> drop table school.student;
mysql> desc school.student;
mysql> quit
[root@redhat7_1 ~]# mysql -u root -p school < /opt/school_student.sql #重新导入数据
[root@redhat7_1 ~]# mysql -u root -p
mysql> select * from school.student;
四、数据库增量备份恢复
1、开启Mysql二进制日志功能
[root@redhat7_1 ~]# vim /etc/my.cnf在mysld标签下添加:
[mysqld]log_bin=mysql-bin
[root@redhat7_1 ~]# systemctl restart mysqld.service #重启服务
[root@redhat7_1 ~]# cd /usr/local/mysql/data/
[root@redhat7_1 data]# ls
2、创建相应测试数据
[root@redhat7_1 ~]# mysql -u root -pmysql> drop database school; #删除之前的"school"库
mysql> create database school;
mysql> use school;
mysql> create table student(id int not null primary key auto_increment , name varchar(10),score decimal(5,2));
mysql> insert into student (name,score) values('Tom',99); #添加以下两条数据
mysql> insert into student (name,score) values('Bob',95);
mysql> quit
3、对"school"库进行完整备份
[root@redhat7_1 ~]# mysqldump -uroot -p --databases school > /opt/school.sql4、查看二进制日志
[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.0000015、截断日志
[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs[root@redhat7_1 ~]# ls /usr/local/mysql/data/
[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
6、插入测试数据
[root@redhat7_1 ~]# mysql -uroot -pmysql> insert into school.student(name,score) values('t01',88);
mysql> insert into school.student(name,score) values('t02',89);
mysql> quit
7、查看二进制日志
[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.0000028、再次截断日志
[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs[root@redhat7_1 ~]# ls /usr/local/mysql/data/
9、模拟故障还原数据
[root@redhat7_1 ~]# mysql -uroot -pmysql> drop database school; #删除数据库
mysql> quit
[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql #导入数据
mysql> select * from school.student;
[root@redhat7_1 ~]# cd /usr/local/mysql/data/
[root@redhat7_1 data]# mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p #导入增量数据
[root@redhat7_1 ~]# mysql -u root -p
mysql> select * from school.student;
五、基于时间点恢复数据
1、重新导入"school"库完全备份
[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql[root@redhat7_1 ~]# mysql -u root -p
2、截断日志
[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs[root@redhat7_1 ~]# ls /usr/local/mysql/data/
3、添加数据模拟故障
[root@redhat7_1 ~]# mysql -uroot -pmysql> insert into school.student(name,score) values('user01',79);
mysql> delete from school.student where name='Bob'; #注意这条sql语句模拟误删除
mysql> insert into school.student(name,score) values('user02',84);
mysql> insert into school.student(name,score) values('user03',83);
mysql> select * from school.student;
4、再次截断日志
[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs[root@redhat7_1 ~]# ls /usr/local/mysql/data/
5、删库模拟故障
[root@redhat7_1 ~]# mysql -u root -pmysql> drop database school;
mysql> quit
[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql #导入完全备份数据
6、恢复数据
[root@redhat7_1 ~]# cd /usr/local/mysql/data/[root@redhat7_1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004
[root@redhat7_1 data]# mysqlbinlog --no-defaults --stop-datetime='2018-09-03 18:52:11' mysql-bin.000004 | mysql -uroot -p123
#"stop-datetime"代表的是错误时间点,从二进制日志文件开头进行加载,一直到错误时间点结束
[root@redhat7_1 data]# mysqlbinlog --no-defaults --start-datetime='2018-09-03 18:52:17' mysql-bin.000004 | mysql -uroot -p123
#"start-datetime"代表的是正确操作时间点,从哪个时间点再进行开始
六、基于位置恢复数据
1、删库模拟故障
[root@redhat7_1 ~]# mysql -u root -pmysql> drop database school;
mysql> quit
[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql #导入完全备份数据
2、恢复数据
[root@redhat7_1 ~]# cd /usr/local/mysql/data/[root@redhat7_1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004
[root@redhat7_1 data]# mysqlbinlog --no-defaults --stop-position='559' mysql-bin.000004 | mysql -uroot -p123
#"stop-position"代表的是错误位置,从二进制日志文件开头进行加载,一直到错误位置结束
[root@redhat7_1 data]# mysqlbinlog --no-defaults --start-position='664' mysql-bin.000004 | mysql -uroot -p123
#"start-position"代表的是正确操作位置,从哪个位置再进行开始
相关文章推荐
- MySQL 备份和恢复策略(三)
- Shell实现MySQL定期备份策略小脚本
- MySQL 备份和恢复策略四:使用主从复制机制(replication)实现数据库实时备份
- MySQL的备份的一些策略和方法的总结
- MySQL 备份和恢复策略笔记(4)
- MySQL 备份和恢复策略(一)
- MySQL主从备份详细步骤
- MYSQL自动备份策略的选择
- MySQL 备份策略浅谈 推荐
- Mysql备份还原数据库之mysqldump实例及参数详细说明
- mysqldump详细参数 mysql备份与回复
- MYSQL自动备份策略的选择与实践
- MYSQL自动备份策略的选择
- Mysql备份还原数据库之mysqldump实例及参数详细说明
- MYSQL大容量库的备份策略
- Mysql备份还原数据库之mysqldump实例及参数详细说明
- MySQL 利用xtrabackup进行增量备份详细过程汇总
- MySQL平台数据库备份方案详细说明
- MySQL 备份和恢复策略(二)
- Mysql主从同步备份策略(实战经验及步骤)