共計(jì) 4337 個(gè)字符,預(yù)計(jì)需要花費(fèi) 11 分鐘才能閱讀完成。
這篇文章給大家分享的是有關(guān) mysql 誤修改全表記錄怎么辦的內(nèi)容。丸趣 TV 小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨丸趣 TV 小編過(guò)來(lái)看看吧。
#添加數(shù)據(jù)
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)
#修改數(shù)據(jù)
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 # 判斷循環(huán)的行的位置,1 表示在 where 后,0 表示不再 where 后
colNum=0 # 計(jì)算列數(shù),一般在 binlog 日志內(nèi)第一列為 @1, 第二列為 @2 一次類推
whereNum=0 # 判斷 where 后面字段出現(xiàn)的次數(shù),便于拼接字符串,第一次出現(xiàn)不適用都會(huì),第二次以后使用逗號(hào)拼接
setNum=0 #判斷 set 后面字段出現(xiàn)的次數(shù),便于拼接字符串,第一次出現(xiàn)不適用都會(huì),第二次以后使用逗號(hào)拼接
replaceColumn(){ # 把 @開(kāi)頭的列替換為列配置文件內(nèi)的列,安配置文件的順序執(zhí)行
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 #讀取處理過(guò)的 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 日志內(nèi) where 后面內(nèi)容
iswhere=1 # 判斷是否為 where,因?yàn)橐?where 和 set 后面的內(nèi)容互換
elif [[${line} =~ SET ]];then
sql_result= SET ${sql_result} #拼接字符串
iswhere=0
elif [[${iswhere} -eq 1 ]];then #1 為 where 后面,把 binlog 日志 where 后面的內(nèi)容拼接到 sql 的 set 后
if [[${whereNum} -eq 0 ]];then # 判斷 where 字符串后的字符串是否一次出現(xiàn)
sql_result=${sql_result} ${line}
whereNum=1 # 設(shè)置為 1,表示不是第一次出現(xiàn)
elif [[${whereNum} -eq 1 ]];then
sql_result=${sql_result} , ${line}
fi
elif [[${iswhere} -eq 0 ]];then # 判斷是否為 set 后面的字符串
if [[${setNum} -eq 0 ]];then # 判斷 set 字符串后的字符串是否一次出現(xiàn)
sql_condition=${sql_condition} ${line}
setNum=1 # 設(shè)置為 1,表示不是第一次出現(xiàn)
elif [[${setNum} -eq 1 ]];then
sql_condition=${sql_condition} and ${line}
fi
fi
done $1 # 把文件用 while 循環(huán)讀取每一行
echo ${sql1} ${sql_result} ${sql_condition} ./execSQL.sql # 最后一行退出循環(huán),所以要打印最后一行
echo commit; ./execSQL.sql
replaceColumn $2
}
#腳本的入口,調(diào)用函數(shù)獲取內(nèi)容
if [-e $1];then # 判斷第一個(gè)參數(shù)是否為文件
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)
感謝各位的閱讀!關(guān)于“mysql 誤修改全表記錄怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!