Mysql数据库—日志、备份与恢复

目录

一、mysql常用日志

1.1 概述

1.日志文件在数据库进行备份和恢复时起到了很重要的作用
2.常用的日志文件默认保存在mysql的工作目录下的data目录(/usr/local/mysql/data)目录下
3.可在/etc/my.cnf配置文件中的 [mysqld] 中进行日志的路径配置

1.1.1 错误日志

1.用于记录 mysql 启动、停止或运行时产生的错误信息
2.可通过一下字段进行更新: 
log-error=/usr/local/mysql/data/mysql_error.log(指定日志的保存位置和文件名)

1.1.2 通用查询日志

1.用来记录mysql的所有连接和语句,默认是关闭的
2.开启方式:
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

1.1.3 二进制日志(binlog)

1.二进制日志,用来记录所有更新的数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认开启
2.开启方式: 
log-bin=mysql-bin 或者 log_bin=mysql-bin

1.1.4 慢查询日志

1.慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化 
2.开启方式: 
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log (指定文件路径和名称)
long_query_time=5 (设置执行超过5秒的语句会被记录,缺省时默认为10秒)


1.2 查询日志状态

1.2.1 查看通用日志开启状态

show variables like 'general%';

1.2.2 查看二进制日志开启状态

show variables like 'log_bin%';

1.2.3 查看慢查询日志功能是否开启

show variables like '%slow%';

1.2.4 查看慢查询时间设置

show variables like 'long_query_time';

1.2.5 在数据库中设置开启慢查询的办法(临时)

set global slow_query_log=ON;

二、备份与恢复

2.1 概述

1.备份的主要目的是灾难恢复
2.在生产环境中,数据的安全性至关重要
3.任何数据的丢失都可能产生严重的后果
4.通常情况下,造成数据丢失的原因有一下几种:
1)程序错误
2)人为操作错误
3)运算错误
4)磁盘故障
5)灾难(火灾、地震、盗窃等)

2.2 备份类型

2.2.1 从物理与逻辑的角度分类(逻辑备份、物理备份)

1.数据库备份可以分为物理备份和逻辑备份
2.逻辑备份是对数据库逻辑组件(如表等数据库对象)的备份
3.逻辑备份适用于可以编辑数据值或表结构较小的数据量,或者在不同的机器体系结构上重新创建数据
4.物理备份是对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
5.物理备份适用于在出现问题时需要快速恢复的大型重要数据库
6.物理备份又可以分为冷备份(脱机备份)、热备份(联机备份)和温备。
1)冷备份:在数据库关闭状态下进行备份操作(tar)
2)热备份:在数据库处于运行状态时进行备份操作,该备份方法依赖数据库的日志文件(mysqldump)
3)温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。

2.2.2 从数据库的备份策略角度分类(完全备份、差异备份、增量备份)

1.完全备份:
1)每次对数据进行完整的备份,即对整个数据库、数据库结构和文件结构的备份,是差异备份与增量备份的基础,保存的是备份完成时刻的数据库
2)完全备份恢复数据时直接使用完全备份的文件即可,备份与恢复操作简单
3)每次完全备份后会导致备份文件存在大量的重复,并且会占用大量的磁盘空间,备份与恢复的时间也很长
2.差异备份:
1)每次差异备份都会备份上一次完全备份之后的数据,可能出现备份数据重复,导致占用额外的磁盘空间
2)恢复数据时,先恢复上次的完全备份,再恢复最近的一次差异备份
3.增量备份:
1)只有那些在上次完全备份或者增量备份后被修改的文件才会被备份,不会出现重复数据的情况,也不占用额外的磁盘空间
2)备份的数据量小,占用空间小,备份速度快但
3)恢复时,需要从上一次的完整备份开始到最后一次增量备份之的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失

2.3 备份方法

数据库的备份可以采用很多种方式,如直接打包数据库文件(物理冷备份)、专用备份工具(mysqldump)、二进制日志增量备份、第三方工具备份等

2.3.1 物理冷备份

1.物理冷备份时需要在数据库处于关闭状态下,能够较好地保证数据库的完整性
2.使用tar命令直接打包数据库文件夹(/usr/local/mysql/data)来实现备份,直接替换现有mysql目录即可
3.速度快,恢复时也是最为简单,一般用于非核心业务,这类业务一般都允许中断

2.3.2 专用备份工具mysqldump或mysqlhotcopy

1.mysqldump工具和mysqlhotcopy都可以做备份
2.mysqlhotcopy仅适用于某些存储引擎(MyISAM和ARCHIVE)

2.3.3 通过启用二进制日志进行增量备份

如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改) ,需要刷新二进制日志

2.3.4 通过第三方工具备份

第三方工具Percona xtraBackup是一个免费的MysQL热备份软件

2.4 完全备份/恢复操作

2.4.1 创建表结构、表数据

use gxd;
create table if not exists gxd03 (
id int(4) not null auto_increment,
name varchar(10) not null,
primary key (id));

insert into gxd03 values(1,'zhangsan');
insert into gxd03 values(2,'lisi');

2.4.2 完全备份

InnoDB存储引擎的数据库在磁盘上存储成三个文件:db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)

1)物理冷备份与恢复

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/

2)mysqldump备份与恢复

1.完全备份一个或多个完整的库(包括其中所有的表)

mysqldump -uroot -p[密码] --databases 库名 > /备份路径/备份文件名.sql
导出的就是数据库脚本文件 
 
如:
mysqldump -uroot -p264196 --databases gxd > /opt/gxd.sql
mysqldump -uroot -p264196 --databases gxd gxd03 > /opt/gxd-gxd03.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 -p264196 [-d] gxd gxd03 > /opt/gxd-gxd03.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d”选项,说明表数据也进行备份



4.查看备份文件

grep -v "^--" /opt/gxd-gxd03.sql | grep -v "^/" | grep -v "^$"

2.4.3 完全恢复

1) 恢复库

先删除库
mysql -uroot -p264196 -e 'drop database gxd;'
#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出

查看库
mysql -uroot -p264196 -e 'show databases;'

进行恢复操作
mysql -uroot -p264196 < /opt/gxd.sql
mysql -uroot -p264196 -e 'show databases;'

2)恢复表

先删除表
mysql -uroot -p264196 -e 'drop table gxd.gxd03;'

查看库中的表
mysql -uroot -p264196 -e 'show tables from gxd;'

进行恢复操作
mysql -uroot -p264196 gxd < /opt/gxd-gxd03.sql
mysql -uroot -p264196 -e 'show tables from gxd;'


2.5 增量备份和恢复

2.5.1 增量备份需要开启二进制日志功能

systemctl stop mysqld
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED	(可选项)		
server-id = 1
systemctl restart mysqld

日志格式 说明
STATEMENT(基于sql语句,默认) 每一条涉及到被修改的 sql 都会记录在binlog中。日志量过大,如函数、主从复制等构架记录日志时会出现问题
ROW(基于行) 只记录变动的记录,不记录sql的上下文。如果遇到 updata…set…where true,那么日志数据量就会很大
MIXED(混合模式) 一般语句使用 STATEMENT,函数使用ROW。推荐使用

2.5.2 可每天进行增量备份操作,生成新的二进制文件(如mysql-bin.000002)

先完成完全备份(在创建好表和库的基础上)
mysqldump -uroot -p264196 gxd gxd03 > /opt/gxd-gxd03-$(date +%F).sql
mysqldump -uroot -p264196 --all-databases gxd > /opt/gxd-$(date +%F).sql

生成新的二进制文件(可每天进行增量备份操作)
mysqladmin -uroot -p264196 flush-logs


2.5.3 进行简单的数据插入,并增量备份

use gxd;
insert into gxd03 values(3,'wangwu');
insert into gxd03 values (4,'zhaoliu');
select * from gxd03;


2.5.4 查看新生成的日志内容

cp /usr/local/mysql/data/mysql-bin.000005 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000005
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容
注:这边我们解析的bin.000005,因为05才是新添加备份数据的文件,06是刷新后的新文件,是个空文件

2.5.5 模拟丢失数据,并进行恢复(一般恢复)

1)模拟丢失更改的数据并恢复(一般恢复)

#模拟删除
use gxd;
delete from gxd03 where id=3;
delete from gxd03 where id=4;
exit;

#模拟恢复
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p264196
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'

2)模拟丢失所有数据并恢复(一般恢复)

use gxd;
drop table gxd03;

mysql -uroot -p264196 gxd < /opt/gxd-2021-08-31.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p264196
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'

2.5.6 断点恢复

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000005

# at 296
#210901 14:35:01 server id 1  end_log_pos 404 CRC32 0x26c85983 Query	thread_id=4	exec_time=0	error_code=0
use `gxd`/*!*/;
SET TIMESTAMP=1630478101/*!*/;
insert into gxd03 values(3,'wangwu')

# at 577
#210901 14:35:09 server id 1  end_log_pos 686 CRC32 0x8b913da9 Query	thread_id=4	exec_time=0	error_code=0
SET TIMESTAMP=1630478109/*!*/;
insert into gxd03 values(4,'zhaoliu')



1)基于位置恢复

#模拟删除
use gxd;
delete from gxd03 where id=3;
delete from gxd03 where id=4;
exit;

#模拟恢复
1.恢复id=3的数据,基于的位置就要在id=4的位置前终止
 1)mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
 2)mysqlbinlog --no-defaults --stop-position='577' /opt/mysql-bin.000005 | mysql -uroot -p264196
 3)mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
2.恢复id=4的数据,基于的位置就要在id=4的位置后开始
 1)mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
 2)mysqlbinlog --no-defaults --start-position='577' /opt/mysql-bin.000005 | mysql -uroot -p264196
 3)mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
3.恢复id=3/4的数据,基于的位置就要在id=3的位置前开始,id=4的下一个位置为终止
 1)mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
 2)mysqlbinlog --no-defaults --start-position='296' --stop-position='717' /opt/mysql-bin.000005 | mysql -uroot -p264196
 3)mysql -uroot -p264196 -e 'select * from gxd.gxd03;'



2)基于时间点恢复

同理:
1.恢复id=3的数据,基于的位置就要在id=4的时间点前终止
mysqlbinlog --no-defaults --stop-datatime='2021-09-01 14:35:09' /opt/mysql-bin.000005 | mysql -uroot -p264196
2.恢复id=4的数据,基于的位置就要在id=4的时间点后开始
mysqlbinlog --no-defaults --start-datatime='2021-09-01 14:35:09' /opt/mysql-bin.000005 | mysql -uroot -p264196


三、总结

3.1 完全备份/恢复

3.1.1 物理冷备份/恢复

systemctl stop mysqld
yum -y install 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/

3.1.2 逻辑备份/恢复

备份某库
mysqldump -uroot -p[密码] --databases 库名 > /备份路径/备份文件名.sql
备份所有的库
mysqldump -uroot -p[密码] --all-databases > /备份路径/备份文件名.sql
完全备份指定库中的部分表
mysqldump -u root -p[密码]  [-d] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
恢复库
mysql -uroot -p264196 < /备份路径/备份文件名.sql
回复表
mysql -uroot -p264196  库名 < /备份路径/备份文件名.sql

3.2 增量备份/恢复

1.开启二进制日志功能,设置MIXED
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
2.一次完全备份,每周备份一次,crontab -e
mysqldump -uroot -p264196 gxd gxd03 > /opt/gxd-gxd03-$(date +%F).sql
mysqldump -uroot -p264196 --all-databases gxd > /opt/gxd-$(date +%F).sql
3.生成新的二进制文件(可每天进行增量备份操作)
mysqladmin -uroot -p264196 flush-logs
4.进行简单的数据插入,并增量备份
use 库;
insert into 表 ....
5.再刷新一次,进行增量备份与恢复
mysqladmin -uroot -p264196 flush-logs 
6.查看新生成的日志内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v 刷新前的二进制文件
7.删除再恢复
 1)模拟丢失更改的数据并恢复
 #模拟删除
 use gxd;
 delete from gxd03 where id=1;
 delete from gxd03 where id=2;
 exit;

 #模拟恢复
 mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
 mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p264196
 mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
2)模拟丢失所有数据并恢复
 use gxd;
drop table gxd03;

mysql -uroot -p264196 gxd < /opt/gxd-2021-08-31.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -uroot -p264196
mysql -uroot -p264196 -e 'select * from gxd.gxd03;'
posted @ 2021-08-31 12:34  落寞1111  阅读(435)  评论(0编辑  收藏  举报