系统运维
误删除数据的话,oracle里面我们可以使用闪回功能找回误操作的数据。
在mysql里面,如果我们有延迟从库的话,也可以找回之前的数据,但是有时候不太好使(因为追数据到误操作前的准确的时间点有时候也不太好把握)。
对于误操作数据的闪回,我们一般推荐 binlog2sql 或者myflash(美团点评开源的)
本篇文章, 我们介绍下 binlog2sql的用法:
binlog2sql 【首级推荐使用】
官网:https://github.com/danfengcao/binlog2sql
注意: binlog必须是row格式,并且是full类型的记录。
安装:?
yum?update?nss?curl?libcurl?-y?#?centos6需要升级下这个包,不然没法去github拉代码cd?/root/git?clone?https://github.com/danfengcao/binlog2sql.git?&&?cd?binlog2sqlpip?install?-r?requirements.txt
授权:
>?grant?select,?replication?slave,?replication?client?on?*.*?to?\\\'flashback\\\'@\\\'192.168.11.20\\\'?identified?by?\\\'admin\\\';
> use testdb;
[testdb] > select * from t_stud where name like \\\’y%\\\’;
——- ————— —– ——– ——— ———–
| stuid | name? ? ? ? ? | age | gender | classid | teacherid |
——- ————— —– ——– ——— ———–
|? ? ?5 | yu wutong? ? ?|? 26 | m? ? ? |? ? ? ?3 |? ? ? ? ?1 |
|? ? 10 | lee lingshan? |? 19 | f? ? ? |? ? ? ?3 |? ? ? null |
|? ? 11 | john chengzhi |? 23 | m? ? ? |? ? ? ?6 |? ? ? null |
——- ————— —– ——– ——— ———–
[testdb] > update t_stud set age=100 where name like \\\’y%\\\’;? ? — 看到有3行受到影响
query ok, 3 rows affected (0.01 sec)
rows matched: 3? changed: 3? warnings: 0
[testdb] > select * from t_stud where name like \\\’y%\\\’;
——- ————— —– ——– ——— ———–
| stuid | name? ? ? ? ? | age | gender | classid | teacherid |
——- ————— —– ——– ——— ———–
|? ? ?5 | yu wutong? ? ?| 100 | m? ? ? |? ? ? ?3 |? ? ? ? ?1 |
|? ? 10 | lee lingshan? | 100 | f? ? ? |? ? ? ?3 |? ? ? null |
|? ? 11 | john chengzhi | 100 | m? ? ? |? ? ? ?6 |? ? ? null |
——- ————— —– ——– ——— ———–
解析出标准sql:
cd?/root/?先用mysqlbinlog找到误操作的那个地方binlog文件及位移点,然后使用下面命令解析:python?/root/binlog2sql/binlog2sql/binlog2sql.py?-h292.168.11.20?-p3306?-uflashback?-p\\\'admin\\\'?-d?testdb?-t?t_stud?--start-file=\\\'mysql-bin.000040\\\'?--start-position=10030?--stop-position=10334
1 解析出回滚sql:
cd?/root/?python?/root/binlog2sql/binlog2sql/binlog2sql.py?--flashback?-h292.168.11.20?-p3306?-uflashback?-p\\\'admin\\\'?-d?testdb?-t?t_stud?--start-file=\\\'mysql-bin.000040\\\'?--start-position=10030?--stop-position=10334
解析出的结果类似这样:
update?`testdb`.`t_stud`?set?`stuid`=11,?`name`=\\\'john?chengzhi\\\',?`age`=23,?`gender`=\\\'m\\\',?`classid`=6,?`teacherid`=null?where?`stuid`=11?and?`name`=\\\'john?chengzhi\\\'?and?`age`=100?and?`gender`=\\\'m\\\'?and?`classid`=6?and?`teacherid`?is?null?limit?1;?#start?10030?end?10334?time?2018-07-15?14:17:58update?`testdb`.`t_stud`?set?`stuid`=10,?`name`=\\\'lee?lingshan\\\',?`age`=19,?`gender`=\\\'f\\\',?`classid`=3,?`teacherid`=null?where?`stuid`=10?and?`name`=\\\'lee?lingshan\\\'?and?`age`=100?and?`gender`=\\\'f\\\'?and?`classid`=3?and?`teacherid`?is?null?limit?1;?#start?10030?end?10334?time?2018-07-15?14:17:58update?`testdb`.`t_stud`?set?`stuid`=5,?`name`=\\\'yu?wutong\\\',?`age`=26,?`gender`=\\\'m\\\',?`classid`=3,?`teacherid`=1?where?`stuid`=5?and?`name`=\\\'yu?wutong\\\'?and?`age`=100?and?`gender`=\\\'m\\\'?and?`classid`=3?and?`teacherid`=1?limit?1;?#start?10030?end?10334?time?2018-07-15?14:17:58
2 修复下数据,去掉结尾的#及后面的内容:
sed?-i.bak\\\'s/#.*//g\\\'?/root/rollback.sql
3 将数据恢复到数据库中:
use?testdb?;update?`testdb`.`t_stud`?set?`s