共计 4337 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章给大家分享的是有关 mysql 误修改全表记录怎么办的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
#添加数据
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 误修改全表记录怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!