mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
一. 概述
在上篇讲到了逻辑备份,使用mysqldump工具来备份一个库,并使用完全恢复还原了数据库。在结尾也讲到了误操作是不能用完全恢复的。解决办法是:我们需要恢复到误操作之前的状态,然后跳过误操作语句。再恢复后面执行的语句,完成我们的恢复,这种恢复叫“不完全恢复”。在mysql 中,不完全恢复分为基于时间点的恢复和基于位置的恢复。
1.1 基于时间点恢复步骤
下面来模拟基于时间点恢复,操作步骤如下:
(1)先逻辑备份一个库。
(2)模拟用户操作一些数据。
(3)误操作发生,记住时间点。
(4)还原备份库。
(5)使用mysqlbinlog --stop-datetime恢复到误操作前的时间点。
(6)跳过误操作时间点,使用mysqlbinlog --start-datetime继续执行后面的binlog,完成恢复。
1.2 基于时间点恢复演示
下面以test库的testbackup表为例,该表有6条数据,如下图所示:
-- 共6条数据
SELECT * FROM testbackup
-- 当前log文件序号是:mysql-bin.000040
SHOW MASTER STATUS
步骤1:备份test库,先定位到/usr/local/mysql/data目录下,备份完成后此时的log文件序号mysql-bin.000041,备份脚本下图所示:
[root@hsr data]# pwd
/usr/local/mysql/data
[root@hsr data]# mysqldump -uroot -p --single-transaction -F test > test.dmp
Enter password:
[root@hsr data]# ls -l test.dmp
-rw-r--r-- root root 9月 : test.dmp
步骤2: 进行正常用户操作,新增了二条数据,此时表中共8条数据。
INSERT INTO testbackup VALUES(7,'田七')
INSERT INTO testbackup VALUES(8,'小康')
步骤3:误操作发生,删除了一条数据id为3的,此时表中共7条数据,误删除时间点是10:01分钟
DELETE FROM testbackup WHERE id=3
步骤4:还原数据库后,此时testbackup表只有最初的6条数据
[root@hsr data]# mysql -uroot -p test < test.dmp
Enter password:
步骤:5和6
-- 切换到binlog日志目录下
[root@hsr mysql]# pwd
/var/lib/mysql -- 恢复到误操作前的时间点
[root@hsr mysql]# mysqlbinlog --stop-datetime="2018-09-26 9:59:59" mysql-bin. | mysql -uroot -p
Enter password: -- 跳过误操作时间点,继续执行后面的binlog
[root@hsr mysql]# mysqlbinlog --start-datetime="2018-09-26 10:02:59" mysql-bin. | mysql -uroot -p
Enter password:
最后经过上面的步骤,误操作恢复完成了,最后查看该表的数据如下。
SELECT * FROM testbackup
1.3 基于位置的恢复
与时间点的恢复不同,基于位置的恢复更加精确,因为一个时间点可能有很多条sql语句同时执行。下面模拟操作步骤:1,2,3,4操作步骤与上面相同。
(5) 分析误位置行号
方法1:对于大日志文件,将误操作时间点范围内(2-5分钟)的binlog日志复制到另一个小文件中,方便查找分析位置行号。
方法2:对于小日志文件,使用SHOW BINLOG EVENTS 查看误操作位置行号,前提是需要在my.cnf中设置binlog_rows_query_log_events=1
(6) 使用mysqlbinlog --stop-position恢复到误操作前的位置号。
(7) 跳过误操作位置号,使用mysqlbinlog --start-position继续执行后面的binlog,完成恢复。
1.4基于位置的恢复演示
-- 共8条数据
SELECT * FROM testbackup
-- 当前mysql-bin.000041
SHOW MASTER STATUS
步骤1:备份test库,先定位到/usr/local/mysql/data目录下,备份完成后此时的log文件序号mysql-bin.000042,备份脚本下图所示:
[root@hsr data]# pwd
/usr/local/mysql/data
[root@hsr data]# mysqldump -uroot -p --single-transaction -F test > test2.dmp
Enter password:
[root@hsr data]# ls -l test2.dmp
-rw-r--r-- 1 root root 321286 9月 26 14:02 test2.dmp
步骤2:进行正常用户操作,新增了二条数据,此时表中共10条数据。
INSERT INTO testbackup VALUES(9,'小王')
INSERT INTO testbackup VALUES(10,'小李')
步骤3:误操作发生,删除了一条数据id为5的,此时表中共9条数据,误删除时间点是14:06分钟
DELETE FROM testbackup WHERE id=5
步骤4:还原数据库后,此时testbackup只有最初的8条数据
[root@hsr data]# mysql -uroot -p test < test2.dmp
Enter password:
步骤5:分析误位置位置行号
-- 方法1:
[root@hsr mysql]# pwd
/var/lib/mysql
[root@hsr mysql]# touch tmp.sql
mysqlbinlog --base64-output=decode-row -v --start-datetime="2018-09-26 14:05:59" --stop-datetime="2018-09-26 14:07:59" mysql-bin. > tmp.sql
[root@hsr mysql]# more tmp.sql
查看tmp.sql文件,找到删除的时间是14:06:22时,开始位置是1077,结束位置是1155。
-- 方法2:
SHOW BINLOG EVENTS IN 'mysql-bin.000042';
这里找到真正删除行是1077, commit提交后下一行1155。
步骤6-7:
[root@hsr mysql]# mysqlbinlog --stop-position="" mysql-bin. | mysql -uroot -p
WARNING: The range of printed events ends with a row event or a table map event that does not have the STMT_END_F flag set.
This might be because the last statement was not fully written to the log, or because you are using a --stop-position or --stop-datetime
that refers to an event in the middle of a statement. The event(s) from the partial statement have not been written to output.
Enter password:
[root@hsr mysql]# mysqlbinlog --start-position="" mysql-bin. | mysql -uroot -p
Enter password:
[root@hsr mysql]#
最后经过上面的步骤,误操作恢复完成了,最后查看该表的数据如下。
SELECT * FROM testbackup
mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)的更多相关文章
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- mysql 开发进阶篇系列 48 物理备份与恢复(xtrabackup 的增量备份与恢复,以及备份总结)
一.增量备份概述 xtrabackup 和innobackupex 二个工具都支持增量备份,这意味着能复制自上次备份以来更改的数据.可以在每个完整备份之间执行许多增量备份,因此,您可以设置一个备份 ...
- mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
一. 安装说明 安装XtraBackup 2.4 版本有三种方式: (1) 存储库安装Percona XtraBackup(推荐) (2 )下载的rpm或apt包安装Percona XtraBacku ...
- mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)
一.概述 物理备份和恢复又分为冷备份和热备份.与逻辑备份相比,它最大优点是备份和恢复的速度更快.因为物理备份的原理都是基于文件的cp. 1.1 冷备份 冷备份就是停掉数据库服务.这种物理备份一般很少使 ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)
1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
随机推荐
- PM学习梳理--需求管理
- 低版本的Chrome,打开url时,报错,IE确可以打开;
解决办法:打开注册表,添加以下内容,之后重启服务器: [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters]Ena ...
- 20155312 张竞予 Exp6 信息搜集与漏洞扫描
Exp6 信息搜集与漏洞扫描 目录 基础问题回答 (1)哪些组织负责DNS,IP的管理. (2)什么是3R信息. (3)评价下扫描结果的准确性. 实验总结与体会 实践过程记录 (1)各种搜索技巧的应用 ...
- 初步了解学习flask轻量级框架,
关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...
- C++数论板题(弹药科技):Lengendre定理和欧拉函数
弹药科技 时间限制: 1 Sec 内存限制: 128 MB 题目描述 经过精灵族全力抵挡,精灵终于坚持到了联络系统的重建,于是精灵向人类求助, 大魔法师伊扎洛决定弓}用博士的最新科技来抗敌. 伊扎洛: ...
- sequence测试中的使用
1. create sequence : create sequence TEST_SEQUENCE minvalue 1 maxvalue 1000000000 start with 1 incre ...
- go语言的条件语句和循环语句
一,条件语句 常见的就是if语句: 单支条件语句: if 条件 :执行语句 (注,如果是没有逻辑运算符连接的话,是可以不需要括号的,也可以加上括号,如:if (条件):执行语句) 双支 ...
- 理解存储引擎MyISAM与InnoDB
1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...
- 通过shell脚本进行数据库操作
#!/bin/bash HOSTNAME="192.168.111.84" #数据库信息 PORT=" USERNAME="root" PASSWOR ...
- python random库
random模块 >>> import random #随机小数 >>> random.random() # 大于0且小于1之间的小数 0.766433866365 ...