plsql用得不太熟悉,今天先登陆的生产环境数据库,后来又登录的本地数据库。切换了几次,自己都有点糊涂了,但是看到plsql最上面的登录名是本地帐号。以为自己现在登录的是本地帐号。 然后需求让我改一个bug,把VARCHAR2(4000)改成类似于长文本的,可以储存大量文字。 百度了一下,要把VARCHAR2(4000)改为CLOB类型的需要删除表,因为在plsql里面我看见自己登录的是本地帐号, 我就以为是连的本地数据库,就把表给删了,然后创建了新表,把VARCHAR2(4000)改为CLOB类型。(最后才知道是把生产环境的数据库给删了!!!!!!!!!!!!!!!!大家删除表无论什么环境都要做好备份,养成一个好习惯)。过了半天我才反应过来,因为客户那边反应了好多问题, 数据全部变为undefined。我把plsql退出重新登录然后把客户环境和本地环境都查询了一下,发现刚才删的是客户环境!!!!!! 本地环境都是好的。当时就懵了。然后赶紧找运维恢复。运维试了下说删表了不能恢复。删了数据可以恢复;然后他用下面的三个sql执行了一下,发现无法恢复 select * from tablename as of timestamp to_timestamp(‘2020-10-20 00:00:00’, ‘yyyy-mm-dd hh24:mi:ss’)
alter table tablename enable row movement
flashback table tablename to timestamp TO_TIMESTAMP(‘2020-10-20 00:00:00’, ‘yyyy-mm-dd hh24:mi:ss’) 这两种方式都提示 ORA-01466: 无法读取数据 - 表定义已更改,因为把VARCHAR2(4000)改为CLOB类型。表结构变了,恢复不了。 我当时就方了。然后又问运维数据有没有备份,运维说没有!完了,等下肯定要挨骂,还要扣工资,说不定要被辞退啊!!!!心里慌得一匹。然后自己各种百度… 百度了好久都不行。 最后找到了这个,其实这个一开始试了好久,还是不行(不行的原因只是因为自己格式没有写正确…) select * from recyclebin order by droptime;这个查询sql相当于删除表的回收站,可以查看被删的表。 根据recyclebin查询的结果,得到object_name,根据object_name可以闪回之前的表,任何时候drop的都可以!!!!前提是要能在recyclebin中可以查询得到你删除的表就可以闪回; 下面这段代码就是闪回之前指定的表,然后重新命名 注意!!!!!!!!!!!!!!!!!!! 这个表名必须得加上因为的双引号(""),不然会报 miss keyword这个错误,一开始我就没加双引号结果一直报错,后来加了双引号才好 flashback table “BIN$siZP1Nsj44fgU3NBAQrDNg==$0” to before drop rename to new_table_name;–闪回指定的表,并重新命名 再把表名更新为自己删除的表的表名就可以了 alter table new_table_name rename to want_table;–把表名更改为指定的表
要把Oracle的数据类型VARCHAR2(4000)改为CLOB类型; 1.先查询数据,导出做备份 --select * from tablename 2.创建临时表,临时表数据类型VARCHAR2(4000)改为CLOB,把数据给临时表,–insert into temptable select * from tablename; 3.删除tablename表,创建tablename表数据类型改为clob --drop tablename 4.把临时表数据给创建表 --insert into tablename select * from temptable;
–保存大文本数据 DECLARE clobValue tablename.CLOB数据类型的属性名%TYPE; BEGIN clobValue := ‘大文本数据’; UPDATE tablename T SET T.CLOB数据类型的属性名 = clobValue WHERE ids = ‘xxxxxxxx’ and name = ‘tttttt’ and dep = ‘yyyyyyyyyyyy’; COMMIT; END;