文章目录
一、数据库备份的分类
二、MySQL 完全备份
(1)完全备份特点
(2)mysqldump 备份库
1、针对单个库进行完全备份
2、针对多个库进行完全备份
3、对所有库进行完全备份
(3)恢复数据库操作
1、source 命令
2、使用 mysql 命令
(4)mysqldump 备份表
1、备份表
2、备份表的结构
(5)恢复表的操作
三、MySQL 增量备份
一、数据库备份的分类:
1、从物理与逻辑的角度,备份可以分为:
物理备份:对数据库操作系统的物理文件(数据文件、日志文件等)备份;
逻辑备份:对数据库逻辑组件(如表等数据库对象)备份;
2、从数据库的备份策略角度,备份可分为:
完全备份:每次对数据进行完整的备份;
差异备份:备份那些自从上次完全备份之后被修改过后的文件;
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。
二、MySQL 完全备份:
完全备份是对整个数据库的备份、数据库结构和文件结构的备份;
完全备份保存的是对备份完成时刻的数据库;
完全备份是增强备份的基础
(1)完全备份特点:
备份与恢复操作简单方便;
数据存在大量的重复,会导致占用大量的备份空间
备份与恢复时间长
(2)mysqldump 备份库
mysql 数据库的备份可以采取多种方式:
直接打包数据库文件夹;
使用专用的备份工具 ----- mysqldump ;
该命令工具可以将指定的库、表或全部的库导出为 SQL 脚本,在需要恢复时可进行数据恢复。
tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/
//直接对整个数据库的数据文件进行打包,备份,并以时间命名压缩包名称
1、针对单个库进行完全备份:
mysqldump -uroot -p school > /opt/school.sql
将名为school的数据库备份到/opt/目录下,起名为school.sql
2、针对多个库进行完全备份:
mysqldump -uroot -pabc123 --databases school team > /opt/db_s_t.sql
//对school和team这两个数据库进行备份,起名为db_s_t.sql
3、对所有库进行完全备份:
mysqldump -uroot -pabc123 --all-databases > /opt/all.sql
//对所有的数据库进行备份
(3)恢复数据库操作
使用 mysqldump 命令导出的 SQL 备份脚本,在进行数据恢复时可使用两种方法导入:
source 命令
mysql 命令
1、source 命令:
先登录到 mysql 数据库,再执行 source 备份sql脚本的路径。
mysql> source /opt/school.sql;
//恢复school数据库
2、使用 mysql 命令:
mysql -uroot -pabc123 school < /opt/school.sql
//恢复school数据库
(4)mysqldump 备份表
1、备份表:
mysqldump -uroot -pabc123 school info > /opt/school_info.sql
//对数据库school下的info表进行备份
2、备份表的结构:
mysqldump -uroot -pabc123 -d school info > /opt/school_info.sql
//加-d 选项,就是备份表的结构,不备份表内的信息
(5)恢复表的操作
恢复表时,同样可以使用 source 命令 和 mysql 命令 进行,操作与恢复库的操作相同;
需要注意的是:当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在。
三、MySQL 增量备份:
增量备份就是备份自上一次备份之后增加或变化的文件或者内容,必须先有完全备份才能进行增量备份。
使用 mysqldump 进行完全备份的存在的问题:
备份数据中有重复数据;
备份时间与恢复时间长;
(1)增量备份的特点:
没有重复数据,备份量不大,时间短;
恢复麻烦,需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复。
增量备份依赖二进制日志文件,首先需要开启二进制日志文件:
修改 my.cnf文件,添加:log-bin=mysql-bin
mysqladmin -uroot -pabc123 flush-logs
//刷新所有日志
(2)MySQL 数据库增量恢复方法:
1、例如,对数据库进行了以下操作:
insert into info (id,name,score) values (7,'wang',33);
//插入一条信息
delete from info where name='jack';
//删除一条信息;
insert into info (id,name,score) values (10,'qian',44);
//再插入一条信息
2、查看日志文件:
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002
方法一:一般恢复
命令:
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
方法二:基于位置恢复
将某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间实现数据的恢复。
1、恢复数据到指定的位置:
mysqlbinlog --no-defaults --stop-position='293' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p
2、从指定的位置开始恢复数据:
mysqlbinlog --no-defaults --start-position='396' /usr/local/mysql/data/mysql-bin.000005 | mysql -u root -p
方法三:基于时间点恢复
使用基于时间点的恢复,可能会出现在一个时间点里既同时存在正确的操作又存在错误的操作,所以我们需要一种更为精确的恢复方式。
1、从日志开头截止到某个时间点的恢复:
mysqlbinlog --no-defaults --stop-datetime='2020-01-14 17:56:36' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
2、从某个时间点到日志结尾的恢复:
mysqlbinlog --no-defaults --start-datetime='2020-01-14 17:57:03' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
3、从某个时间点到某个时间点的恢复: