Mysql的备份回滚

Mysql的备份回滚

一、数据库备份的分类

​ 数据库备份逻辑备份策略大体上可以分为以下几种:

完全备份:每次对数据库进行完整的备份

差异备份:备份自从上次完全备份后被修改过的文件,下次备份备份的是相对原来的完全备份后增加啊 的差异的文件而不是相对于差异备份后增加的文件

增量备份:备份相对于前一次备份后被修改的文件。

二、常见的备份方法

​ 常见的数据库备份方法有以下几种:

物理冷备:关闭数据库然后直接打包数据库文件

专用备份工具mydump或mysqlhotcopy

mysqldump:常用的逻辑备份工具

mysqlhotcopy:仅拥有备份MylSAM和ARCHIVE表

启用二进制日志进行备份:进行增量备份,需要刷新二进制文件

第三方工具备份:免费的MySQL热备份软件Percona XtraBackup

三、MYSQL日志管理

​ mysql的日志默认保存为/usr/local/mysql/data

​ 日志的种类:

错误日志:用来记录MYSQL启动、停止或运行是发生的错误信息,当然默认已开启

log-error=/usr/local/mysql/data/mysql_error.log

通用查询日志:用来记录MYSQL的所有连接和语句,默认是关闭

general_log=ON 
general_log_file=/usr/local/mysql/data/mysql_general.log

二进制日志:用来记录所有更新了数据或已经潜在更新了数据的语句,记录数据的更改,可用于数据恢复,默认开启

log-bin=mysql-bin 或 log_bin=mysql-bin

中继日志:一般情况下在Mysql主从同步(复制),读写分离集群的从节点开启。主节点一般不需要这个日志。

慢查询日志:用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便提醒优化,默认是关闭的。

s1ow query log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long query time=5
#设置超过5秒执行的语句被记录,缺省时为10秒

日志开启

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

查询开启

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;
#在数据库中设置开启慢查询的方法
#variables代表变量

四、备份策略

​ 在企业中备份的合理的备份频率和备份策略是很重要的,较为合理的备份区间为:

全备:一周一次,推荐时间为晚上10点到早上的5点进行全备

增量:三天/两天/一天一次增量备份

​ 当然我们也可以在周四晚上进行完全备份,然后一天一次增量,下周继续再做一次完全备份然后在新完全备份发基础上进行增量备份

五、Mysql的完全备份与恢复

​ 首先我们要知道InnoDB存储引擎的数据库在磁盘上存储成三个文件分别为:db.opt(表属性文件)表名.frm(表结构文件)表明.ibd(表数据文件)

物理备份
#首先我们要关闭数据库
systemctl stop mysqld
#然后简单粗暴,直接将mysql的数据目录打包压缩到指定的路径下
tar -zcvf /opt/mysql.bak.gz /usr/local/mysql/data/
#然后恢复也很简单
tar -zxvf /opt/mysql.bak.gz  -C /
#注意如果前面的绝对路径压缩的解压直接从/解压	

mysqldump

备份指定完整的库/多个完整的库

mysqldump -u root -p2288 --databases 库名 >保存的地址
mysqldump -u root -p2288 --databases kgc >/opt/kgc.sql
mysqldump -uroot -p2288 --databases kgc MOGU >/opt/mogu_kgc.sql

备份所有的库

mysql -u root -p2288 --all-databases >/opt/all.sql

备份所有库但只保留表结构

mysqldump -u root -p2288 -d --databases 库名 >保存的地址

备份指定的表

mysqldump -uroot -p2288  库名 表名 > 保存地址

备份指定的表但不保存表数据

mysqldump -u root -p2288 -d 表名 >保存地址

查看备份文件

grep -v "^--" XXXX(备份文件地址) |grep -v "^/" |grep -v "^$"

Mysql完全恢复

免交互使用sql语句

mysql -uroot -p2288 -e'show databases'

免交互完全恢复

mysql -uroot -p2288 kgc </opt/kgc.sql #kgc是指定恢复的数据库名字
mysql -uroot -p2288 </opt/kgc.sql #也可以不指定直接执行,本身又建库的语句直接执行可以创建库

使用Source执行SQL脚本

source /opt/MOGU.sql #后面跟指定的绝对路径

Mysql增量备份和恢复

Mysql数据库增量恢复一般又三种分别是基于二进制文件的一般恢复,基于位置ID的位置恢复和基于时间的时间节点恢复,当然增量恢复的本质就是将二进制文件翻译成sql脚本,运行sql脚本还原之前修改数据的步骤。

二进制日志(binlog)有三种不同的记录格式:

  • STATEMENT(基于SQL语句)
  • ROW(基于行)
  • MIXED(混合模式),默认格式是STATEMENT

二进制文件的生成:

  • 重启服务就会刷新一个新的二进制文件
  • mysqladmin -u root -p flush-logs 生成二进制文件

二进制文件的编译(查看)

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004

一般恢复

首先我们刷新一下日志此时出现最新日志04,我们写新增sql语句给ceshi表

我们刷新下二进制文件此时出现二进制表出现了新的05,但是数据并不在05中,而在上一次的04中,你第一次刷新出来的日志其实就是新建开始记录你的操作,等你再次执行二进制文件刷新时前面的操作将保存到你上一次新建的日志及新日志-1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ns4m604K-1663499419137)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811161715118.png)]

我们查看下04这个二进制文件

 mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byv32EON-1663499419138)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811162427543.png)]

此时我们将删除我们刚新增的数据,然后再用二进制文件恢复来测试,然后看下表是否有数据了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71pTuRos-1663499419139)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811162939730.png)]

很好,没有,我们再执行下二进制文件恢复

mysqlbinlog --no-defaults /opt/mysql-bin.000004 | mysql -uroot -p

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyTUVfQd-1663499419139)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811160743980.png)]

我们再次查看,测试成功

 mysql -uroot -p2288 -e 'select * from a.ceshi;'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RDb4d08J-1663499419140)(C:/Users/mogu/AppData/Roaming/Typora/typora-user-images/image-20220811163154871.png)]

基于位置恢复

普通恢复很不错,但是有的时候一个备份中有错误的语句有正确的,我们需要更精确的操作来完成,我们通过指定的at后的号作为表示来完成恢复(当然选择表示号也是要有讲究的,需要选择开始前和提交后的)。

执行220行前的sql语句

mysqlbinlog --no-defaults --stop-position='22236' mysql-bin.000012 | mysql -u root -p

执行220行后的sql语句

mysqlbinlog --no-defaults --start-position='22236' mysql-bin.000012 | mysql -u root -p

执行10行后20行前的sql语句

mysqlbinlog --no-defaults --start-position='10172' --stop-position='11208' /opt/mysql-bin.000001 | mysql -u root -p

基于时间戳恢复

和上面一样,只是位置换成了时间

mysqlbinlog --no-defaults --start-datetime='2022-08-11 17:05:55' /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p
mysqlbinlog --no-defaults --stop-datetime='2022-08-11 17:05:55' /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p
mysqlbinlog --no-defaults --start-datetime='2022-08-11 17:05:55'--stop-datetime='2022-08-11 17:06:0'  /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p

faults --stop-datetime=‘2022-08-11 17:05:55’ /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p


mysqlbinlog --no-defaults --start-datetime=‘2022-08-11 17:05:55’–stop-datetime=‘2022-08-11 17:06:0’ /usr/local/mysql/data/mysql-bin.00001 |mysql -uroot -p


MySQL支持使用事务回滚/恢复数据。当一个事务失败时,可以使用回滚操作来撤销所有已经执行的操作,让数据库恢复到原来的状态。以下是回滚/恢复数据的方法: 1. 使用ROLLBACK语句: 可以使用ROLLBACK语句来回滚事务。它将撤销所有已经执行的操作,使数据库恢复到事务开始之前的状态。例如: ``` START TRANSACTION; UPDATE employees SET salary = salary + 1000 WHERE id = 1; UPDATE employees SET salary = salary - 500 WHERE id = 2; ROLLBACK; ``` 这里我们使用START TRANSACTION来开始一个事务,然后执行两个UPDATE语句来修改数据。最后,如果事务出现了问题,我们可以使用ROLLBACK来回滚事务。 2. 使用SAVEPOINT语句: 可以使用SAVEPOINT语句来创建一个保存点,以便在需要时回滚到该点。例如: ``` START TRANSACTION; UPDATE employees SET salary = salary + 1000 WHERE id = 1; SAVEPOINT my_savepoint; UPDATE employees SET salary = salary - 500 WHERE id = 2; ROLLBACK TO my_savepoint; COMMIT; ``` 这里我们使用START TRANSACTION来开始一个事务,然后执行两个UPDATE语句来修改数据。在第二个UPDATE语句之前,我们使用SAVEPOINT my_savepoint来创建一个保存点。最后,如果事务出现了问题,我们可以使用ROLLBACK TO my_savepoint来回滚到该保存点。 3. 使用MySQL Workbench: 如果您使用MySQL Workbench来管理MySQL数据库,可以使用其内置的恢复工具来回滚/恢复数据。在MySQL Workbench中,选择菜单“Server”->“Data Export”或“Data Import”,然后按照界面上的提示进行操作即可。 注意:回滚操作将撤销所有已经执行的操作,包括插入、更新和删除数据,而恢复操作只会恢复已经备份数据。因此,在执行回滚/恢复操作之前,请务必备份好重要数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值