MySQL笔记7
一、MySQL备份恢复
1.系统变量
(1)概念
由系统定义,属于MySQL服务器层面的变量,非用户自定义。
(2)分类
类型 | 作用域 |
全局变量 | MySQL服务器每次启动为所有系统变量设置初始值,赋值后对所有会话(连接)有效,可跨连接,但不能跨重启,重启后恢复初始值 |
会话变量 | 针对当前会话(连接)有效,不能跨连接,连接创建时由MySQL自动设置 |
persist变量 | 持久值,立即生效且重启后也生效 |
(3)操作语法
显示系统变量:
show [global|session|persist] variables; (显示所有)
show [global|session|persist] variables like "%变量名%"; (模糊查询)
查看系统变量值:
select @@[global.|seesion.]系统变量名;
如:select @@version; select @@global.version;
设置变量值:
set @@[global|session] 系统变量名=值;
如:select @@password_history; set @@global.password_history=0;
2.自定义变量
(1)全局变量
概念:用户自定义,非系统提供
作用域:针对当前会话(连接)有效,作用域同会话变量
定义与赋值:
set @变量名=值;
set @变量名:=值;
select @变量名;(用户定义的变量无需声明,未赋值时为null)
select @变量名:=值;(select中 = 号前的冒号是可选的,select方式 = 前必须有冒号)
select count(*) into @变量名 from 表名; (查询结果需为单个值)
(2)局部变量
概念:通过 declare 定义,用于存储过程和函数中,在 begin...end 中且位于语句之前,可重复定义多个。
作用域:在对应的 begin 和 end 之间有效, end 之后不可用,类似编程语言的局部变量作用域。
定义与赋值:
declare 变量名 变量类型 [default默认值 ]
set 变量名=值; 或 set 变量名:=值; select 字段 into 变量名 from 表名 ...
例:
3.日志管理
(1)日志的作用与必要性
排错:定位数据库运行中的错误。
数据分析:通过日志分析数据库使用模式、性能瓶颈等。
了解运行与性能:掌握MySQL程序的运行状态和性能表现。
在数据库数据丢失或被破坏时,保证数据的安全性和完整性,用于数据查看或恢复。
(2)日志文件查看方法
由于MySQL安装方式多样,日志文件存储位置和名称可能不同,需通过MySQL配置文件(如 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini )确定错误日志文件的位置及名称。
例:可在配置文件中查看 datadir (数据目录)和 log-error (错误日志文件名),进而在对应路径(如 C:\ProgramData\MySQL\MySQL Server 8.0\Data\LEGION.err )找到日志文件。
(3)常见日志类型
错误日志
记录信息:MySQL服务器启动、运行、关闭过程中的信息。如配置文件语法错误、磁盘空间不足等。
查看本机错误日志:
SHOW VARIABLES LIKE 'log_error'; (查看错误日志位置及文件名,通常以主机名 .err 命名 )
错误日志信息分类: [System] 、 [Warning] 、 [Error] 三类。
配置说明:可在 my.ini 中通过 log-error=file_name 选项指定错误日志文件的保存位置。
通用查询日志
记录内容:所有客户端连接和执行的SQL语句,包括查询、插入、更新、删除等操作,默认不开启(因会消耗大量磁盘空间、CPU和内存,仅在需要还原操作场景定位问题时短时间开启)。
查看设置状态:show global variables like "%general_log%";
默认 general_log 为 OFF ,日志文件默认名为主机名 .log ,存储在数据目录(如 C:\ProgramData\MySQL\MySQL Server 8.0\Data )。
启动查询日志:set global general_log=on; (临时生效);若需永久生效,在 my.ini 中配置 general-log=1 并重启服务。
日志记录类型设置:show variables like "%log_output%";
可设置为 TABLE (记录到表)、 FILE (记录到文本文件)、 NONE (不记录),也可在 my.ini 中配置 log-output={TABLE|FILE|NONE} 。
当set global log_output="TABLE"; 通用日志记录在mysql.general_log表中执行语句时argument字段默认是以BLOB二进制存储的,可通过convert()来进行编码转换。
注:
要启用通用查询日志,需要至少配置general-log=1,log-output={TABLE|FILE}
general_log_file如果没有指定,默认名是:主机名.log
默认通用查询日志是不开启的,因为会消耗大量的磁盘空间、CPU以及内存,所以当需要通过查询日志还原操作场景准确定位问题时可以短时间开启
可以通过下面的查询测试查询日志的文件变化:
关闭查询日志:set global general_log=0;
慢查询日志
作用:记录执行时间超过 long_query_time 秒的查询或不使用索引的查询,用于优化 SQL 语句。
查看状态:show global variables like "%slow_query_log%";
开启:set global slow_query_log=1;
时间阈值:show global variables like "long_query_time";(查看阈值)
set long_query_time=1(修改阈值,仅在当前会话生效)
set global long_query_time=1;(修改阈值,全局生效)
默认10秒最小为0,精度可到微秒,最小值为0
创建存储过程并调用:
撤销日志
作用:用于 MySQL 撤销 SQL 操作,支持事务回滚和 MVCC 版本管理。
记录内容:
插入(insert)操作:生成对应的删除(delete)操作。
删除(delete)操作:InnoDB 引擎会将隐藏字段 deleted_bit 标记为 1(逻辑删除),undo_log 记录将其恢复为未删除状态 deleted_bit = 0 的操作。
修改(update)操作:记录反向修改操作(如性别从男改女,undo_log 记录从女改回男)。
本质:执行写入类SQL时,会在undo_log中生成对应的“反SQL”
存储位置:C:\ProgramData\MySQL\MySQL Server 8.0\Data\undo_001
无法直接查看的原因:
格式复杂→undo_log是以二进制格式存储在磁盘上的,其内部结构和编码方式是 InnoDB 存储引擎私有的,没有公开的规范说明如何解析这些二进制数据。
系统设计→undo_log主要是供 InnoDB 存储引擎内部使用,用于事务回滚和 MVCC 版本管理,数据库设计时并没有提供直接访问和查看其内容的接口。
间接查看方式:SELECT * FROM performance_schema.events_transactions_current;
重做缓存日志
产生背景:InnoDB 引擎基于磁盘存储数据,MySQL 启动后会在内存中创建 BufferPool,数据先写入内存,再由后台线程刷写到磁盘,以此提升读写性能。但内存数据会因机器宕机、重启丢失,为解决此问题,redo_log(重做日志) 应运而生。
作用:是预写式日志,在向内存写入数据前先写日志。当数据未刷盘且 MySQL 崩溃时,可通过 redo_log 恢复数据,确保所有提交的事务持久化。
存储位置:C:\ProgramData\MySQL\MySQL Server 8.0\Data#innodb_redo
文件类型:由32个文件组成,分为两种。
正在使用的:#ib_redoN
空闲的:#ib_redoN_tmp
查看方式:
select * from performance_schema.innodb_redo_log_files\G(文件信息)
show global status like '%innodb%redo%';(状态)
二进制日志
作用:
记录所有更改数据的语句(insert、update、delete 等),不记录查询语句。
用于主从复制:从服务器拷贝主服务器的二进制日志,执行其中的 SQL 语句,实现主从数据一致。
用于数据恢复:可通过日志恢复误操作(如删库)前的数据。
用于日志审计:通过日志信息审计数据库是否遭受注入攻击(黑客提交数据库查询代码获取数据的行为)。
查看与管理:
show variables like "%log_bin%";(查看二进制日志状态)
show binary logs;(查看日志文件列表)
显示名称、容量单位字节、加密与否
show master status;(查看当前使用的二进制日志文件)
show binlog events in "日志文件名";(查看二进制日志内容)
分割日志:
新操作记录到新日志文件,可通过 mysqladmin flush-logs -u 用户名 -p 命令触发,也可在 MySQL 内执行 flush logs; 生成新日志文件。
刷新日志:
更新日志、对缓存数据进行磁盘 I/O,强制关闭并重新打开日志文件(或切换新日志)。
flush logs;(产生新日志文件) show master status;
在shell中,可通过mysqladmin命令执行日志刷新
mysqladmin flush-logs -u 账户名 -p mysqladmin refresh -u 账户名 -p
删库后的应对:
责任定位:bin-log 记录 SQL 执行的会话信息,企业监控系统可通过 bin-log → session → network-connection 定位执行删库操作的 IP,无法“跑路”。
数据恢复:找到本地 bin-log 日志文件,移除删库记录,用 mysqlbinlog 工具导出 SQL 文件并执行,可恢复删库前数据。
中继日志
定义与存在场景:中继日志是用于暂存和转发数据或日志信息的机制,仅存在于主从架构的从机上,单库环境中不会出现。
作用:在主从架构中,从机复制主机的 bin-log 日志后,会将其暂存到 relay-log 中,作为主从同步数据的“中转站”,保障主从数据的同步流程。
4.备份
(1)备份类型
根据服务器状态分:
热备份:读、写不受影响
温备份:仅可以执行读操作
冷备份:离线备份;读、写操作均中止
根据对象分:
物理备份:复制数据文件
逻辑备份:将数据导出至文本文件中
根据数据收集分:
完全备份:备份全部数据; 每个月的第一天 2-6 点通常是业务低谷
增量备份:仅备份上次完全备份或增量备份以后变化的数据;高频次的短间隔时段1h,2h就做一次
差异备份:仅备份上次完全备份以来变化的数据; 完全备份后的第二天凌晨2-4,1号完全2增量
(2)逻辑备份优缺点
优点:
格式易处理:以纯 ASCII 文本格式存储,可通过文本处理工具操作。
兼容性强:对数据库版本要求低,物理备份则版本兼容性差。
缺点:
备份恢复速度慢:需在数据库内部格式与文本格式间转换,涉及大量 I/O 和数据处理,大规模数据库耗时更久。
存储空间占用大:因存储文本形式的元数据(如 SQL 语句、表结构),相同数据量下比物理备份占用更多空间。
对数据量敏感:数据量增加时,备份恢复的时间、空间开销及系统资源(CPU、内存、I/O)消耗显著增大,可能影响业务系统。
恢复过程复杂:若备份数据有误或与目标库结构不兼容,需手动处理(如修改备份数据、调整目标库结构)。
不适合实时备份:速度慢且可能影响数据库性能,无法满足实时备份或数据一致性要求极高的场景(如在线交易系统)。
(3)备份内容
数据文件、日志文件(比如事务日志,二进制日志)、存储过程、存储函数、触发器、配置文件(十分重要,各个配置文件都要备份)、用于实现数据库备份的脚本,数据库自身清理的Crontab等……
(4)mysqldump备份工具
mysqldump 是MySQL的一款常用逻辑备份工具,支持完全备份+增加备份,速度相对较慢,适合中小型数据库支持所有引擎 。用于对MySQL数据库进行备份操作,可将数据库中的数据、结构等以SQL语句的形式导出,便于数据的恢复和迁移。
备份策略:第一次完全备份,每天一次增量备份,每周再做一次完全备份,如此一直重复
mysqldump -u用户名 --password=密码 -A > 绝对路径\备份文件.sql(全备)
mysqldump -u用户名 -p密码 数据库名 [表1 表2] > 绝对路径\备份文件.sql(单库/指定库)
mysqldump -u [用户名] -p --databases/-B [数据库名1] [数据库名2] ... > [备份文件路径](多库)
例:
使用mysqldump工具实现全量备份(在命令提示符中处理,不要在powershell中)
原理:必须先做全量备份,使得数据库有一个基准还原点,在做增量备份,还原差异数据
备份的盘符一定要和MySQL安装目录在同一个盘符中,要不然会提示:拒绝访问
切换终端到MySQL,删除某个数据库后,执行 source 备份路径 语句,恢复全库
局部备份恢复
切换终端到MySQL,删除某个数据库后,需要先创建待恢复的数据库,执行 source 备份路径 语句,恢复库
(5)文件系统备份工具
cp命令:
类型:冷备份、物理备份,支持所有存储引擎。
特点:通过复制命令备份,备份和还原速度极快;灵活度低,跨系统支持但跨平台能力差。
LVM(逻辑卷管理):
类型:近乎热备份,基于快照(LVM、ZFS)的物理备份。
特点:备份速度快,仅短暂影响数据库在线使用;限制较多,LVM不支持多逻辑卷同时备份(数据文件和事务日志需在同一LVM上),ZFS可支持多逻辑卷备份。
(6)其它备份工具
ibbackup:商业工具,对MyISAM是温备份、InnoDB是热备份,备份还原速度快,每服务器授权版本费用5000美元。
xtrabackup:开源工具,是ibbackup的替代方案,对MyISAM温备份、InnoDB热备份。
mysqlbackup:Oracle公司推出的企业级备份软件(MySQL Enterprise Backup),面向企业级数据库备份需求。