通过binlog恢复误update的数据(一)

1.1 先说明故障

01:生产环境上,使用update命令误更新了一条记录中的单个字段的值;
02:生产环境上是开启了binlog日志的,模式为row模式;未开启gtid;
03:需要进行数据恢复,mysql服务肯定是不能停止的了;


1.2 数据库环境

#### 数据库版本、binlog的配置
mysql> select @@version,@@global.log_bin,@@global.log_bin_basename,@@binlog_format;
+------------+------------------+------------------------------------------+-----------------+
| @@version  | @@global.log_bin | @@global.log_bin_basename                | @@binlog_format |
+------------+------------------+------------------------------------------+-----------------+
| 5.7.28-log |                1 | /data/mysql/3306/logs/binlog/21_mysql_bin| ROW             |
+------------+------------------+------------------------------------------+-----------------+
1 row in set (0.00 sec)


#### binlog的其它配置
mysql> select @@global.binlog_row_image,@@binlog_rows_query_log_events;
+---------------------------+--------------------------------+
| @@global.binlog_row_image | @@binlog_rows_query_log_events |
+---------------------------+--------------------------------+
| FULL                      |                              1 |
+---------------------------+--------------------------------+
1 row in set (0.00 sec)


#### 特别说明
binlog_row_image   
  # 默认值是full,对inset\update\delete语句进行详细的记录
binlog_rows_query_log_events
  # 默认值是off,针对row模式,可在线设置;若为on可以在mysql中用show binlog events in "二
  # 进制日志文件名";命令查看二进制日志# 文件中记录的DML语句和其它信息;


#### 当前binlog日志的状态
mysql> show master status\G
*************************** 1. row ***************************
             File: 21_mysql_bin.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)


1.3 源数据模拟

#### 创建lili库,并进入到lili库下面
create database if not exists lili character set utf8 collate utf8_general_ci;
use lili;


#### 创建test1表
create table if not exists test1(
  id int unsigned not null auto_increment comment"序列",
  name varchar(20) not null comment"姓名",
  sex enum("男","女") not null comment"性别",
  age tinyint unsigned not null comment"年龄",
  height float(5,2) not null comment"身高",
  weight float(5,2) not null comment"体重",
  gr_sc varchar(30) not null comment"毕业院校",
  education varchar(10) not null comment"学历",
  phone char(11) not null comment"电话号码",
  email varchar(30) not null comment"邮箱",
  salary float(9,2) unsigned not null comment"薪资",
  primary key(id)
)engine=innodb character set utf8 collate utf8_general_ci comment"测试表1";


#### 查看test1表的表结构
mysql> desc test1;
+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| id        | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| name      | varchar(20)         | NO   |     | NULL    |                |
| sex       | enum('男','女')     | NO   |     | NULL    |                |
| age       | tinyint(3) unsigned | NO   |     | NULL    |                |
| height    | float(5,2)          | NO   |     | NULL    |                |
| weight    | float(5,2)          | NO   |     | NULL    |                |
| gr_sc     | varchar(30)         | NO   |     | NULL    |                |
| education | varchar(10)         | NO   |     | NULL    |                |
| phone     | char(11)            | NO   |     | NULL    |                |
| email     | varchar(30)         | NO   |     | NULL    |                |
| salary    | float(9,2) unsigned | NO   |     | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
  # 注意:id字段为auto_increment,sex字段为enum数据类型
  # 注意:sex字段的数据类型为enum


#### 往test1表中插入几条数据
insert into test1(name,sex,age,height,weight,gr_sc,education,phone,email,salary) values
("cl01","男",21,171,65.5,"四川信息1","专科","18382024221","158317096@qq.com",6000),
("cl02","男",22,172,65.5,"四川信息2","专科","18382024222","158317096@qq.com",6200),
("cl03","男",23,173,65.5,"四川信息3","专科","18382024223","158317096@qq.com",6300),
("cl04","男",24,174,65.5,"四川信息4","专科","18382024224","158317096@qq.com",6400),
("cl05","男",25,175,65.5,"四川信息5","专科","18382024225","158317096@qq.com",6500),
("cl06","男",26,176,65.5,"四川信息6","专科","18382024226","158317096@qq.com",6600),
("cl07","男",27,177,65.5,"四川信息7","专科","18382024227","158317096@qq.com",6700),
("cl08","男",28,178,65.5,"四川信息8","专科","18382024228","158317096@qq.com",6800),
("cl09","男",29,179,65.5,"四川信息9","专科","18382024229","158317096@qq.com",6900),
("cl10","男",30,180,65.5,"四川信息10","专科","18382024230","158317100@qq.com",7000);
commit;


#### 查看test1表中的数据
mysql> select * from test1;
+----+------+-----+-----+--------+--------+----------------+-----------+-------------+------------------+---------+
| id | name | sex | age | height | weight | gr_sc          | education | phone       | email            | salary  |
+----+------+-----+-----+--------+--------+----------------+-----------+-------------+------------------+---------+
|  1 | cl01 ||  21 | 171.00 |  65.50 | 四川信息1        | 专科      | 18382024221 | 158317096@qq.com | 6000.00 |
|  2 | cl02 ||  22 | 172.00 |  65.50 | 四川信息2        | 专科      | 18382024222 | 158317096@qq.com | 6200.00 |
|  3 | cl03 ||  23 | 173.00 |  65.50 | 四川信息3        | 专科      | 18382024223 | 158317096@qq.com | 6300.00 |
|  4 | cl04 ||  24 | 174.00 |  65.50 | 四川信息4        | 专科      | 18382024224 | 158317096@qq.com | 6400.00 |
|  5 | cl05 ||  25 | 175.00 |  65.50 | 四川信息5        | 专科      | 18382024225 | 158317096@qq.com | 6500.00 |
|  6 | cl06 ||  26 | 176.00 |  65.50 | 四川信息6        | 专科      | 18382024226 | 158317096@qq.com | 6600.00 |
|  7 | cl07 ||  27 | 177.00 |  65.50 | 四川信息7        | 专科      | 18382024227 | 158317096@qq.com | 6700.00 |
|  8 | cl08 ||  28 | 178.00 |  65.50 | 四川信息8        | 专科      | 18382024228 | 158317096@qq.com | 6800.00 |
|  9 | cl09 ||  29 | 179.00 |  65.50 | 四川信息9        | 专科      | 18382024229 | 158317096@qq.com | 6900.00 |
| 10 | cl10 ||  30 | 180.00 |  65.50 | 四川信息10       | 专科      | 18382024230 | 158317100@qq.com | 7000.00 |
+----+------+-----+-----+--------+--------+----------------+-----------+-------------+------------------+---------+
10 rows in set (0.00 sec)


1.4 故障模拟

#### 更新了name字段等于chenliang08,条件是id等于8
mysql> select * from lili.test1 where id=8;
+----+------+-----+-----+--------+--------+---------------+-----------+-------------+------------------+---------+
| id | name | sex | age | height | weight | gr_sc         | education | phone       | email            | salary  |
+----+------+-----+-----+--------+--------+---------------+-----------+-------------+------------------+---------+
|  8 | cl08 ||  28 | 178.00 |  65.50 | 四川信息8       | 专科      | 18382024228 | 158317096@qq.com | 6800.00 |
+----+------+-----+-----+--------+--------+---------------+-----------+-------------+------------------+---------+
1 row in set (0.00 sec)


mysql> update lili.test1 set name="chenliang08" where id=8;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from lili.test1 where id=8;
+----+-------------+-----+-----+--------+--------+---------------+-----------+-------------+------------------+---------+
| id | name        | sex | age | height | weight | gr_sc         | education | phone       | email            | salary  |
+----+-------------+-----+-----+--------+--------+---------------+-----------+-------------+------------------+---------+
|  8 | chenliang08 ||  28 | 178.00 |  65.50 | 四川信息8       | 专科      | 18382024228 | 158317096@qq.com | 6800.00 |
+----+-------------+-----+-----+--------+--------+---------------+-----------+-------------+------------------+---------+
1 row in set (0.00 sec)


mysql> commit;
Query OK, 0 rows affected (0.00 sec)


#### 当前业务还在产生数据
insert into lili.test1(name,sex,age,height,weight,gr_sc,education,phone,email,salary) values
("cl11","男",21,171,65.5,"四川信息11","专科","18382024211","158317096@qq.com",6000);
commit;


1.5 解决思路

01:在得知使用update更新错了一条记录中单个字段的数据时,应马上要做的事情:
    A:使用show master status;命令查看看当前binlog是哪个文件,并记录下来;
    B:执行flush logs命令重新生成新的binlog日志文件来记录sql语句产生的记录;
    C:确定删除数据的命令是什么,这里是:update lili.test1 set name="chenliang08" where id=8;

02:对lili.test1表中id等于8的记录加一个"意向共享锁(IS)",严格按照事务流程来,不要结束事务,不要退出当前会话;
   start transaction;
     select * from lili.test1 where id=8 lock in share mode;
   ....不要结束事务,不要退出当前会话........................

03:对"01阶段中""A步骤"中的binlog日志做备份(复制一份到其它目录下,防止损坏源文件);

04:在mysql中使用"show binlog events in "01阶段中A步骤记录的binlog文件名";"命令找到
    update lili.test1 set name="chenliang08" where id=8;这条语句(事务)的起始/结束pos点
    
05:用mysqlbinlog命令结合"04阶段"找到的起始pos点和结束pos点对03步骤复制的binlog文件进行解析并生成新的文件;
    
06:在"05阶段"中新生成的文件中进行处理; 但得在最终的sql文件中还得添加些内容;
    -- 在文件的第1行和2行加上以下内容;
       start transaction;
       select * from lili.test1 where id=8 for update;
       
   -- 在文件的末属加上
       commit;

07:结束"02阶段"的事务; 

08:将"06阶段"处理的数据,在mysql实例中执行;


1.6 故障处理步骤

解决思路中的01阶段

#### 查看当前binlog的信息,并记录下来
mysql> show master status\G
*************************** 1. row ***************************
             File: 21_mysql_bin.000001
         Position: 4318
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

#### 执行命令重新生成binlog文件
mysql> flush logs;


解决思路中的02阶段

1


解决思路中的03阶段

[root@node21 ~]# cp -a /data/mysql/3306/logs/binlog/21_mysql_bin.000001 /tmp/
[root@node21 ~]# ll /tmp/21_mysql_bin.000001 
-rw-r----- 1 mysql mysql 4368 Jul  7 20:26 /tmp/21_mysql_bin.000001


解决思路中的04阶段

2最终的结果是:开始的pos点为:3245 结束的pos点:3757


解决思路中的05阶段

##### 进入到之前备份binlog文件的目录
[root@node21 tmp]# pwd
/tmp
[root@node21 tmp]# ll 21_mysql_bin.000001 
-rw-r----- 1 mysql mysql 2017 3月   3 19:22 21_mysql_bin.000001

#### 对binlog日志进行解释并保存到a.txt文件中
[root@node21 tmp]# mysqlbinlog --base64-output=decode-rows -vv --start-position=3245 --stop-position=3757 21_mysql_bin.000001 >a.txt


解决思路中的06阶段

############################# 处理 a.txt文件,生成 b.txt文件 ######################
[root@node21 tmp]# sed -n '/^###/'p a.txt >b.txt
[root@node21 tmp]# cat b.txt 
### UPDATE `lili`.`test1`
### WHERE
###   @1=8 /* INT meta=0 nullable=0 is_null=0 */
###   @2='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
###   @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
###   @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
###   @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */
### SET
###   @1=8 /* INT meta=0 nullable=0 is_null=0 */
###   @2='chenliang08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
###   @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
###   @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
###   @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
###   @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */


############################# 处理 b.txt文件,生成 c.txt文件 ######################
[root@node21 tmp]# sed 's/### //g' b.txt >c.txt
[root@node21 tmp]# cat c.txt 
UPDATE `lili`.`test1`
WHERE
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */
SET
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='chenliang08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */



############################# 处理 c.txt文件,生成 d.txt文件 ####################
[root@node21 tmp]# sed '/WHERE/{:a;N;/SET/!ba;s#WHERE#set#g}' c.txt  >d.txt
[root@node21 tmp]# cat d.txt 
UPDATE `lili`.`test1`
set
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */
SET
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='chenliang08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */


############################# 处理 d.txt文件,生成 e.txt文件 ##################
[root@node21 tmp]# sed '/SET/{:a;N;/\n/!ba;s#SET#where#g}' d.txt >e.txt
[root@node21 tmp]# cat e.txt 
UPDATE `lili`.`test1`
set
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */
where
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='chenliang08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */

################ 处理 e.txt文件,生成 f.txt文件,对 f.txt文件处理后生成 i.txt #############
01:执行的update命令为:update lili.test1 set name="chenliang08" where id=8;

02:查看lili.tst1表的表结构
mysql> desc lili.test1;
+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| id        | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| name      | varchar(20)         | NO   |     | NULL    |                |
| sex       | enum('男','女')      | NO   |     | NULL    |                |
| age       | tinyint(3) unsigned | NO   |     | NULL    |                |
| height    | float(5,2)          | NO   |     | NULL    |                |
| weight    | float(5,2)          | NO   |     | NULL    |                |
| gr_sc     | varchar(30)         | NO   |     | NULL    |                |
| education | varchar(10)         | NO   |     | NULL    |                |
| phone     | char(11)            | NO   |     | NULL    |                |
| email     | varchar(30)         | NO   |     | NULL    |                |
| salary    | float(9,2) unsigned | NO   |     | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)

03:对e.txt文件做处理,生成f.txt文件
[root@node21 tmp]# sed '/set/{:a;N;/where/!ba;s#@2=#name=#g}' e.txt >f.txt
[root@node21 tmp]# cat f.txt 
UPDATE `lili`.`test1`
set
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  name='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */
where
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='chenliang08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */

[root@node21 tmp]# sed '/where/{:a;N;/\n/!ba;s#@1=#id=#g}' f.txt >i.txt
[root@node21 tmp]# cat i.txt 
UPDATE `lili`.`test1`
set
  @1=8 /* INT meta=0 nullable=0 is_null=0 */
  name='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */
where
  id=8 /* INT meta=0 nullable=0 is_null=0 */
  @2='chenliang08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
  @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
  @4=28 /* TINYINT meta=0 nullable=0 is_null=0 */
  @5=178                  /* FLOAT meta=4 nullable=0 is_null=0 */
  @6=65.5                 /* FLOAT meta=4 nullable=0 is_null=0 */
  @7='四川信息8' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @8='专科' /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
  @9='18382024228' /* STRING(33) meta=65057 nullable=0 is_null=0 */
  @10='158317096@qq.com' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
  @11=6800                 /* FLOAT meta=4 nullable=0 is_null=0 */


############################# 处理 i.txt文件,生成 j.txt文件 ####################
[root@node21 tmp]# sed '/@/'d i.txt >j.txt
[root@node21 tmp]# cat j.txt 
UPDATE `lili`.`test1`
set
  name='cl08' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */
where
  id=8 /* INT meta=0 nullable=0 is_null=0 */

############################# 处理 j.txt文件,生成 k.txt文件 ##################
[root@node21 tmp]# sed 's#/.*##g' j.txt >k.txt
[root@node21 tmp]# cat k.txt 
UPDATE `lili`.`test1`
set
  name='cl08' 
where
  id=8
############################# 处理 k.txt文件,生成 aa.sql文件 ##################
[root@node21 tmp]# sed -r 's#(id=.*)#\1;#g' k.txt >>aa.sql
[root@node21 tmp]# cat aa.sql 
UPDATE `lili`.`test1`
set
  name='cl08' 
where
  id=8 ; 

############################# 在aa.sql文件前面添加相关内容 #################
[root@node21 tmp]# sed -i '1i start transaction;\nselect * from lili.test1 where id=8 for update;\n' aa.sql 
[root@node21 tmp]# cat aa.sql 
start transaction;
select * from lili.test1 where id=8 for update;

UPDATE `lili`.`test1`
set
  name='cl08' 
where
  id=8 ;

############################# 在aa.sql文件后面追加commit;命令#################
[root@node21 tmp]# sed -i '$a \\ncommit;' aa.sql 
[root@node21 tmp]# cat aa.sql 
start transaction;
select * from lili.test1 where id=8 for update;

UPDATE `lili`.`test1`
set
  name='cl08' 
where
  id=8 ;

commit;


解决思路中的07阶段

3


解决思路中的08阶段

4

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值