中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql誤修改全表記錄怎么辦

發布時間:2021-11-02 16:51:22 來源:億速云 閱讀:312 作者:小新 欄目:MySQL數據庫

這篇文章給大家分享的是有關mysql誤修改全表記錄怎么辦的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

#添加數據

insert into testdb1.student(id,name,class,score) value(a,'a',1,45),(2,'b',1,46),(3,'c',2,89),(4,'d',2,90),(5,'e',3,67),(6,'f',3,87),(7,'g',4,77),(8,'h',4,91);

mysql> select * from testdb1.student;

+------+------+-------+-------+

| id   | name | class | score |

+------+------+-------+-------+

|    1 | a    | 1     |    45 |

|    2 | b    | 1     |    46 |

|    3 | c    | 2     |    89 |

|    4 | d    | 2     |    90 |

|    5 | e    | 3     |    67 |

|    6 | f    | 3     |    87 |

|    7 | g    | 4     |    77 |

|    8 | h    | 4     |    91 |

+------+------+-------+-------+

8 rows in set (0.00 sec)

#修改數據

update student set score=100;

commit;

mysql> select * from testdb1.student;

+------+------+-------+-------+

| id   | name | class | score |

+------+------+-------+-------+

|    1 | a    | 1     |   100 |

|    2 | b    | 1     |   100 |

|    3 | c    | 2     |   100 |

|    4 | d    | 2     |   100 |

|    5 | e    | 3     |   100 |

|    6 | f    | 3     |   100 |

|    7 | g    | 4     |   100 |

|    8 | h    | 4     |   100 |

+------+------+-------+-------+

8 rows in set (0.00 sec)

mysql> set global read_only=1

mysql> show master status\G

*************************** 1. row ***************************

             File: ray-bin.000004

         Position: 1992

     Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

# at 2192是在binlog日志中查到的 

[root@localhost ~]# mysqlbinlog /data/3306/logs/ray-bin.000004 -v -v -S /data/3306/soket/mysql.sock --base64-output=decode-rows | grep -A 15 student | sed -n '/# at 2192/,/COMMIT/p'| sed -n 's\### \\p' | sed "s/\/\*.*\*\///g" | sed 's/`//g'> /tmp/1.txt

[root@localhost ~]# cat /tmp/1.txt

UPDATE testdb1.student

WHERE

  @1=1

  @2='a'

  @3='1'

  @4=45

SET

  @1=1

  @2='a'

  @3='1'

  @4=100

UPDATE testdb1.student

WHERE

  @1=2

  @2='b'

  @3='1'

  @4=46

SET

  @1=2

  @2='b'

  @3='1'

  @4=100

UPDATE testdb1.student

WHERE

  @1=3

  @2='c'

  @3='2'

  @4=89

SET

  @1=3

  @2='c'

  @3='2'

  @4=100

UPDATE testdb1.student

WHERE

  @1=4

  @2='d'

  @3='2'

  @4=90

SET

  @1=4

  @2='d'

  @3='2'

  @4=100

UPDATE testdb1.student

WHERE

  @1=5

  @2='e'

  @3='3'

  @4=67

SET

  @1=5

  @2='e'

  @3='3'

  @4=100

UPDATE testdb1.student

WHERE

  @1=6

  @2='f'

  @3='3'

  @4=87

SET

  @1=6

  @2='f'

  @3='3'

  @4=100

UPDATE testdb1.student

WHERE

  @1=7

  @2='g'

  @3='4'

  @4=77

SET

  @1=7

  @2='g'

  @3='4'

  @4=100

UPDATE testdb1.student

WHERE

  @1=8

  @2='h'

  @3='4'

  @4=91

SET

  @1=8

  @2='h'

  @3='4'

  @4=100

[root@localhost ~]# cat column.txt

id

name

class

score

[root@localhost ~]# cat getSQL.sh

#!/bin/bash

# by ray


iswhere=1   #判斷循環的行的位置,1表示在where后,0表示不再where后

colNum=0    #計算列數,一般在binlog日志內第一列為@1,第二列為@2一次類推

whereNum=0  #判斷where后面字段出現的次數,便于拼接字符串,第一次出現不適用都會,第二次以后使用逗號拼接

setNum=0 #判斷set后面字段出現的次數,便于拼接字符串,第一次出現不適用都會,第二次以后使用逗號拼接


replaceColumn(){   #把@開頭的列替換為列配置文件內的列,安配置文件的順序執行

     cat $1 | while read line

     do

          colNum=$[${colNum}+1]

          sed -i "s/@${colNum}/${line}/g" ./execSQL.sql  #替換列

     done

}


getSQL(){   #獲取sql

     sql1=''

     sql_result=''

     sql_condition=''

     while read line #讀取處理過的binlog日志

     do

          if [[ ${line} =~ 'UPDATE' ]];then     #匹配是否update

               if [ "${sql1}" != "" ];then

                    echo ${sql1}' '${sql_result}' '${sql_condition}';' >> ./execSQL.sql  #打印sql

                    sql1=''

                    sql_result=''

                    sql_condition=''

                    whereNum=0

                    setNum=0

               fi

             sql1=${line}        #拼接sql字符串,獲取update

        elif [[ ${line} =~ 'WHERE' ]];then

             sql_condition=${line}   #拼接字符串,把binlog日志內where后面內容

             iswhere=1               #判斷是否為where,因為要把where和set后面的內容互換

        elif [[ ${line} =~ 'SET' ]];then

             sql_result=' SET '${sql_result} #拼接字符串

             iswhere=0

        elif [[ ${iswhere} -eq 1 ]];then            #1為where后面,把binlog日志where后面的內容拼接到sql的set后

             if [[ ${whereNum} -eq 0 ]];then              #判斷where字符串后的字符串是否一次出現

                  sql_result=${sql_result}' '${line}

                  whereNum=1                    #設置為1,表示不是第一次出現

             elif [[ ${whereNum} -eq 1 ]];then

                  sql_result=${sql_result}', '${line}

             fi

        elif [[ ${iswhere} -eq 0 ]];then           #判斷是否為set后面的字符串

             if [[ ${setNum} -eq 0 ]];then               #判斷set字符串后的字符串是否一次出現

                  sql_condition=${sql_condition}' '${line}

                  setNum=1                     #設置為1,表示不是第一次出現

             elif [[ ${setNum} -eq 1 ]];then

                  sql_condition=${sql_condition}' and '${line}

             fi

        fi

     done < $1   #把文件用while循環讀取每一行

     echo ${sql1}' '${sql_result}' '${sql_condition}';' >> ./execSQL.sql    #最后一行退出循環,所以要打印最后一行

     echo "commit;" >> ./execSQL.sql

     replaceColumn $2

}



#腳本的入口,調用函數獲取內容

if [ -e $1 ];then  #判斷第一個參數是否為文件

     getSQL $1 $2

else

    echo $1' is not a file!!'

fi

[root@localhost ~]# bash getSQL.sh '/tmp/1.txt' "./column.txt"

mysql> select * from testdb1.student;

+------+------+-------+-------+

| id   | name | class | score |

+------+------+-------+-------+

|    1 | a    | 1     |   100 |

|    2 | b    | 1     |   100 |

|    3 | c    | 2     |   100 |

|    4 | d    | 2     |   100 |

|    5 | e    | 3     |   100 |

|    6 | f    | 3     |   100 |

|    7 | g    | 4     |   100 |

|    8 | h    | 4     |   100 |

+------+------+-------+-------+

8 rows in set (0.00 sec)

[root@localhost ~]# mysql -uroot -p123456 -S /data/3306/soket/mysql.sock < /root/execSQL.sql

mysql: [Warning] Using a password on the command line interface can be insecure.

mysql> select * from testdb1.student;

+------+------+-------+-------+

| id   | name | class | score |

+------+------+-------+-------+

|    1 | a    | 1     |    45 |

|    2 | b    | 1     |    46 |

|    3 | c    | 2     |    89 |

|    4 | d    | 2     |    90 |

|    5 | e    | 3     |    67 |

|    6 | f    | 3     |    87 |

|    7 | g    | 4     |    77 |

|    8 | h    | 4     |    91 |

+------+------+-------+-------+

8 rows in set (0.00 sec)

感謝各位的閱讀!關于“mysql誤修改全表記錄怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿瓦提县| 新竹县| 金湖县| 宿州市| 永寿县| 贵阳市| 古丈县| 宜丰县| 获嘉县| 远安县| 高阳县| 布拖县| 平舆县| 阳泉市| 钟山县| 海阳市| 扎囊县| 太原市| 金门县| 万州区| 罗甸县| 宜兰县| 中西区| 榆社县| 太谷县| 灵石县| 盐山县| 北安市| 双辽市| 饶河县| 河曲县| 吕梁市| 武威市| 揭阳市| 建阳市| 留坝县| 通江县| 镇江市| 神木县| 长海县| 玉门市|