MySQL数据库日志管理和数据的备份及恢复

目录

MySQL日志管理

数据库备份的重要性

数据库备份的分类

从物理与逻辑的角度

从数据库的备份策略角度

常见的备份方法

物理冷备

专用备份工具mysqldump或mysqlhotcopy

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

第三方工具备份

MySQL完全备份与恢复

MySQL完全备份

物理冷备份与恢复

[mysqldump 备份与恢复](#mysqldump 备份与恢复)

MySQL完全恢复

MySQL增量备份与恢复

[MySQL 增量备份](#MySQL 增量备份)

MySQL增量恢复

一般恢复

断点恢复


MySQL日志管理

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

  • 错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
  • 通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
  • 二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
  • 慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的

在/etc/my.cnf添加内容以此进行数据库的日志管理

bash 复制代码
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

##慢查询日志,用来记录所有执行时间超过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秒
bash 复制代码
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;				#在数据库中设置开启慢查询的方法

去到/usr/local/mysql/data/路径下可以找到相对应的日志文件

二进制日志格式有三种:binlog_format=STATEMENTROWMIXED

STATEMENT:基于SQL语句记录二进制日志,写入和恢复速度较快,在高并发的情况可能会出SQL语句顺序记录偏差导致恢复时数据丢失。(老版本的默认模式)

ROW:基于行记录二进制日志,写入和恢复速度较STATEMENT慢些,日志文件占用空间也较大,但是准确性较高。(5.7的默认模式)

MIXED:混合模式,平时负载压力较小时使用SQL语句记录二进制日志,在高并发的情况会切换成基于行记录二进制日志。

数据库备份的重要性

备份的主要目的是灾难恢复,在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。

造成数据丢失的原因主要有:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃。

数据库备份的分类

从物理与逻辑的角度

1.物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。

冷备份(脱机备份)︰是在关闭数据库的时候进行的;

热备份(联机备份)︰数据库处于运行状态,依赖于数据库的日志文件;

温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。

2.逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份,导出sql文件。

从数据库的备份策略角度

  1. 完全备份:每次备份都备份完整的库或者表数据
  2. 差异备份:只备份上一次完全备份后的更新数据
  3. 增量备份:每次备份只备份上一次完全备份或增量备份后的更新数据

注:推荐使用 完全备份+增量备份 的方式

常见的备份方法

物理冷备

备份时数据库处于关闭状态,直接打包数据库文件

备份速度快,恢复时也是最简单的

专用备份工具mysqldump或mysqlhotcopy

mysqldump常用的逻辑备份工具

mysglhotcopy仅拥有备份MyISAM和ARCHIVE表

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

进行增量备份,需要刷新二进制日志

第三方工具备份

免费的MySQL热备份软件Percona XtraBackup

MySQL完全备份与恢复

MySQL完全备份

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

物理冷备份与恢复

bash 复制代码
#关闭mysql
systemctl stop mysqld
#压缩备份
tar cf /opt/mysql_all_$(date +%F).tar /usr/local/mysql/data/
#移除
mv /usr/local/mysql/data/ ~
#解压恢复
tar Jxvf /opt/mysql_all_2023-12-26.tar
mv /opt/usr/local/mysql/data/ /usr/local/mysql/

关闭mysql服务

去到/opt,将/usr/local/mysql/data/路径下全部文件压缩

解压

将/usr/local/mysql/data/移到家目录下,用来模拟文件缺失

将解压好的文件夹从新放回原路径

mysqldump 备份与恢复

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

bash 复制代码
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql	#导出的就是数据库脚本文件

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

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

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

bash 复制代码
mysqldump -u root -p[密码]  [-d] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
#使用"-d"选项,说明只保存数据库的表结构
#不使用"-d"选项,说明表数据也进行备份

查看备份文件

bash 复制代码
grep -v "^--" /opt/kgc_info1.sql | grep -v "^/" | grep -v "^$"

MySQL完全恢复

恢复数据库

bash 复制代码
mysql -u root -p -e 'drop database 库名;'
#"-e"选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'SHOW DATABASES;'

mysql -u root -p < /opt/库名.sql
mysql -u root -p -e 'SHOW DATABASES;'

恢复数据表

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

bash 复制代码
mysqldump -u root -p 库名 表名 > /opt/库名.表名.sql

mysql -u root -p -e 'drop table 库名.表名;'
mysql -u root -p -e 'show tables from 库名;'

mysql -u root -p kgc < /opt/库名.表名.sql
mysql -u root -p -e 'show tables from 库名;'

MySQL增量备份与恢复

MySQL 增量备份

开启二进制日志功能

修改/etc/my.cnf配置

bash 复制代码
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 start mysqld

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

bash 复制代码
mysqldump -u root -p 库名 表名 > /opt/库名_表名_$(date +%F).sql
mysqldump -u root -p --databases 库名> /opt/库名_$(date +%F).sql

可每天进行增量备份操作,生成新的二进制日志文件

bash 复制代码
mysqladmin -u root -p flush-logs

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

bash 复制代码
use kunkun;
insert into kk values(3,'tt',22,'女');
insert into kk values(4,'hh',33,'男');

再次生成新的二进制日志文件

bash 复制代码
mysqladmin -u root -p flush-logs

之前的步骤4的数据库操作会保存到mysql-bin.000004文件中,之后数据库数据再发生变化则保存在mysql-bin.000005文件中

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

bash 复制代码
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:显示详细内容

MySQL增量恢复

一般恢复

模拟丢失更改的数据的恢复步骤

bash 复制代码
mysqlbinlog --no-defaults /opt/mysql-bin.000004 | mysql -u root -p

模拟丢失所有数据的恢复步骤

bash 复制代码
mysql -u root -p666 kunkun < /opt/kunkun_kk.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000004 | mysql -u root -p666

断点恢复

查看二进制日志文件

bash 复制代码
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004

基于位置恢复

bash 复制代码
#仅恢复到操作 ID 为"507"之前的数据,即不恢复"hh"的数据
mysqlbinlog --no-defaults --stop-position='507' /opt/mysql-bin.000004 | mysql -uroot -p666
bash 复制代码
#仅恢复"hh"的数据,跳过"tt"的数据恢复
mysqlbinlog --no-defaults --start-position='597' /opt/mysql-bin.000004 | mysql -uroot -p666

基于时间点恢复

bash 复制代码
#仅恢复到  18:28:28 之前的数据,即不恢复"hh"的数据
mysqlbinlog --no-defaults --stop-datetime='2023-12-26 18:28:28' /opt/mysql-bin.000004 |mysql -uroot -p666
bash 复制代码
#仅恢复到  18:28:28 之后的数据,即跳过"tt"数据的恢复,恢复"hh"的数据
mysqlbinlog --no-defaults --stop-datetime='2023-12-26 18:28:28' /opt/mysql-bin.000004 |mysql -uroot -p666

注:

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

相关推荐
yangchanghua1111 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance1 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai1 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务2 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂5 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.6 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚9 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队9 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光9 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql