您的位置:首页 > 数据库 > MySQL

超详细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 -p
mysql> 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.sql

4、查看二进制日志

[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001



5、截断日志

[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 -p
mysql> 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.000002



8、再次截断日志

[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs
[root@redhat7_1 ~]# ls /usr/local/mysql/data/



9、模拟故障还原数据

[root@redhat7_1 ~]# mysql -uroot -p
mysql> 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 -p
mysql> 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 -p
mysql> 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 -p
mysql> 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 Myql 备份策略