生活随笔
收集整理的這篇文章主要介紹了
批量迁移oracle表存储
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
場景:網友marine遇到問題,要求將某用戶的表從表空間A移動到表空間B,用戶表的個數在1000+以上
分析1:首先可以確定的是針對用戶單張表移動表空間使用alter table table_name remove tablespace tablespace_name這種DDL語句實現;
其次需要查dba_tables視圖找出改用戶在A表空間上的表名稱,然后將值保存為變量傳遞給for循環;
最后執行動態SQL,在PL/SQL中不可能直接執行DDL語句,因而需要使用execute immediate的方式執行動態SQL;
??
分析2:當然也可以去拼湊一個sql腳本,然后執行腳本達到這個效果,但執行效率肯定不如前者
SQL>?set?echo?off ?SQL>?set?feedback?off ?SQL>?set?heading?off ?SQL>?spool?/home/oracle/move.sql ?SQL>?select?'alter?table?hr.'?||table_name?||?'?move?tablespace?TBS_APPLE?;' ???2??from?dba_tables?where?owner='HR'?and?tablespace_name='EXAMPLE'; ??? ?[oracle@orcl?~]$?cat?move.sql? ?alter?table?hr.REGIONS?move?tablespace?TBS_APPLE?;?????????????????????????????? ?alter?table?hr.LOCATIONS?move?tablespace?TBS_APPLE?;???????????????????????????? ?alter?table?hr.DEPARTMENTS?move?tablespace?TBS_APPLE?;?????????????????????????? ?alter?table?hr.JOBS?move?tablespace?TBS_APPLE?;????????????????????????????????? ?alter?table?hr.EMPLOYEES?move?tablespace?TBS_APPLE?;???????????????????????????? ?alter?table?hr.JOB_HISTORY?move?tablespace?TBS_APPLE?;? ?模擬相關場景??
步驟一:新建表空間,查出用戶所擁有的在A表空間上的表,這里的用戶以HR為例,表空間以example為例
SQL>?create?tablespace?tbs_apple?datafile?'/u01/app/oracle/oradata/orcl/tbs_apple01.dbf'? ????2?size?10M?autoextend?on?next??10M?maxsize?1G? ????3?extent?management?local?segment?space?management?auto; ??SQL>?select?table_name?from?dba_tables?where?owner='HR'?and?tablespace_name='EXAMPLE'; ?TABLE_NAME ?------------------------------ ?REGIONS ?LOCATIONS ?DEPARTMENTS ?JOBS ?EMPLOYEES ?JOB_HISTORY ?6?rows?selected.? 步驟二:使用變量實現
SQL>?declare ???2??v_1?varchar2(200); ???3??begin ???4?????select?table_name?into?v_1?from?dba_tables?where?owner='HR'?and?tablespace_name='EXAMPLE'; ???5???????begin ???6?????????for?i?in?v_1 ???7?????????loop ???8???????????execute?immediate?'alter?table??hr.'||v_1?||?'?move?tablespace?example'; ???9?????????end?loop; ??10???????end; ??11??end;?? ??12??/ ????????for?i?in?v_1 ?????????????????* ?ERROR?at?line?6: ?ORA-06550:?line?6,?column?17: ?PLS-00456:?item?'V_1'?is?not?a?cursor ?ORA-06550:?line?6,?column?8: ?PL/SQL:?Statement?ignored? 以上報錯,說明在PL/SQL中不可能直接將變量變成散列放進for循環,需要使用游標;而在shell腳本中可以輕易實現這點!
步驟三:使用游標
先從百度上搜索下游標的概念:
游標(cursor)是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字。用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理。在數據庫中,游標是一個十分重要的概念。游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。
SQL>?declare ???2??????v_1???varchar2(200); ???3????cursor?c_1?is ???4??????????select?table_name?from?dba_tables?where?owner='HR'?and?tablespace_name='EXAMPLE'; ???5??begin ???6??????open?c_1; ???7??????fetch?c_1?into?v_1; ???8???????while?c_1%found ???9????????loop ??10?????????execute?immediate?'alter?table??hr.'||v_1?||?'?move?tablespace?tbs_apple'; ??11?????????fetch?c_1?into?v_1; ??12????????end?loop; ??13??????close?c_1; ??14*?end; ??15??/ ?PL/SQL?procedure?successfully?completed.? 步驟四:驗證結果
SQL>?select?table_name?from?dba_tables?where?owner='HR'?and?tablespace_name='TBS_APPLE'; ??TABLE_NAME ?------------------------------ ?REGIONS ?LOCATIONS ?DEPARTMENTS ?JOBS ?EMPLOYEES ?JOB_HISTORY ??6?rows?selected.? 注意事項:遷移完用戶的表后,要檢查下表的索引是否需要遷移,另外要注意修改用戶的默認永久表空間,根據需要來修改,否則用戶新建的表又會存放到舊的表空間上;用戶擁有的其他對象,例如視圖,觸發器,過程,包這些都存儲在數據字典上,不需要進行遷移!
總結
以上是生活随笔為你收集整理的批量迁移oracle表存储的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。