MYSQL日志管理、备份与恢复

目录

[一、MySQL 日志管理](#一、MySQL 日志管理)

[二、MySQL 备份与恢复](#二、MySQL 备份与恢复)

[1.MySQL 完全备份](#1.MySQL 完全备份)

1.物理冷备份与恢复

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

[2.MySQL 完全恢复](#2.MySQL 完全恢复)

[3.MySQL 增量备份与恢复](#3.MySQL 增量备份与恢复)

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

[2.MySQL 增量恢复](#2.MySQL 增量恢复)


一、MySQL 日志管理

bash 复制代码
MySQL 的日志默认保存位置为 /usr/local/mysql/data
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秒


systemctl restart mysqld

mysql -u root -p
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;				#在数据库中设置开启慢查询的方法

永久设置:

先编辑配置文件

设置好了保存重启下服务

直接在数据库中使用命令查看

临时设置慢查询的方法

二、MySQL 备份与恢复

准备一个表和数据

bash 复制代码
use kgc;
create table if not exists info2 (
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 info2 values(1,'user1','male','running');
insert into info2 values(2,'user2','female','singing');

1.MySQL 完全备份

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

1.物理冷备份与恢复
bash 复制代码
systemctl stop mysqld


#压缩备份
cd /usr/local/mysql/
tar zcf /opt/mysql_all_$(date +%F).tar.gz data/

#解压恢复
mv data/ ~
tar xf /opt/mysql_all_2023-12-26.tar.gz
2.mysqldump 备份与恢复
bash 复制代码
1.完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql	#导出的就是数据库脚本文件
例:
mysqldump -u root -p --databases kgc > /opt/kgc.sql
mysqldump -u root -p --databases mysql kgc > /opt/mysql-kgc.sql

2.完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql

3.完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
例:
mysqldump -u root -p [-d] kgc info1 info2 > /opt/kgc_info1.sql
#使用"-d"选项,说明只保存数据库的表结构
#不使用"-d"选项,说明表数据也进行备份

4.查看备份文件
grep -v "^--" /opt/kgc_info1.sql | grep -v "^/" | grep -v "^$"

2.MySQL 完全恢复

bash 复制代码
systemctl start mysqld
(1)恢复数据库
mysql -u root -p -e 'drop database kgc;'
#"-e"选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'SHOW DATABASES;'

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

(2)恢复数据表
当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
mysqldump -u root -p kgc info1 > /opt/kgc_info1.sql

mysql -u root -p -e 'drop table kgc.info1;'
mysql -u root -p -e 'show tables from kgc;'

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

3.MySQL 增量备份与恢复

1.MySQL 增量备份

1.开启二进制日志功能

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
ls -l /usr/local/mysql/data/mysql-bin.*

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

bash 复制代码
mysqldump -u root -p kgc info1 > /opt/kgc_info1_$(date +%F).sql
mysqldump -u root -p --databases kgc > /opt/kgc_$(date +%F).sql

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

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

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

bash 复制代码
use kgc;
insert into info1 values(3,'user3','male','game');
insert into info1 values(4,'user4','female','reading');

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

bash 复制代码
mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中

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

bash 复制代码
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:显示详细内容
2.MySQL 增量恢复

1.一般恢复

bash 复制代码
(1)模拟丢失更改的数据的恢复步骤
use kgc;
delete from info1 where id=3;
delete from info1 where id=4;

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

(2)模拟丢失所有数据的恢复步骤
use kgc;
drop table info1;

mysql -u root -p kgc < /opt/kgc_info1_2023-12-26.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

2.断点恢复

bash 复制代码
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000003
例:
# at 6601
#231226 18:47:26
插入了"user3"的用户数据

# at 6895
#231226 18:47:36
插入了"user4"的用户数据


(1)基于位置恢复
#仅恢复到操作 ID 为"590"之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --start-position='6601' --stop-position='6753' /opt/mysql-bin.000003 | mysql -uroot -p

#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-position='6895' --stop-position='7052' /opt/mysql-bin.000003 | mysql -uroot -p

(2)基于时间点恢复
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
# at 1435
#231226 19:48:21
插入了"user5"的用户数据

# at 1729
#231226 19:49:01
插入了"user6"的用户数据


#仅恢复到 19:49:01 之前的数据,即不恢复"user6"的数据
mysqlbinlog --no-defaults --start-datetime='2023-12-26 19:48:21' --stop-datetime='2023-12-26 19:49:01' /opt/mysql-bin.000004 |mysql -uroot -p

#仅恢复"user4"的数据,跳过"user5"的数据恢复
mysqlbinlog --no-defaults --start-datetime='2023-12-26 19:49:01' --stop-datetime='2023-12-26 19:50:15' /opt/mysql-bin.000004 |mysql -uroot -p


如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start
相关推荐
jiugie26 分钟前
MongoDB学习
数据库·python·mongodb
hzulwy29 分钟前
MongoDB应用设计调优
数据库·mongodb
bugtraq202137 分钟前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu
xmweisi44 分钟前
【华为】报文统计的技术NetStream
运维·服务器·网络·华为认证
VVVVWeiYee1 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信
我爱松子鱼1 小时前
MySQL 单表访问方法详解
数据库·mysql
我们的五年1 小时前
MySQL存储引擎:选择与应用
数据库·mysql
计算机毕设指导61 小时前
基于Springboot学生宿舍水电信息管理系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
陆鳐LuLu1 小时前
日志管理利器:基于 ELK 的日志收集、存储与可视化实战
运维·elk·jenkins
CodeWithMe1 小时前
[ Vim ] 常用命令 and 配置
linux·编辑器·vim