目录
2.4.2 mysqldump或mysqlhotcopy工具备份
一、MySQL的日志管理
保存的位置:/usr/local/mysql/data
如何去开启MySQL的日志:通过修改配置文件、通过命令(临时的)
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######开启后重启服务在data目录中就会看到二进制日志
cd /usr/local/mysql/data
ls
mysql-bin.000001 ###开启二进制日志时会产生一个索引文件及一个索引列表
索引文件:记录更新语句
索引文件刷新方式:
1. 重启mysql 的时候会更新索引文件,用于记录新的更新语句
2. 刷新二进制日志
mysql-bin.index : 二进制日志文件的索引
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 ###设置超过5秒执行的语句被记录,缺省值为10秒
1.6 在MySQL中查询日志是否开启
#登入mysql
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;
二、MySQL的备份和恢复
2.1 为什么要去数据备份
-
备份的主要目的是灾难恢复
-
在生产环境中,数据的安全性至关重要
-
任何数据的丢失都可能产生严重的后果
2.2 数据丢失的原因
-
程序错误
-
人为操作错误.
-
运算错误
-
磁盘故障
-
灾难(如火灾、地震)和盗窃
2.3 数据备份的分类
2.3.1 以物理和逻辑的角度去区分
①物理备份
对数据库操作系统的物理文件(数据文件、日志文件等)的备份
方法:
冷备份(脱机备份):是在关闭数据库的时候进行的
热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件去备份恢复
温备份:数据库锁定表格(不可以写入但是可以读)的状态下进行备份
②逻辑备份
对数据库逻辑组件(表等数据库对象)的备份,表示为逻辑数据库结构和内容的信息。
这种类型的备份适用于表结构较小的数据量
总结:备份和恢复数据的操作简单、速度快
2.3.2 以数据库的备份策略角度区分
①完全备份:对数据库进行完整的备份
-
是对整个数据库、数据库结构和文件结构的备份
-
保存的是备份完成时刻的数据库
-
是差异备份与增量备份的基础
优势就是备份和恢复操作简单
缺点就是数据存在的大量空间,恢复时间长
②差异备份
备份自从上次完全备份之后被修改过的文件,备份的时间节点是从上次完整备份起
总结:每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全备份的数据,在恢复差异备份的数据。
③增量备份
只有在上次完全备份或着增量备份后修改的文件才会被备份
一上次完整备份或上次增量备份的时间为时间点,仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份开始到最后一次增量备份之的所有增量一次恢复,如果中间某次的备份数据损坏,将导致数据的丢失。
2.4 常见的备份方法
2.4.1物理冷备
备份时数据库处于关闭的状态,直接打爆数据库的文件tar
备份数据快,恢复也快
2.4.2 mysqldump或mysqlhotcopy工具备份
mysqldump 常用的逻辑备份工具
mysqlhotcopy 仅拥有备份 MyISM 和 ARCHIVE 表
2.4.3 二进制日志进行增量备份
进行备份的时候要去刷新日志才行
三、完全备份
3.1 概念
- 是对整个数据库,数据库结构和文件结构的备份
- 保存的是备份完成时刻的数据库
- 是差异备份与增量备份的基础
优点:备份和恢复数据简单方便
缺点:数据存在大量的重复,占用了空间,恢复的时间长
3.2 数据库的完全备份分类
3.2.1 物理冷备备份
①查看备份前表内的数据
②备份
[root@Zhang data]# systemctl stop mysqld.service
[root@Zhang data]# cd /usr/local/mysql/
[root@Zhang mysql]# tar zcvf /opt/mysql.all.$(date +%F).tar.gz data/ 打包备份
③测试删除表
#登录mysql,删除school库
systemctl start mysqld.service
mysql -u root -p123123drop table beifen;
3. #解压之前备份的数据库data目录,不用删除原目录,会自动替换
cd /opt
ls
cd /usr/local/mysql
tar Jxvf /opt/mysql_all_2021-11-28.tar.xz -C ./
4. #重启服务查看被删除的库
注意:不一定是必须去打包data,因为采用打包的方法能够更加的快速并且占用的空间也较小
3.2.2 mysqldump 备份(温备份)
①备份库
#导出的就是数据库脚本文件
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sqlmysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql 表示备份所有库
②备份表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
③查看备份的文件
cat mysql.table.beifen | grep -v '^/' | grep -v '^$' | grep -v '^-'
3.3 MySQL的完全恢复
3.3.1 当备份时,加--databases
备份时:mysqldump -uroot -p123456 --databases 库名 >/opt/库名.sql
恢复时:mysql -uroot -p123456 库名 < /opt/库名.sql
3.3.2 恢复数据库
mysqldump -uroot -p --databases wanquan > /opt/wanquan.sql
mysql -uroot -p123456 < /opt/wanquan.sql
mysql -uroot -p123456 -e 'show databases;'
3.3.3 恢复数据表
mysqldump -uroot -p123456 wanquan bei > /opt/wanquan.bei.sql 备份
mysql -uroot -p123456 -e 'drop table wanquan.bei' 删除表
mysql -uroot -p123456 wanquan < /opt/wanquan.bei.sql 恢复
mysql -uroot -p123456 -e 'show table wanquan' 再去查看表
3.4 拓展
在生产环境下我们要使用shell脚本去定时备份
0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123456 库名 表名 >
./库名_表名_$(date +%Y%m%d).sql; /usr/local/mysql/bin/mysqladmin -uroot -p flush-logs
四、MySQL的增量备份与恢复
4.1 增量备份
4.1.1开启二进制日志功能
vim /etc/my.conf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
#可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1
systemctl restate mysqld
4.1.2 二进制日志的三种记录格式
STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
STATEMENT(基于SQL语句)
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大
MIXED 推荐使用
一般的语句使用statement,函数使用ROW方式存储。
4.1.3 查看二进制日志文件的内容
当我开启日志备份的时候,重启服务后 在/usr/local/msql/data下就会生成mysql-bin.000001 的文件
每次修改数据库内容后去刷新也会生成新的文件
cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
--base64-output=decode-rows:使用64为编码机制去解码(decode)并按行读取(rows)
-v :显示详细内容
--no-defaults :默认字符集(不加会报错)
4.2 MySQL的增量备份实例
4.2.1 一般增量备份
对指定的表进行完全备份
mysqldump -uroot -p123456 zenli zz > /opt/zenli.zz.sql.$(date +%F)
进行增量的备份生成新的二进制日志文件
mysqladmin -uroot -p123456 flush-logs
ls /usr/localmysql/data
模拟在表中插入数据
再去刷新日志
① 测试删除表之后再去恢复
②测试删除库去恢复
查看日志文件
然后去恢复删除的库
4.2.2 节点备份
模拟插入数据
由于你插入了数据所以你所有操作的命令将会存放到最新的日志文件中
把日志文件拷贝到opt下
删除数据
再去刷新日志文件
mysqladmin -uroot -p123456 flush-logs
去找到插入数据时候的日志文件(也就是刷新新的日志前的那个插入数据的日志000015)
mysqlbinlog --no-defaults --base64-output=decede-rows -v /usr/local/mysql/data/mysql-bin.000015
按照日志去恢复数据
mysqlbinlog --no-defaults --stop-position='3090' /opt/mysql-bin.000015 | mysql -uroot -p123456
因为你想要恢复的数据是id=3的数据所以你的时间节点就要找到插入id=4之前的节点也就是3090的节点
最后可以去验证结果
4.2.3 基于时间恢复
首先去模拟删除数据
查看日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000016
利用时间去恢复数据
mysqlbinlog --no-defaults --stop-datetime='2022-06-24 17:17:37' /usr/local/mysql/data/mysql-bin.000016 | mysql -uroot -p123456
最后去验证结果
总结
MySQL数据库需要去备份数据才能保障数据不会丢失
1.冷备份(需要关闭数据库,一般用不到)
2.温备份,完全备份有助于数据能够去恢复
基于节点和基于时间的恢复