MySQL的备份恢复

数据备份的重要性

1.生产环境中,数据的安全至关重要

任何数据的丢失都会导致非常严重的后果。

2.数据为什么会丢失 :程序操作,运算错误,磁盘故障,不可预期的事件(地震,海啸),人为操作

数据库备份的分类和备份策略

1.物理备份

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

物理备份方法:

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

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

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

2)逻辑备份

逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份。

即以sql语句的形式,把库、表结构、表数据保存下来。

数据库的备份策略

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

如何进行物理备份

sql 复制代码
systemctl stop mysqld
#关闭MySQL1的服务器。因为关闭服务可以避免新的数据插入或者数据覆盖
 
cd usr/local/mysql/
 
cd data
 
cd kgc
 
安装软件包
 
tar Jcvf /opt/mysql_all_$(data +%F).tar.xz /usr/local/mysql/data/
#打包data的内容
 
ls
 
tar -Jxvf mysql_all_
#解压文件
 
cd usr/local/mysql/
 
rm -rf data
#删库
 
cd /opt/
 
cd usr/local/mysql
 
cp -a data/ /usr/local/mysql
#保留权限复制
 
systemctl restart mysqld
#重启mysql服务
 
到另外一台库
 
cd /usr/local/mysql/
 
cp -a data/ /opt/
#MySQL2自己先做一个文件备份
 
scp -r root@20.0.0.60:/opt/usr/local/mysql/data /opt/
#远程复制到MySQL2
 
cp -a data/ /usr/local/mysql/data
#保留权限复制到MySQL2
 
systemctl restart mysqld
#重启服务登录一下
 
chown -R mysel.mysql kgc kgc1
#递归给两个库更改归属
#看到无法阅读,就说明没有给权限的问题

如何把本地数据库迁移上云

1.

Xshell与公网IP相连

然后在云服务上进行编译安装

将本地服务器当中需要备份的文件通过(sz rz)拖入云服务器中

热备份当中的逻辑备份

用到mysql自带的工具 mysqldump

备份命令

sql 复制代码
备份单个:

mysqldump -u root -p123456 --databases test > /opt/zzr.sql

备份多个库:

mysqldump -u root -p 123456 --databases test test1 > /opt/test1.sql

备份所有库:

mysqldump -u root -p123456 -all-databases > /opt/test3.sql
sql 复制代码
mysqldump -u root -p --databases kgc > /opt/kgc.sql

cd /usr/local/mysql/data/
ls

rm -rf kgc
//删库

mysql -u root -p < /opt/kgc.sql
#会直接报错,库会回来,但是kgc库里面的表结构消失了。只能使用逻辑删除(在命令行删除)
 
mysql -u root -p123456 -e 'show databases;'
#-e:表示连接指定MySQL之后执行完命令后就自动退出
#进入MySQL执行一次show databases命令后就退出
 
mysql -u root -p -e 'drop database kgc;'
#需要手动数据密码
 
mysql -u root -p < /opt/kgc.sql
#手动输入密码
 
对多个库一次性备份
先备份多个库
mysqldump -u root -p --databases kgc kgc1 > /opt/kgc_all.sql
#手动输入密码。保存多个库
 
mysql -u root -p -e 'drop database kgc;'
mysql -u root -p -e 'drop database kgc1;'
#手动输入密码。模拟删除库
 
mysqldump -u root -p < /opt/kgc_all.sql
#手动输入密码。一次性恢复多个库
 
对全部库一次性备份
mysqldump -r root -p --all-databases > /opt/all_database.sql

mysql -u root -p123456 -e 'show databases;'

进入mysql之后自动执行命令,结束后自动退出

-e:指定连接mysql之后执行完命令自动退出

恢复命令

sql 复制代码
mysql -u root -p < /opt/test.sql

如何只恢复数据表

sql 复制代码
恢复单个表
先备份
mysqldump -u root -p kgc info1 > /opt/kgc_info1.sql
cd /opt
ls
mysql -u root -p -e 'drop table kgc.info1;'
指定库名恢复
mysql -u -root -p kgc < /opt/kgc_info1.sql

mysqldump -u root -p kgc info1 info2 > /opt/kgc_info1-2.sql
//重定向备份

mysql -u root -p -e 'drop table kgc.info1;'
mysql -u root -p -e 'drop table kgc.info2;'
//删表

mysql -u root -p kgc < /opt/kgc_info1-2.sql
//恢复

MySQL1全部数据库的逻辑备份文件恢复到MySQL2。
 
scp root@20.0.0.110:/opt/all_database.sql /opt/
 
mysql -u root -p < all_database.sql
#用sql语句的方式热备份直接转换。

物理冷备份和物理热备份

:特点 简单

数据量 占用备份空间较大

mysqldump 这是MySQL自带的备份文件的命令

特点:方便,简单,但是只能基于逻辑上的表结构和表数据恢复。物理删除之后再用逻辑恢复会报错。

也可以作为数据迁移,必然会占用更大空间。比较物理备份,相对来说占的空间要小得多。

增量备份

mysqldump支持增量备份

没有重复数据,备份量小,时间短。

mysqldump增量备份恢复表数据之间,表会锁定

缺点:备份时锁表,必然会影响业务,超过10G,耗时会比较长,导致服务不可用

1.mysql提供的二进制日志间接的实现增量备份

二进制文件怎么来?

sql 复制代码
vim /etc/my.cnf

server-id=1
log-bin=mysql-bin
binlog_formst=MIXED
wq

MySQL二进制日志记录格式有三种:

1、 STATEMNET:基于sql语句。是记录修改的sql语句,在高并发情况下记录sql语句时的顺序可能会出错。数据恢复可能会导致丢失或者误差。效率比较高,但是不适合高并发场景。

2、 ROW:基于行。会精准记录每一行的数据,准确率高但是回复的时效率低。

3、 MIXED:混合模式。既可以根据语句,也可也根据行。在正常情况下使用STATEMNET,一旦发生高并发,会智能的切换到ROW模式,虽然效率低但是一定不会出错。

sql 复制代码
表数据设置多一点
 
select * from info1;
#查看数据是否写入
 
cd /usr/local/mysql/data/
#会生成了两个文件
mysql -bin.index
mysql-bin.000001
表内写入信息后再查看日志文件 mysql-bin.000001
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001
#查看新插入表的日志
 
mysqladmin -u root -p flush-logs
#刷新日志.
#此时data目录下会生成一个新的日志文件mysql-bin.000002
 
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002
#刷新之后更新的内容会更新在2里面这就是断点
 
如何恢复:
mysqlbinlog --no-defaults mysql-bin00000.1 | mysql -u root -p
#增量备份,恢复之前表内插入的数据。这个叫断点恢复。
 
 
此时再对表插入信息。此时新插入的数据再000002里面。只要没有刷新日志就不会出现断点。会先插入再删除。
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002
 
如果需要备份新的数据之前需要再刷新一次。
mysqladmin -u root -p flush-logs
#刷新日志.
 
重新在表内插入数据
此时断点之后数据都在新生成的000003里面
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002
 
mysqladmin -u root -p flush-logs
#刷新日志断点
 
再删除表内数据,这时候删除的操作会保存到000004里面
 
mysqlbinlog --no-defaults --base64-out=decode-rows -v mysql-bin.000003

位置恢复

三种方式:

从某一个点开始恢复到最后

从开头,恢复到某一个位置

从指定点开始------指定的结束点

sql 复制代码
删除表内数据测试
基于位置点进行恢复:
1、 从某一点开始恢复到最后
格式:
mysqlbinlog --no-defaults --start-position='位置点' 文件名 | mysql -u root -p
 
2、 从开头一直恢复到某个位置
格式:
mysqlbinlog --no-defaults --stop-position='位置点' 文件名 | mysql -u root -p
 
3、 从指定点开始恢复到指定的结束点
格式:
mysqlbinlog --no-defaults --start-position='位置点' --stop-position='位置点' 文件名 | mysql -u root -p
 
mysqladmin -u root -p flush-logs
#刷新日志断点
 
删除表内数据此时数据再000005上
 
mysqlbinlog --no-defaults --start-position='6171' mysql-bin.000004 | mysql -u root -p
 
查看位置点
#at后面的数字就是位置点。要选择commit后面的位置点
mysqlbinlog --no-defaults --base64-out=decode-rows -v mysql-bin.000004
#查看000004日志内的位置点
 
从开头一直恢复到某个位置:
mysqlbinlog --no-defaults --stop-position='6106' mysql-bin.000004 | mysql -u root -p
#从头恢复到指定点
 
范围恢复:
mysqlbinlog --no-defaults --start-position='6106' --stop-position='6748' mysql-bin.000004 | mysql -u root -p
#指定位置到指定位置恢复

基于时间恢复

1.从某个时间点开始:

mysqlbinlog --no-defaults --start-datetime='时间点' 文件 | mysql -u root -p

2.从开头,到指定的结尾时间点

mysqlbinlog --no-defaults --stop-datetime='时间点' 文件 | mysql -u root -p

3.指定时间范围

mysqlbinlog --no-defaults --stop-datetime='时间点' 文件 --stop-datetime='时间点' 文件 |mysql -u root -p

时间格式:2023-11-06 11:44:32

sql 复制代码
基于时间点恢复:
YYY-MM-DD 11:11:11 时间格式要按照标准格式来写
1、 从某个时间点开始
格式:mysqlbinlog --no-defaults --start-datettime='时间点' 文件名 | mysql -u root -p
 
2、 从开头到指定结尾时间点
格式:mysqlbinlog --no-defaults --stop-datettime='时间点' 文件名 | mysql -u root -p
 
3、 指定时间范围
格式:mysqlbinlog --no-defaults --start-datettime='时间点' --stop-datettime='时间点' 文件名 | mysql -u root -p
 
从某个时间点开始
mysqlbinlog --no-defaults --start-datetime='2023-11-06 11:44:32' mysql-bin.000004 | mysql -u root -p
#从某个时间点开始
 
从开头到指定结尾时间点
mysqlbinlog --no-defaults --stop-datetime='2023-11-06 11:44:32' mysql-bin.000004 | mysql -u root -p
#从头开始到某个时间结束
 
指定时间范围
mysqlbinlog --no-defaults --start-datetime='2023-11-06 11:44:37' --stop-datetime='2023-11-06 11:49:05' mysql-bin.000004 | mysql -u root -p
#从某个时间开始到某个时间结束

日志存放

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

查询同用日志访问情况

sql 复制代码
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;				#在数据库中设置开启慢查询的方法

总结

在生产中,通过binlog进行增量恢复是非常好用的方法。

我们只需要对binlog文件进行备份,随时可以进行备份和恢复。(只能是root用户来进行操作)

除非有特殊需要一般不打额外断点,具体根据需求来,一般是通过脚本按月来设置断点。

相关推荐
转身後 默落1 小时前
03.一键编译安装Redis脚本
数据库·redis·缓存
blurblurblun1 小时前
Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
数据库·redis·缓存
永卿0012 小时前
mysql 日志机制
数据库·mysql
wu~9703 小时前
Mysql深入学习:慢sql执行
mysql
先鱼鲨生3 小时前
etcd 的安装与使用
数据库·etcd
crossoverJie4 小时前
StarRocks 如何在本地搭建存算分离集群
数据库·后端
潇凝子潇4 小时前
如何在不停机的情况下,将MySQL单库的数据迁移到分库分表的架构上?
数据库·mysql·架构
Tapdata4 小时前
什么是 Operational Data Hub?它因何而生,又为何能够在当下成为技术共识?
数据库
Seven975 小时前
Mysql的索引数量是否越多越好?为什么?
mysql
这里有鱼汤5 小时前
普通人做量化,数据库该怎么选?
数据库·后端