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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186505.html
標籤:其他
上一篇:尚硅谷-MySQL流程控制結構
下一篇:Mariadb基礎
