问题描述:数据库突然出问题了,一张物资价格表全部更新成了同一个价格,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