平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MySQL数据库备份问题及处理”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
日志文件在数据库进行备份和恢复时起到了很重要的作用
常用的日志文件默认保存在 /usr/local/mysql/data 目录下
可在 /etc/my.cnf 设置文件中的 [mysqld] 中进行日志的路径修改、开启、关闭等操作
用来记录 mysql 启动、停止或运行时产生的错误信息
可借助一下字段进行更新
log-error=/usr/local/mysql/data/mysql_error.log (指定日志的保存位置和文件名)
结合项目来看,二进制日志,用来记录所有更新的数据或者已经潜在更新了数据的语句,记录了数据的更改,可用来数据恢复
开启方式:
log-bin=mysql-bin 或者 log_bin=mysql-bin
从实现思路看,一般情况下,它在 mysql 主从同步(复制)、读写分离集群的从节点上才开启。
主节点一般不需这个日志。
实际处理时,慢查询日志,用来记录所有执行时间超过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秒)
show variables like '%log_bin%';

show variables like '%slow%';
show variables like 'long_query_time';

set global slow_query_log=ON;
查看
show variables like ‘long_query_time';
日志超时时间

在企业里,数据的价值至关重要,数据保障了企业业务的正常运行。
落到代码里,所以,数据的安全性及数据的可靠性是运维的重中之重,任何数据的吊事都可能对企业产生严重的后果。
== 通常情况下,造成数据丢失的原因有一下几种:==
从物理与逻辑的角度分类可分为:逻辑备份、物理备份
从数据库的备份策略角度分类可分为:完全备份、差异备份、增量备份
结合项目来看,数据库的备份能够采用很多种方式,如直接打包数据库文件(物理冷备份)、专用备份工具(mysqldump)、二进制日志增量备份、第三方工具备份等
理解这一步时,第三方工具Percona xtraBackup是一个免费的MysQL热备份软件,兼容在线热备份Innodb和xtraDB,也能够兼容MySQL表备份,不过MyISAM表的备份要在表锁的情况下进行。
理解这一步时,InnoDB存储引擎的数据库在磁盘上存储成三个文件:db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)。
物理冷备份与恢复
systemctl stop mysqld
yum -y install xz
#压缩备份
cd /usr/local/mysql/data
tar jcvf mysql_all_$(date +%F).tar.xz /usr/local/mysql/data
systemctl start mysqld
#模拟故障,删除数据库
drop database HUISUO;
#解压恢复
tar jxvf /opt/mysql_all_2022-06-21.tar.xz -C /usr/local/mysql/data
cd /usr/local/mysql/data
mv usr/local/mysql/data/* ./



完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql
#导出的就是数据库脚本文件
例:
mysqldump -u root -p --databases liu > /opt/kgc.sql #备份一个kgc库
mysqldump -u root -p --databases mysql li > /opt/mysql-kgc.sql #备份mysql与 kgc两个库

备份所有的库
mysqldump -uroot -p[密码] --all-databases > /备份路径/备份文件名.sql
完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
如:
mysqldump -uroot -p[密码] [-d] HUISUO member1 > /opt/member1.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d”选项,说明表数据也进行备份
查看备份文件
grep -v "^--" /opt/member1.sql | grep -v "^/" | grep -v "^$"

vim /etc/my.cnf
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
#配置文件添加完后需要重启MySQL
systemctl restart mysql

先完成完全备份(在新建好表和库的基础上)
systemctl restart mysqld.service
mysqldump -uroot -p meeting working > /mnt/meeting_working_$(date +%F).sql
mysqldump -uroot -p meeting > /mnt/meeting_$(date +%F).sql
生成新的二进制文件(可每天进行增量备份操作)
mysqladmin -uroot -p flush-logs
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
先删除表
drop table working;
清空表内容
truncate table meeting.working;
恢复结束点为删除命令前和插入命令后
mysqlbinlog --no-defaults --stop-position='902' usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p
先清空表CLASS1,方便实验
mysql -uroot -p -e "truncate table meeting.working;"
mysql -uroot -p -e "select * from meeting.woring;"
mysqlbinlog --no-defaults --stop-datetime='2021-04-15 15:39:23' /opt/mysql-bin.000003 |mysql -uroot -p
mysql -uroot -p -e "select * from meeting.woring;"
mysql没有直接提供增量备份的工具,需借助二进制日志文件进行操作
采用日志分隔日志的方式进行增量备份
增量恢复需根据日志文件的时间先后逐个执行
采用基于时间和位置的方式进行恢复,能够更精准的恢复数据
以上为个人经验,希望能给大家一个参考,也希望大家多多兼容脚本之家。
chatGPT教我写compose函数的详细过程实用指南
.NET 10 使用 Microsoft.AspNetCore.OpenApi 实现方式 API 版本管理的过程完整指南
Gemini CLI 终极使用小结实用指南
.Net解决Web API中“服务器响应状态码为405(做法不允许)”错误的两种解决方案实用指南
Claude Code 与 Codex Harness 设计对比分析:一种加法,一种减法实用指南
.NET i18n 原理、实现方式一个 i18n 框架的过程完整指南