MySQL数据库日志、备份与恢复

目录

日志类型与作用:

1.redo 重做日志

2.undo 回滚日志

3.errorlog 错误日志

4.slow query log 慢查询日志

5.bin log 二进制日志

6.relay log 中继日志

7.general log 普通日志

日志的查询

         数据备份的重要性

数据库备份的分类

常见的备份方法

实际操作

物理冷备份与恢复

mysqldump 备份与恢复(温备份)

MySQL增量备份与恢复

         MySQL增量备份实验

MySQL 增量备份恢复


日志类型与作用:

MySQL 的日志默认保存位置为 /usr/local/mysql/data

1.redo 重做日志

达到事务一致性(每次重启会重做)

作用:确保日志的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性

2.undo 回滚日志

作用:保证数据的原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交 隔离级别就是通过mvcc+undo实现

3.errorlog 错误日志

作用:Mysql本身启动,停止,运行期间发生的错误信息

4.slow query log 慢查询日志

作用:记录执行时间过长的sql,时间阈值(10s)可以配置,只记录执行成功 另一个作用:在于提醒优化

5.bin log 二进制日志

作用:用于主从复制,实现主从同步 记录的内容是:数据库中执行的sql语句

6.relay log 中继日志

作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放

7.general log 普通日志

作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能

日志的查询

 #查看通用查询日志是否开启show
 show variables like 'general%';      

#查看二进制日志是否开启
show variables like 'log_bin%';	

 

#查看慢查询日功能是否开启
show variables like '%slow%';	

#查看慢查询时间设置
show variables like 'long_query_time';	

 

数据备份的重要性

备份的主要目的是灾难恢复

  • 在生产环境中,数据的安全性至关重要
  • 任何数据的丢失都可能产生严重的后果
  • 造成数据丢失的原因
  • 程序错误
  • 人为操作错误
  • 运算错误
  • 磁盘故障
  • 灾难(如火灾、地震)和盗窃

数据库备份的分类

物理备份

直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快

逻辑备份

从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度

1、从物理与逻辑的角度,备份可以分为

  • 冷备份(脱机备份):是在关闭数据库的时候进行的
  • 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
  • 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

2、从数据库的备份策略角度,备份可分为

  • 完全备份:每次对数据库进行完整的备份
  • 差异备份:备份自从上次完全备份之后被修改过的文件
  • 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份

常见的备份方法


1、物理冷备
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的

2、专用备份工具mydump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

3、启用二进制日志进行增量备份
进行增量备份,需要刷新二进制日志

4、第三方工具备份
免费的MySQL热备份软件Percona XtraBackup

冷备:

读、写操作均不可进行,数据库停止服务

温备:

读操作可执行;但写操作不可执行

热备:

读、写操作均可执行

MyISAM:温备,不支持热备

InnoDB:都支持

实际操作

配置环境

mysql -u root -p
create database SCHOOL;
use SCHOOL;
create table if not exists CLASS1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id));

insert into CLASS1 values(1,'user1','male','running');
insert into CLASS1 values(2,'user2','female','singing');

set password = password('123123');

物理冷备份与恢复

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/

解压恢复

tar Jxvf /opt/mysql_all_2021-12-01.tar.xz -C /usr/local/mysql/data

systemctl restart mysql

mysqldump 备份与恢复(温备份)

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

mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql 

备份一个库
mysqldump -u root -pabc123 --databases school > /opt/school.sql
#导出的就是数据库脚本文件

备份mysql与 kgc两个库
mysqldump -u root -pabc123 --databases mysql  school > /opt/mysql-school.sql

2.完全备份MySQL服务器中的所有库

mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql

mysqldump -u root -pabc123 --all-databases > /opt/all.sql


3.完全备份指定库中的部分表

mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql

mysqldump -u root -pabc123 school info > /opt/info.sql

 mysqldump -u root -pabc123 [-d] school info > /opt/info.sql

//使用“-d”选项,说明只保存数据库的表结构

//不使用“-d”选项,说明表数据也进行备份

//作为一个表结构模版

4.查看备份文件

grep -v "^--" /opt/school.sql | grep -v "^/" | grep -v "^$"

完全备份恢复
(1)、恢复数据库

mysql -uroot -p123123 -e 'drop database SCHOOL;'
1
#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出

mysql -uroot -p123123 -e 'SHOW DATABASES;'

mysql -uroot -p123123 < /opt/SCHOOL.sql
mysql -uroot -p123123 -e 'SHOW DATABASES;'

(2)、恢复数据表
当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。

mysql -uroot -p123123 -e 'drop table SCHOOL.CLASS1;'
mysql -uroot -p123123 -e 'show tables from SCHOOL;'

mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS1.sql
mysql -uroot -p123123 -e 'show tables from SCHOOL;'

MySQL增量备份与恢复

MySQL数据库增量恢复

1.一般恢复

  • 将所有备份的二进制日志内容全部恢复

2.基于位置恢复

  • 数据库在某一时间点可能既有错误的操作也有正确的操作
  • 可以基于精准的位置跳过错误的操作
  • 发生错误节点之前的一个节点,上一次正确操作的位置点停止

3.基于时间点恢复

  • 跳过某个发生错误的时间点实现数据恢复
  • 在错误时间点停止,在下一个正确时间点开始

MySQL增量备份实验

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

systemctl restart mysqld
ls -l /usr/local/mysql/data/mysql-bin.*

服务器重启报错:

解决方案:

systemctl daemon-reload

重启服务器即可:

systemctl  start  mysqld

 

 2、可每周对数据库或表进行完全备份

mysqldump -uroot -p123123 SCHOOL CLASS1 > /opt/SCHOOL_CLASS1_$(date +%F).sql
mysqldump -uroot -p123123 --all-databases SCHOOL > /opt/SCHOOL_$(date +%F).sql

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

mysqladmin -uroot -p123123 flush-logs

4、插入新数据,以模拟数据的增加或变更

mysql -uroot -p123123
use SCHOOL;
insert into CLASS1 values(3,'user3','male','game');
insert into CLASS1 values(4,'user4','female','reading');

5、再次生成新的二进制日志文件(例如 mysql-bin.000003)

mysqladmin -uroot -p123123 flush-logs

6、查看二进制日志文件的内容

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位编码机制去解码并按行读取
#-v:显示详细内容
BEGIN
/!/;
#at 302
#210129 0:39:12 server id 1 end_log_pos 430 CRC32 0x2c164d0a Query thread_id=10 time=0 error_code=0
use SCHOOL/!/;
SET TIMESTAMP=1611851952/!/;
insert into CLASS1 values(3,‘user3’,‘male’,‘game’)
/!/;
#at 430
#210129 0:39:12 server id 1 end_log_pos 461 CRC32 0x225bb461 Xid = 76
COMMIT/!/;
#at 461
#210129 0:39:13 server id 1 end_log_pos 526 CRC32 0xe5abe22c Anonymous_GTID last_comd=1      
sequence_number=2 rbr_only=no
SET @@SESSION.GTID_NEXT= ‘ANONYMOUS’/!/;
#at 526
#210129 0:39:13 server id 1 end_log_pos 609 CRC32 0x2cfb793b Query thread_id=10 time=0 error_code=0
SET TIMESTAMP=1611851953/!/;
BEGIN
/!/;
#at 609
#210129 0:39:13 server id 1 end_log_pos 742 CRC32 0x7ea13a1a Query thread_id=10 time=0 error_code=0
SET TIMESTAMP=1611851953/!/;
insert into CLASS1 values(4,‘user4’,‘female’,‘reading’)
/!/;
#at 742
#210129 0:39:13 server id 1 end_log_pos 773 CRC32 0x11b21cd0 Xid = 77
COMMIT/!/;

MySQL 增量备份恢复

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

mysql -uroot -p123123
use SCHOOL;
delete from CLASS1 where id=3;
delete from CLASS1 where id=4;
select * from CLASS1;
quit

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

(2)、模拟丢失所有数据的恢复步骤(基本一样,注意日志日期)

mysql -uroot -p123123
use SCHOOL;
drop table CLASS1;
quit

mysql -uroot -p123123 SCHOOL < /opt/SCHOOL_CLASS1_2021-01-29.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"


2、断点恢复

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

例:
at 302
201122 16:41:16
插入了“user3”的用户数据

at 623
201122 16:41:24
插入了“user4”的用户数据

(1)、基于位置恢复
#仅恢复到操作 ID 为“609”之前的数据,即不恢复“user4”的数据

mysqlbinlog --no-defaults --stop-position='609' /opt/mysql-bin.000002 | mysql -uroot -p

例:

mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"
mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS1;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"
mysqlbinlog --no-defaults --stop-position='609' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

#仅恢复“user4”的数据,跳过“user3”的数据恢复,609只后,仅有第四条记录
例:

mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"
mysqlbinlog --no-defaults --start-position='609' /opt/mysql-bin.000002 | mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"


(2)基于时间点恢复
#仅恢复到 0:39:13 之前的数据,即不恢复“user4”的数据

例:先清空表CLASS1,方便实验

mysql -uroot -p123123 -e "truncate table SCHOOL.CLASS1;"
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"

mysqlbinlog --no-defaults --stop-datetime='2021-01-29 0:39:13' /opt/mysql-bin.000002 |mysql -uroot -p123123
mysql -uroot -p123123 -e "select * from SCHOOL.CLASS1;"



#仅恢复“user4”的数据,跳过“user3”的数据恢复(基本一致)

mysqlbinlog --no-defaults --start-datetime='2021-12-01 10:39:13' /opt/mysql-bin.000002 |mysql -uroot -p


总结下断点恢复
如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条SQ语句以及之后的所有数据,就从这个语句的位置节点或者时间点start
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值