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语句直接可以修改,也很快

原文地址:https://www.cnblogs.com/bulata/p/12227986.html

时间: 2024-11-05 20:26:39

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

mysqlbinlog结合sed命令恢复update时未加where条件之前的数据

一.环境说明 腾讯云机器上自建MySQL 上update操作时,忘加where条件 ,使用mysqlbinlog搭配sed命令完美还原MySQL版本号:5.6.39:mysql必须开启binlog,并且mysql的binlog最好是Row模式;mysql数据库指定字符集位utf8,同时表的字符集也得为utf8,否则在mysqlbinlog 解析出来的sql文件对于中文汉字的会出现乱码,导致最后恢复数据到线上的表中报错.满足以上条件这样可以极大的保证数据恢复的几率.当然把控好数据库的权限问题,禁止

Oracle数据库手动恢复备忘日志

最近因为升级了Mac os x 10.10 Yosemite,突然前几天的一个晚上,开机发现就停留在开机界面了,看来BETA果然是不靠谱,然后想到自己这不前几天刚备份完吗,没事,TimeMachine是何等神器,二话不说直接恢复.但是恢复完,我后悔了,一来是忘了昨天晚上还加班呢,加班的成功保留成果所剩无几,关键我这才发现TimeMachine既然不备份虚拟机文件(虚拟机文件30G,估计直接给略过了吧),难怪每次都觉得备份那么快. 不过后悔也没用,重新搭开发环境吧.操作系统WIN7->开发工具VS

WHERE条件中or与union引起的全表扫描的问题

说起数据库的SQL语句执行效率的问题,就不得不提where条件语句中的or(逻辑或)引起的全表扫描问题,从而导致效率下降. 在以往绝大多数的资料中,大多数人的建议是使用 union 代替 or ,以解决由于使用了 OR 导致的全表扫描.然而,实际是不是如此呢?flymorn就拿5万多条数据的MSSQL数据库来测试. 在SQL Server查询分析器中键入如下代码: SET STATISTICS profile ONSET STATISTICS io ONSET STATISTICS time O

MySQL 误操作后数据恢复(update,delete忘加where条件)

在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者DBA的我们改如何处理呢?下面我分别针对update和delete操作忘加where条件导致全表更新的处理方法. 一. update 忘加where条件误操作恢复数据(binglog格式必须是ROW) 1.创建测试用的数据表 mysql> create table t1 ( -> id int un

MySQL之delete 忘加where条件误删除恢复方法二

和昨天介绍的MySQL之delete 忘加where条件误删除恢复的mysql的环境条件是一样的:mysql数据库指定字符集位utf8,同时表的字符集也得为utf8,同时mysql要开启row模式的bin-log日志 创建一张测试表测试: create table MyClass( id int(4) not null primary key auto_increment, name char(20) not null, sex varchar(10) not null default '0',

在MySQL中阻止UPDATE语句没有添加WHERE条件的发生

如果在生产环境中使用UPDATE语句更新表数据,此时如果忘记携带本应该添加的WHERE条件,那么..Oh,no…后果可能不堪设想.那么有没有什么办法可以阻止这样的事情发生,又不使用任何的审核工具呢...办法当然是有的 sql_safe_updates sql_safe_updates这个MySQL自带的参数就可以完美的解决我们的问题,并且该参数是可以在线变更的哦~当该参数开启的情况下,你必须要在UPDATE语句后携带WHERE条件,否则就会报出ERROR.. 举个栗子 # sql_safe_up

原来数据库里的单引号是这么加进去的

使 SQL Server 遵从关于引号分隔标识符和文字字符串的 ISO 规则.由双引号分隔的标识符可以是 Transact-SQL 保留关键字,也可以包含 Transact-SQL 标识符语法约定通常不允许的字符. Transact-SQL 语法约定 语法   SET QUOTED_IDENTIFIER { ON | OFF } 注释 当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔.当 SET QUOTED_IDENTIFIER 为

SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UPDATE)

● UPDATE语句可以将列的值更新为NULL.● 同时更新多列时,可以在UPDATE语句的SET子句中,使用逗号分隔更新对象的多个列. 指定条件的UPDATE语句(搜索型UPDATE) SET 子句中赋值表达式的右边不仅可以是单纯的值,还可以是包含列的表达式. 使用NULL进行更新 使用 UPDATE 也可以将列更新为 NULL(该更新俗称为 NULL 清空).此时只需要将赋值表达式右边的值直接写为 NULL 即可. 多列更新 SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UP

Oracle Bigdata Connector实战1: 使用Oracle Loader加载HDFS文件到Oracle数据库

部署jdk/Hadoop/OraLoader软件包 将准备好的软件包,逐一解压到hadoop用户home目录下: hadoop-2.6.2.tar.gz jdk-8u65-linux-x64.gz oraloader-3.4.0.x86_64.zip Hadoop软件部署如下: ├── hadoop-2.6.2 ├── jdk1.8.0_65 ├── oraloader-3.4.0-h2 设置环境变量 export JAVA_HOME=/home/hadoop/jdk1.8.0_65 expor