資料庫搬移表空間(從chicago server搬移到wilson server)

it-msxq發表於2012-01-10

這是一個生產資料庫的實際操作

***按照一步步的仔細認真的操作 保證整個操作是成功的***

-- 檢視錶空間名稱、檢視資料檔案的路徑和資料檔名稱等

select t.NAME AS "tablespace_name",

       f.NAME AS "filename",

       f.STATUS,

       t.BIGFILE,

       f.BYTES

  from v$tablespace t

 inner join v$datafile f on t.TS# = f.TS#;

-- 檢視users表空間的資訊

select * from dba_tables where tablespace_name = 'USERS';

-- 檢視users表空間的使用者名稱

select distinct owner from dba_tables where tablespace_name = 'USERS';

-- 檢視users表空間的所有表

select count(*) from dba_tables where tablespace_name = 'USERS';

-- 檢視資料庫中正在使用的使用者名稱

select username, account_status

  from dba_users

 where account_status = 'OPEN';

-- 檢視資料庫的總大小

select round(sum(space)) all_space_m

  from (select sum(bytes) / 1024 / 1024 space

          from dba_data_files

        union all

        select nvl(sum(bytes) / 1024 / 1024, 0) space

          from dba_temp_files

        union all

        select sum(bytes) / 1024 / 1024 space from v$log);

-- 檢視各個表空間的大小

select a.tablespace_name,

       round((a.maxbytes / 1024 / 1024), 2) "sum MB",

       round((a.bytes / 1024 / 1024), 2) "datafile MB",

       round(((a.bytes - b.bytes) / 1024 / 1024), 2) "used MB",

       round(((a.maxbytes - a.bytes + b.bytes) / 1024 / 1024), 2) "free MB",

       round(((a.bytes - b.bytes) / a.maxbytes) * 100, 2) "percent_used"

  from (select tablespace_name, sum(bytes) bytes, sum(maxbytes) maxbytes

          from dba_data_files

         where maxbytes != 0

         group by tablespace_name) a,

       (select tablespace_name, sum(bytes) bytes, max(bytes) largest

          from dba_free_space

         group by tablespace_name) b

 where a.tablespace_name = b.tablespace_name

 order by ((a.bytes - b.bytes) / a.maxbytes) desc;

/*

在遷移chicago伺服器上USERS表空間的時候由於該表空間下有一下使用者msxq,tony使用者;

移動的目標位於wilson伺服器上,由於該資料庫中存在USERS表空間 ,users表空間是資料庫預設表空間;

如果刪除users表空間會報錯;做一下處理:

如果表空間在某個使用者下,要建立相應的使用者

*/

-- 在wilson server上建立使用者

create user msxq identified by xinan;

create user tony identified by hangan;

grant dba, resource, connect to msxq, tony;

grant create view to msxq, tony;

-- 在wilson server上建立資料庫預設表空間

create tablespace bj datafile '/home/oracle/oracle/product/10.2.0/oradatawilson/bj.dbf'

        size 10M extent management local autoallocate segment space management auto;

-- 在wilson server上修改資料庫的預設表空間為bj

alter database default tablespace bj;

-- 在wilson server上刪除users表空間 去表空間路徑下看相應的資料庫刪除沒有,如果沒有手動刪除

drop tablespace users including contents and datafiles;

rm –rf user01.dbf

 

-- 在chicago上執行移動users表空間的操作

/*

在搬移表空間之前,為了確保特定表空間集合可以被搬移,必須首先檢查表空間集合是否為自包含的,

通過執行包DBMS_TTS的過程TRANSPORT_SET_CHECK可以完成這項任務。當執行了該過程後,

系統會將違反自包含集合的資訊寫入到臨時表transport_set_violations中。查詢如果沒有任何資訊,

說明表空間集合是自包含的,否則會返回違反自包含表空間集合的詳細資訊。執行該過程,

必須有EXECUTE_CATALOG_ROLE角色。例項如下:

*/

execute sys.dbms_tts.transport_set_check('users', true);

-- 如果沒有任何輸出說明是自包含表空間,如果有輸出,請認真做處理

select * from transport_set_violations;

-- 生成要搬移的表空間集合。必須首先將所有要搬移的表空間轉變為只讀狀態,確保其內容不會發生任何改變

alter tablespace bj read only; -- 要求使用者具有SYSDBA許可權

-- 檢視目錄為:

[oracle@&& ~]pwd

 /home/oracle

-- 匯出users表空間所有物件,需要轉義字元在Linux和Unix上

[oracle@&& ~]$ exp \'/ as sysdba\' TRANSPORT_TABLESPACE=y tablespaces= users file=/home/oracle/exp_users.dmp log=/home/oracle/exp_users_chicago.log

--進行打包

[oracle@&& ~]$ tar -zvcf exp_users.dmp.tar.gz exp_users.dmp

-- 傳送轉儲檔案和資料檔案到目標資料庫(從chicago傳送到wilson上)

[oracle@&& ~]$scp exp_users.dmp.tar.gz 192.168.132,11:/home/oracle/

[oracle@&& ~]$scp /路徑/user01.dbf 192.168.132.11:/home/oracle/oracle/product/10.2.0/oradata/wilson/

-- 在wilson上操作:

-- 解壓縮包

[oracle@&& ~]$tar -zvxf exp_users.dmp.tar.gz

--執行匯入操作:

[oracle@&& ~]$imp '/ as sysdba\' TRANSPORT_TABLESPACE = y file =/home/oracle/exp_users.dmp datafiles =/home/oracle/oracle/product/10.2.0/oradata/wilson/users01.dbf log=/home/oracle/imp_users_wilson.log

--如果執行DML或DDL操作,將資料檔案改為讀寫狀態(chicago server, wilson server都執行)

alter tablespace users read write;

--以上操作完畢

 

/*

執行上面的imp時出現 ORA - 12716 :Cannot ALTER DATABASE CHARACTER SET when CLOB data exists

說明兩個資料庫字符集不一致;做一下處理工作

*/

-- 檢視資料庫處於的平臺

SELECT d.PLATFORM_NAME, ENDIAN_FORMAT

    FROM V$TRANSPORTABLE_PLATFORM. tp, V$DATABASE d

   WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

-- 首先檢視chicago server, wilson server的資料庫的字符集

select *

  from nls_database_parameters

 where parameter in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

-- 修改目標資料庫(wilson server)

shutdown immediate

startup mount

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;

ALTER SYSTEM SET AQ_TM_PROCESSES = 0;

alter database open;

alter database character set INTERNAL_USE 為"chicago資料庫的NLS_CHARACTERSET的value值";

shutdown immediate

startup

-- 在wilson server上執行匯入

[oracle@&& ~]$imp '/ as sysdba\' TRANSPORT_TABLESPACE = y file =/home/oracle/exp_users.dmp datafiles =/home/oracle/oracle/product/10.2.0/oradata/wilson/users01.dbf log=/home/oracle/imp_users_wilson.log

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25533574/viewspace-714714/,如需轉載,請註明出處,否則將追究法律責任。

相關文章