一、MySQL日志管理
MySQL的日志默认保存位置为 /usr/local/mysql/data/
在/etc/my.cnf配置文件中的 [mysqld] 中进行日志的路径配置
1、错误日志
#用于记录 mysql 启动、停止或运行时产生的错误信息,默认已开启
log-error=/usr/local/mysql/data/mysql_error.log(指定日志的保存位置和文件名)
2、通用查询日志
#用来记录mysql的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXQMT4WA-1638186800946)(https://i.loli.net/2021/11/29/nfzN9Xg78BstW3Q.png)]
3、二进制日志(binlog)
#二进制日志,用来记录所有更新的数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认开启
log-bin=mysql-bin 或者 log_bin=mysql-bin
4、慢查询日志
#慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log (指定文件路径和名称)
long_query_time=5 (设置执行超过5秒的语句会被记录,缺省时默认为10秒)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-emWdE2c2-1638186800950)(https://i.loli.net/2021/11/29/W6I7DOZldpAr8f4.png)]
5、查询日志状态
(1)查看通用日志是否开启
show variables like 'general%';
(2)查看二进制日志是否开启
show variables like 'log_bin%';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ubsvzyr8-1638186800951)(https://i.loli.net/2021/11/29/aFtSnpDrOsf6ZIy.png)]
(3)查看慢查询日志功能是否开启
show variables like '%slow%';
(4)查看慢查询时间设置
show variables like 'long_query_time';
(5)在数据库中设置开启慢查询的办法(临时)
set global slow_query_log=ON;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O3jXDgsB-1638186800953)(https://i.loli.net/2021/11/29/PkyCbBcFo28WAOH.png)]
二、备份与恢复
1、备份的重要性
(1)备份的主要目的是灾难恢复
(2)在生产环境中,数据的安全性至关重要
(3)任何数据的丢失都可能产生严重的后果
(4)通常情况下,造成数据丢失的原因有一下几种:
• 程序错误
• 人为操作错误
• 运算错误
• 磁盘故障
• 灾难(火灾、地震、盗窃等)
2、 备份类型
(1)从物理与逻辑的角度分类(逻辑备份、物理备份)
• 数据库备份可以分为物理备份和逻辑备份
• 逻辑备份是对数据库逻辑组件(如表等数据库对象)的备份
• 逻辑备份适用于可以编辑数据值或表结构较小的数据量,或者在不同的机器体系结构上重新创建数据
• 物理备份是对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
• 物理备份适用于在出现问题时需要快速恢复的大型重要数据库
• 物理备份又可以分为冷备份(脱机备份)、热备份(联机备份)和温备。
1)冷备份:在数据库关闭状态下进行备份操作(tar)
2)热备份:在数据库处于运行状态时进行备份操作,该备份方法依赖数据库的日志文件(mysqldump)
3)温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。
(2)从数据库的备份策略角度分类(完全备份、差异备份、增量备份)
完全备份:
• 每次对数据进行完整的备份,即对整个数据库、数据库结构和文件结构的备份,是差异备份与增量备份的基础,保存的是备份完成时刻的数据库
• 完全备份恢复数据时直接使用完全备份的文件即可,备份与恢复操作简单
• 每次完全备份后会导致备份文件存在大量的重复,并且会占用大量的磁盘空间,备份与恢复的时间也很长
差异备份:
• 每次差异备份都会备份上一次完全备份之后的数据,可能出现备份数据重复,导致占用额外的磁盘空间
• 恢复数据时,先恢复上次的完全备份,再恢复最近的一次差异备份
增量备份:
• 只有那些在上次完全备份或者增量备份后被修改的文件才会被备份,不会出现重复数据的情况,也不占用额外的磁盘空间
• 备份的数据量小,占用空间小,备份速度快但
• 恢复时,需要从上一次的完整备份开始到最后一次增量备份之的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失
3、备份方法
数据库的备份可以采用很多种方式,如直接打包数据库文件(物理冷备份)、专用备份工具(mysqldump)、二进制日志增量备份、第三方工具备份等
(1)物理冷备份
• 物理冷备份时需要在数据库处于关闭状态下,能够较好地保证数据库的完整性
• 使用tar命令直接打包数据库文件夹(/usr/local/mysql/data)来实现备份,直接替换现有mysql目录即可
• 速度快,恢复时也是最为简单,一般用于非核心业务,这类业务一般都允许中断
(2)专用备份工具mysqldump或mysqlhotcopy
• mysqldump工具和mysqlhotcopy都可以做备份
• mysqlhotcopy仅适用于某些存储引擎(MyISAM和ARCHIVE)
(3)通过启用二进制日志进行增量备份
如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改) ,需要刷新二进制日志
(4)通过第三方工具备份
第三方工具Percona xtraBackup是一个免费的MysQL热备份软件
三、完全备份与恢复操作
1、创建表结构、表数据
use jc;
create table if not exists test1 (
id int(4) not null auto_increment,
name varchar(10) not null,
primary key (id));
insert into test1 values(1,'zhangsan');
insert into test1 values(2,'lisi');insert into test1 values(3,'wangwu');
2、完全备份
InnoDB存储引擎的数据库在磁盘上存储成三个文件:db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)
3、物理冷备份与恢复
systemctl stop mysqld
yum -y install xz # xz为一种压缩工具
压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
解压恢复
tar Jxvf /opt/mysql_all_2021-08-31.tar.xz -C /usr/local/mysql/data/
删除jc数据库
恢复数据库
4、mysqldump备份与恢复
(1)完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -uroot -p[密码] --databases 库名 > /备份路径/备份文件名.sql
导出的就是数据库脚本文件
如:
mysqldump -uroot -p112233 --databases jc > /opt/backup/jc.sql
(2)备份所有的库
mysqldump -uroot -p[密码] --all-databases > /备份路径/备份文件名.sql
如:
mysqldump -uroot -p[密码] --all-databases > /备份路径/all.sql
(3)完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
如:
mysqldump -uroot -p112233 [-d] jc test1 > /opt/backup/jc_test1.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d”选项,说明表数据也进行备份
(4)查看备份文件
grep -v "^--" /opt/gxd-gxd03.sql | grep -v "^/" | grep -v "^$"
5、完全恢复
(1)恢复库
先删除库
mysql -uroot -p112233 -e 'drop database jc;'
#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
查看库
mysql -uroot -p112233 -e 'show databases;'
进行恢复操作
mysql -uroot -p112233 < /opt/backup/jc.sql
mysql -uroot -p112233 -e 'show databases;'
(2)恢复表
先删除表
mysql -uroot -p112233 -e 'drop table jc.test1;'
查看库中的表
mysql -uroot -p112233 -e 'show tables from jc;'
进行恢复操作
mysql -uroot -p112233 jc < /opt/jc-test1.sql
mysql -uroot -p112233 -e 'show tables from jc;'
四、增量备份和恢复
1、增量备份需要开启二进制日志功能
systemctl stop mysqld
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED (可选项)
server-id = 1#二进制日志(binlog)有三种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认是STATEMENT格式
systemctl restart mysqldls -l /usr/local/mysql/data/mysql-bin.*
日志格式 | 说明 |
---|---|
STATEMENT(基于sql语句,默认) | 每一条涉及到被修改的 sql 都会记录在binlog中。日志量过大,如函数、主从复制等构架记录日志时会出现问题 |
ROW(基于行) | 只记录变动的记录,不记录sql的上下文。如果遇到 updata…set…where true,那么日志数据量就会很大 |
MIXED(混合模式) | 一般语句使用 STATEMENT,函数使用ROW。推荐使用 |
2、可每天进行增量备份操作,生成新的二进制文件(如mysql-bin.000002)
先完成完全备份(在创建好表和库的基础上)
mysqldump -uroot -p112233 jc test1 > /opt/backup/jc_test1-$(date +%F).sql
生成新的二进制文件(可每天进行增量备份操作)
mysqladmin -uroot -p112233 flush-logs
3、进行简单的数据插入,并增量备份
use jc;
insert into test1 values(3,'zhaoliu');
select * from test1;
4、查看新生成的日志内容
cp /usr/local/mysql/data/mysql-bin.000004 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容
注:这边我们解析的bin.000004,因为05才是新添加备份数据的文件,06是刷新后的新文件,是个空文件
5、模拟丢失数据,并进行恢复
(1)模拟丢失更改的数据并恢复
#模拟删除
use jc;
delete from test1 where id=4;
exit;
#模拟恢复
mysql -uroot -p112233 -e 'select * from jc.test1;'
mysqlbinlog --no-defaults /opt/mysql-bin.000004 | mysql -uroot -p112233
mysql -uroot -p112233 -e 'select * from jc.test1;'
(2)模拟丢失所有数据并恢复
use jc;
drop table test1;
mysql -uroot -p112233 jc < /opt/backuo/jc-2021-08-31.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p112233
mysql -uroot -p112233 -e 'select * from jc.test1;'
6、断点恢复
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql—bin.000005
# at 3797
#210905 17:35:29 server id 1 end_log_pos 3903 CRC32 0x548d1781 Query thread_id=24 exec_time=0 error_code=0
SET TIMESTAMP=1630834529/!/;
insert into test1 values(5,‘tianqi’)
#插入了用户为5的数据
# at 4074
#210905 17:36:06 server id 1 end_log_pos 4180 CRC32 0x7b7f03b0 Query thread_id=24 exec_time=0 error_code=0
SET TIMESTAMP=1630834566/!/;
insert into test1 values(6,‘zhouji’)
#插入了用户为6的数据删除id=5/6的数据use jc; delete from test1 where id=5; delete from test1 where id=6;exit;
(1)基于位置恢复
#仅恢复到操作ID为4074之前的数据,即不恢复用户6的数据mysql -uroot -p112233 -e 'select * from jc.test1;'
mysqlbinlog --no-defaults --stop-position='4074' /opt/mysql—bin.000005 | mysql -uroot -p112233
#仅恢复用户6的数据,跳过用户5的数据恢复
mysqlbinlog --no-defaults --start-position='4079' /opt/mysql—bin.000005 | mysql -uroot -p112233
(2)基于时间点恢复
#仅恢复到17:36:06之前的数据,即不恢复用户4的数据
mysqlbinlog --no-defaults --stop-datetime='2021-09-05 17:36:06' /opt/mysql—bin.000005 | mysql -uroot -p112233
#仅恢复到17:36:06之后的数据,即不恢复用户3的数据
mysqlbinlog --no-defaults --start-datetime='2021-09-05 17:36:06' /opt/mysql—bin.000005 | mysql -uroot -p112233