目录
一、数据备份的重要性与分类
1、数据备份的重要性
2、从物理与逻辑的角度,备份分为
3、从数据库的备份策略角度,备份可分为
3.1 完全备份(只适合第一次)
3.2 差异备份(用的较少,有丢失数据的现象)
3.3 增量备份
3.4 备份方式比较
3.5 如何选择逻辑备份策略(频率)
4、常见的备份方法
4.1 物理冷备
4.2 专用备份工具mydump或mysqlhotcopy
4.3 启用二进制日志进行增量备份
4.4 第三方工具备份
5、mysql的一些配置
二、完全备份详解(只适合第一次)
1、完全备份的方式方法
2、完全备份的优点
3、完全备份的缺点
4、数据库完全备份分类
4.1 物理冷备份与恢复
4.2 mysqldump备份与恢复
三、MySQL完全备份与恢复
1、物理冷备份与恢复
1.1 前期准备
1.2 实际操作
2、mysqldump 备份(温备份)
2.1 前期准备
2.2 备份一个库实际操作
2.3 备份两个库实际操作
2.4 备份全部库实际操作
2.5 备份指定库中的部分表实际操作
2.6 备份指定库中的部分表的表结构实际操作
3、mysqldump 恢复(温备份)
3.1 创建备份(方法一)
3.2 模拟数据库出现问题(方法一)
3.3 恢复数据库(方法一)
3.4 创建备份(方法二)
3.5 模拟数据库出现问题(方法二)
3.6 恢复数据库(方法二)
四、MySQL 增量备份与恢复
1、二进制日志中需要关注的部分(恢复的方式)
2、实际操作
2.1 加混合模式
2.2 前期准备
2.3 备份
2.4 模拟数据库出现问题
2.5 恢复数据(第一种方式)
2.6 恢复数据(第二种方式)
3、断点恢复
3.1 添加数据
3.2 刷新日志
3.3 模拟数据库出现问题
3.6 查看000006中的数据,要恢复到数据9
3.7 恢复完全备份
3.8 恢复节点
4、基于时间点恢复
4.1 查看时间(恢复到数据10)
4.2 节点恢复
备份方式 | 完全备份 | 差异备份 | 增量备份 |
---|---|---|---|
完全备份时的状态 | 表1、表2 | 表1、表2 | 表1、表2 |
第1次添加内容 | 创建表3 | 创建表3 | 创建表3 |
备份内容 | 表1、表2、表3 | 表3 | 表3 |
第2次添加内容 | 创建表4 | 创建表4 | 创建表4 |
备份内容 | 表1、表2、表3、表4 | 表3、表4 | 表4 |
合理值区间***
一个处理 (NES) 提供额外空间给与mysql 服务器用
MySQL 的日志默认保存位置为 /usr/local/mysql/data
##配置文件
vim /etc/my.cnf
[mysqld]
##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名
##通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
##二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启 (实际并没有开启,需要在里面加入下列命令)
log-bin=mysql-bin
或
log_bin=mysql-bin
##中继日志
一般情况下它在Mysql主从同步(复制)、读写分离集群的从节点开启。主节点一般不需要这个日志
##慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便提醒优化,默认是关闭的(用索引来优化)
s1ow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 #设置超过5秒执行的语句被记录,缺省时为10秒
##复制段
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 #慢查询,设置为5s
systemctl restart mysqld #重启服务才能生效
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; #在数据库中设置开启慢查询的方法
PS:variables 表示变量 like 表示模糊查询
#xxx(字段)
xxx% 以xxx为开头的字段
%xxx 以xxx为结尾的字段
%xxx% 只要出现xxx字段的都会显示出来
xxx 精准查询
#二进制日志开启后,重启mysql 会在目录中查看到二进制日志
cd /usr/local/mysql/data
ls
mysql-bin.000001 #开启二进制日志时会产生一个索引文件及一个索引列表
索引文件:记录更新语句
索引文件刷新方式:
mysql-bin.index:
二进制日志文件的索引
配置mysql文件,配置完后一定要重启服务
查看通用查询日志是否开启
查看二进制日志是否开启
查看慢查询日功能是否开启
InnoDB 存储引擎的数据库在磁盘上存储成三个文件: db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)。
systemctl stop mysqld
yum -y install xz
#压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
mv /usr/local/mysql/data/ /opt/
#解压恢复
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/data/
cd /usr/local/mysql/data
mv /usr/local/mysql/data/* ./
创建几条数据
(1)、完全备份一个或多个完整的库 (包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
例:
mysqldump -u root -p --databases kgc > /opt/kgc.sql #备份一个kgc库
mysqldump -u root -p --databases mysql kgc > /opt/mysql-kgc.sql #备份mysql与 kgc两个库
(2)、完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql
(3)、完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
例:
mysqldump -u root -p [-d] kgc info1 info2 > /opt/kgc_info1.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d"选项,说明表数据也进行备份
#做为一个表结构模板
(4)查看备份文件
grep -v "^--" /opt/kgc_info1.sql | grep -v "^/" | grep -v "^$"
#过滤出以--开头的 以/开头的 非空行
PS:mysqldump 严格来说属于温备份,会需要对表进行写入的锁定
在全量备份与恢复实验中,假设现有qsh库,qsh库中有一个ll表,需要注意的一点为:
① 当备份时加 --databases ,表示针对于qsh库
#备份命令
mysqldump -uroot -p123456 --databases qsh > /opt/qsh.sql 备份库后
#恢复命令过程为:
mysql -uroot -p123456
drop database qsh;
exit
mysql -uroot -p123456 < /opt/qsh.sql
② 当备份时不加 --databases,表示针对qsh库下的所有表
#备份命令
mysqldump -uroot -p123456 qsh > /opt/qsh_all.sql
#恢复过程:
mysql -uroot -p123456
drop database qsh;
create database qsh;
exit
mysql -uroot -p123456 qsh < /opt/qsh_all.sql
1.开启二进制日志功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1 #可加可不加该命令
#二进制日志(binlog)有3种不同的记录格式: STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
第一种方式 STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率底
第二种方式 ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大
总结:update、delete以多行数据起作用,来用行记录下来,
只记录变动的记录,不记录sql的上下文环境,
比如sql语句记录一行,但是ROW就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低 比较大所以记录都记下来,
③ MIXED 推荐使用
一般的语句使用statement,函数使用ROW方式存储。
systemctl restart mysqld
查看二进制日志文件的内容
cp /usr/local/mysql/data/mysql-bin.000002 /opt/
① mysqlbinlog --no-defaults /opt/mysql-bin.000002
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容
#--no-defaults : 默认字符集(不加会报UTF-8的错误)
PS: 可以将解码后的文件导出为txt格式,方便查阅
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/mysql-bin.000002
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED 指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1