update忘了加where条件,不小心把oracle数据库里某张表的全表数据都更新了怎么办?

Posted 做一个不邋遢的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了update忘了加where条件,不小心把oracle数据库里某张表的全表数据都更新了怎么办?相关的知识,希望对你有一定的参考价值。

问题描述:数据库突然出问题了,一张物资价格表全部更新成了同一个价格,13万条数据

跟大家分享一下我自己跳的坑,希望对遇到类似问题的小伙伴有一点点帮助。ps:属于技术比较low的,所以自己进的坑比较深,解决方法可以直接看6和8

1.首先客户有数据库备份,每天凌晨都有数据库备份,我们没有dba权限,客户通过数据库监控日志查出18号有一个13万数据的update没有加where条件,给了我备份的数据库文件。

2.创建了新的表空间,表用户,导入18号的数据库(我的电脑上装了oracle服务)

eg:创建test用户,密码test222,使用创建的表空间USERS,给创建的test用户分配dba权限

create tablespace USERS
logging
datefile \'D:\\oracle\\product\\10.2.0\\oradata\\orcl\\USERS.dnf\'
size 32m
autoxtend on
next 32m maxsize 2048m
extend management local;
create user test identifiles by test222
default tablespace USERS
grant dba to test;(直接网上搜的小伙伴们的分享)

imp test/test222@localhost/orcl file="C:\\Users\\xiejiachen\\Desktop\\test20190630.DMP" full =y;

test:用户名,test222:密码,localhost: 本机数据库,远程导入需要替换成ip地址,orcl: 是实例的名称,file: dmp的文件路径,full=y:全部导入

3.把18号数据库里的物资表t_sys_material导出,用的是plsql导出,还是比较慢的,但是比数据导入快很多了,需要大概10分钟以内的时间(13万数据)

plsql 点击工具--导出表,选择你需要导出的表,选中,选择中间选项sql插入,可以改变每次提交的行数,之后导入的时候会根据这个插入100条或者1000条提交一次,盗用一张别的小伙伴的图片,给大家看一下

 

4.表数据导入,跟导出类似,工具--导入表--选择sql插入--选择刚才导出的sql文件--导入,速度真的是超级慢啊(以至于后来我都想骂自己蠢了)

 

 实在太慢了,所以尝试其他方法,把导入停掉了。重点说一下自己给自己挖的坑,导出的sql文件里会有删除表数据的语句,就是如果我从18号数据库导出表t_sys_material里的数据,然后往我正式库61(数据库昵称)上导,会把我61上t_sys_material表里原来的数据都干掉,再往里面导,这个大家可以先把表名改了导出,这样导到61库上就不会覆盖原来的数据了(我是改了表名,但是是导出数据后改的,把自己61上的数据覆盖掉了,唉,依然是想骂自己)

5.找了一个新的导入方法,用cmd导入sql文件,但是乱码了,我本地的编码和正式库不一致,后来按照网上大神说的方法改了编码,重新导出,然后cmd导入sql还是不行,不知道是不是plsql导出sql文件的锅,没再研究,又换了方法(2333....)。以下是cmd导入sql文件的方法,但是也很慢,13万数据两个多小时

cmd 进入 命令窗口
输入:sqlplus
用户名:
密码:
进入后 输入
conn 用户名/密码@ip地址:端口号/数据库名称(实例哈)
回车
输入 @F:\\R1TEST.sql(你的文件的位置)
直接回车 就ok了

 

 

 

 

6.直接导出pdm文件,这种方法快的多了 ,具体导入要多久我没试过,不过肯定会很快的,导入整个数据库都挺快的

导出   exp  用户名/密码@ip地址:端口号/数据库名称    file=D:\\XXX.dmp tables=t_sys_material full=y

导入   imp 用户名/密码@ip地址:端口号/数据库名称    file=D:\\XXX.dmp tables=t_sys_material full=y

然而,我的还是不行,因为我没有正式库61的dba权限所以导入失败,有dba权限的直接用这种方法很快

7.没办法换成了笨方法,用cmd导入sql文件,鉴于我把正式库61的表干掉了,只能再把原来61导出的sql文件再用cmd导入的(幸亏导出了,不然我又悲剧了),然后又把18的sql文件导入61,这次改了表名了,导入了一个t_sys_materia_61,一个t_sys_materia_18,cmd也很慢,而且t_sys_materia_18这个表中文乱码,因为我只需要改价格,所以不管乱码了,用了update语句 更新,终于完成了,然后把原来的t_sys_materia删掉,把t_sys_materia_61改成t_sys_materia

 update t_sys_materia_61 a  set a.price=(select b.price from t_sys_materia_18 b where b.id=a.id)

改表名语句  ALTER TABLE t_sys_materia_61 RENAME TO t_sys_materia;

8.事情解决完了,想到了一个好的方法,我直接可以不用导表,在我把备份数据库导入之后,可以直接在61上建一个dblink连接我的18数据库,然后通过update语句直接可以修改,也很快

以上是关于update忘了加where条件,不小心把oracle数据库里某张表的全表数据都更新了怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

如何撤销一个已经执行的更新SQL语句

sql 回滚语句

放大招了,冰河教你如何防止删库跑路,赶快收藏

MyBatis 动态sql详解

mysql 如何得知update了多少条

如何查看mysql执行进度