目录
2、专用备份工具mysqldump或者mysqlhotcopy
一.MySQL日志管理
MySQL 的日志默认保存位置为**/usr/local/mysql/data**
MySQL 的日志配置文件为/etc/my.cnf,里面有个**[mysqld]**项。
1.日志的分类
1.1 错误日志
用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
vim /etc/my.cnf
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名
1.2 通用查询日志
用来记录MySQL的所有连接和语句,默认是关闭的
vim /etc/my.cnf
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
1.3 二进制日志
用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
vim /etc/my.cnf
log-bin=mysql-bin
或
log_bin=mysql-bin
1.4 中继日志
一般情况下它在Mysql主从同步(复制)、读写分离集群的节点开始。主节点一般不需要这个日志。
1.5 慢查询日志
用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
vim /etc/my.cnf
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
1.6 配置日志
1. #修改my.cnf配置文件
vim /etc/my.cnf
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
2. #重新mysql服务
systemctl restart mysqld.service
3.日志的查询
mysql -u root -p[密码]
查看通用查询日志是否开启
show variables like 'general%';
查看二进制日志是否开启
show variables like 'log_bin%';
查看慢查询日功能是否开启
show variables like '%slow%';
查看慢查询时间设置
show variables like 'long_query_time';
在数据库中设置开启慢查询的方法
set global slow_query_log=ON;
二.数据备份的重要性
运维工作就两件事:第一个是保护公司的数据,第二个是网站7*24小时提供服务。
那么,对数据丢失一部分和网站7*24小时提供服务哪个更重要呢?
我们知道都很重要,只是说相比哪个更重要?
这个具体要看业务和公司。
例如:银行,金融行业,数据是最重要的,一条都不能丢,可能宕机停机影响就没那么大。
再例如:百度搜索,腾讯QQ聊天记录丢失了几万条数据,都不算啥。
对于数据来讲,数据最核心的就是数据库数据,当然也包括其他数据,本章主要讲解的是数据库的数据。
对于绝大多数企业来说,失去数据就数去商机,失去产品,失去客户,公司倒闭……,因此,数据库的备份与恢复就显得十分重要了。
三.MySQL备份呢类型
按照备份时对数据库的影响范围分为:
Hot backup(热备) Cold Backup(冷备)Warm Backup(温备)
1.Hot backup:
指在数据库运行中直接备份,对正在运行的数据库没有任何影响。(Online Backup),官方手册称为在线备份。(备份的同时,业务不受影响)
1.1热备份的优点:
1.可在表空间或数据文件级备份,备份时间短。
2.备份时数据库仍可使用。
3.可达到秒级恢复(恢复到某一时间点上)。
4.可对几乎所有数据库实体作恢复。
5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
1.2. 热备份的缺点:
1.不能出错,否则后果严重。
2.若热备份不成功,所得结果不可用于时间点的恢复。
3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”
2.Cold Backup:
指在数据库停止的情况下进行备份(Offline Backup) ,官方手册称为离线备份。(需要关mysql服务,读写请求均不允许状态下进行)
2.1冷备份的优点:
1.是非常快速的备份方法(只需拷贝文件)
2.容易归档(简单拷贝即可)
3.容易恢复到某个时间点上(只需将文件再拷贝回去)
4.能与归档方法相结合,作数据库“最新状态”的恢复。
5.低度维护,高度安全。
2.2冷备份的缺点:
1.单独使用时,只能提供到“某一时间点上”的恢复。
2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
4.不能按表或按用户恢复。
值得注意的是冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的 。而且在恢复后一定要把数据库文件的属组和属主改为mysql。
3.Warm Backup:
备份同样在数据库运行时进行,但仅支持读请求,不允许写请求;例如,加一个读锁以保证备份数据的一致性。(服务在线,但仅支持读请求,不允许写请求)
4. 逻辑备份
1.逻辑备份是对数据库逻辑组件的备份,表示为逻辑数据库结构
2.这种类型的备份适用于可以编辑书库值或表结构
四.备份策略
从数据库的备份策略角度来看,备份又可分为完全备份、差异备份和增量备份。
1、完全备份
每次对数据进行完整备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长。
每次都进行完全备份,会导致备份文件占用空间巨大,并且有大量的重复数据,恢复时,直接使用完全备份的文件即可。
完全备份是对整个数据库、数据库结构和文件结构的备份。
保存的是备份完成时刻的数据库。
是差异备份与增量备份的基础。
相当于基石。
优点:
备份与恢复操作简单方便
缺点:
数据存在大量的重复
占用大量的备份空间
备份与恢复时间长
2、差异备份
备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。恢复数据时只需要恢复上次的完全备份与最佳的一次差异备份。
每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全备份的数据,再恢复差异备份的数据。
3、增量备份
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份以上次完整备份或上次增量备份的时间为时间点,仅备份期间内的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份开始到最后一次增量备份之间的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失
每次增量备份都是在备份在上一次完全备份或者增量备份之后的数据,不会出现重复数据的情况,也不会占用额外的磁盘空间。
恢复数据,需要按照次序恢复完全备份和增量备份的数据
4、如何选择逻辑备份策略
合理值区间
一周一次的全备,全备的时间需要在不提供业务的时间区间进行,22点到5点之间进行全备
增量:3天/2天/1天一次增量备份
差异:选择特定的场景进行备份
一个处理(NFS)提供额外空间给mysql服务器用
五、常见的备份方法
1、物理冷备
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的
关闭MySQL数据库
使用tar命令直接打包数据库文件夹
直接替换现有的MySQL目录即可
2、专用备份工具mysqldump或者mysqlhotcopy
2.1 mysqldump工具
mysqldump常用的逻辑备份工具
MySQL自带的备份工具,可实现对MySQL的备份
可以将指定的库、表导出为SQL脚本
使用命令mysql导入备份的数据
2.2 mysqlhotcopy工具
mysqlhotcopy仅拥有备份myisam和archive表
3、启动二进制日志进行增量备份
进行增量备份,需要刷新二进制日志
MySQL支持增量备份,进行增量备份时必须启用二进制日志,二进制日志文件为用户提供复制对执行备份点后进行的数据库更改所需的信息进行恢复,如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。
4、第三方工具备份
免费的MySQL热备份软件Percona XtraBackup
六.MySQL完全备份与恢复
1.物理冷备与恢复
物理冷备份—》关闭mysqld服务----》tar命令打包data目录(恢复就是解压他的tar包即可)
关闭数据库,下载xz
systemctl stop mysqld
yum -y install xz
压缩备份
解压恢复
2、mysqldump备份与恢复
create table class (id int(4),name char(10),age int(2),sex char(4));
insert into class values(1,'lnj',21,'男');
insert into class values(2,'yuzhen',23,'男');
2.1完全备份一个或多个完整的库
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
mysqldump -uroot -p123456 --databases school > /opt/SCHOOL.sql #备份一个school数据库
mysqldump -uroot -p123456 --databases sky school > /opt/sky-school.sql #备份sky和school两个库
2.2完全备份MySQL服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
mysqldump -u root -p123456 --all-databases > /opt/all.sql
2.3完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
mysqldump -uroot -p123456 [-d] school class > /opt/school_class.sql
#不使用“-d”选项,说明表数据也进行备份
#使用“-d”选项,说明只保存数据库的表结构
mysqldump -uroot -p123456 [-d] lnj class > /opt/school_class.sql
#不使用“-d”选项,说明表数据也进行备份
#使用“-d”选项,说明只保存数据库的表结构
使用-d选项,说明只保存数据库的表结构
2.4查看备份文件
grep -v "^--" /opt/school_class.sql | grep -v "^/" | grep -v "^$"
3.MySQL完全恢复
3.1 恢复数据库
使用mysqldump导出的文件,可使用导入的方法
source命令
mysql命令
使用source恢复数据库的步骤
登录到MySQL数据库
执行source备份sql脚本的路径
mysql -uroot -p123456 -e 'drop database lnj;'
mysql -uroot -p123456 -e 'show databases;'
mysql -uroot -p123456 < /opt/all.sql
mysql -uroot -p123456 -e 'show databases;'
3.2恢复数据表
mysqldump -uroot -p123456 school lcdb > /opt/lcdb.sql
grep -v "^--" /opt/lcdb.sql | grep -v "^/" | grep -v "^$"
mysql -uroot -p123456 -e 'drop table lnj lnj;'
mysql -uroot -p123456
source /opt/lcdb.sql
select * from lcdb;
show tables;
方法一
方法二
已经恢复
3.3 加–databases和不加的区别
mysqldump 严格来说属于温备份,会需要对表进行写入的锁定
在全量备份与恢复实验中,假设现有school库,school库中有一个lcdb表,需要注意的一点为:
当备份时加–databases ,表示针对于school库
备份命令
mysqldump -uroot -p123456 --databases lnj > /opt/lnj_01.sql
mysql -uroot -p123456
drop database lnj;
exit
mysql -uroot -p123456 < /opt/school_01.sql
当备份时不加–databases,表示针对school库下的所有表
mysqldump -uroot -p123456 lnj > /opt/school_all.sql
mysql -uroot -p123456 -e 'drop database school;'
mysql -uroot -p123456 < /opt/school_all.sql
备份时不加—databases,表示针对lnj库下所有表,不包含lnj库所以当删除库的时候,恢复数据会报错,提示没有该数据库
mysql -uroot -p123456 -e 'create database lnj;'
mysql -uroot -p123456 lnj < /opt/school_all.sql
mysql -uroot -p123456 -e 'use school;show tables;'
七.MySQL增量备份与恢复
1、开启二进制日志功能
vim /etc/my.conf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
server-id = 1
systemctl restart mysqld
STATEMENT(基于sQL语句):
每一条涉及到被修改的sql都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-definedfuctions ( udf) 、垂从复制等架构记录日志时会出现问题
总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率低
ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update… …set… . .where true那么binlog的数据量会越来越大
总结: update、 delete以多行数据起作用,来用行记录下来,只记录变动的记录,不记录sql的上下文环境,比如sql语句记录一行,但是Row就可能记录10行,但是准确性高,高并发的时候由于操作量能变低比较大所以记录都记下来。
2、二进制日志读取
二进制文件无法直接编辑查看,需要对其进行转换
mysqlbinlog --no-defaults 二进制日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制日志文件
#--base64-output=decode-rows 使用64位编码机制去解码;decode按行读取rows
#-v 显示详细内容
#--no-defaults 默认字符集(不加会报UTF-8错误)
#将解码后的文件导出为txt文件,重定向输出
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制日志文件 > 文件.txt
#刷新日志文件
mysqladmin -uroot -p flush-logs
at :开始的位置点
end_log_pos:结束的位置
时间戳: 210712 11:50:30
SQL语句
3、一般恢复
mysqldump -uroot -p123456 lnj lnj > /opt/sky_lnj3.sql
mysql -uroot -p123456 -e 'drop table lnj.lnj;'
mysql -uroot -p123456 -e 'use lnj;show tables;'
4、节点恢复
数据库在某一时间点可能既有错误的操作也有正确的操作,可以基于精准的位置跳过错误的操作
发生错误节点指点的上一个节点,上一次正确操作的位置点停止
模拟节点恢复,刷新日志,生成新的日志文件