天天看點

Oracle資料遷移1.批量建立表空間:2.批量建立使用者:3.批量導出導入資料:

背景:

需要把server 2008 oracel 11g R2的資料遷移到centos6 oracle 11g R2,資料庫版本是一樣的,如果不一樣,導出資料的時候需要加上版本号。

舊資料庫的表空間有67個,使用者有141個,資料倒不算太大。

本人oracle不熟,隻能通過按使用者導出導入的方法把資料遷移了。

準備,基本思路:

記錄舊資料庫使用者與表空間的關系,在新庫建立使用者、表空間,結合起來。導出舊資料庫資料的時候,按使用者來導出。

--->在新庫,按使用者來導入

select username,user_id,default_tablespace,temporary_tablespace from  dba_users;--檢視表空間與使用者的關系
           

下面例子:

舊資料庫:172.16.31.213

新資料庫:172.16.28.213

1.批量建立表空間:

參考連結:

http://www.51testing.com/html/06/n-3724606.html
create table space_name(
name varchar2(20)
)
           

...

select 'create tablespace ' || s_name || ' DATAFILE "/oradata/dbfile/' || s_name || '.DBF" SIZE 50M AUTOEXTEND ON ;' from space_name;  --生成執行語句
           

把導出語句修改一下,寫成.sql腳本,在伺服器中執行腳本

>@cc.sql
           

2.批量建立使用者:

select 'create user ' || username || ' identified by ' || username || ' ;' from test_user; --生産執行語句,放在腳本中運作
select 'grant resource,connect,dba to ' || username || ' ;' from  test_user; --生産授權使用者語句
           

手動修改使用者與表空間對應的關系,可以用工具修改(個人用navicat for oracle)。

3.批量導出導入資料:

1.建立dblink,(我是用pl/sql工具建立的dblink)

GRANT EXP_FULL_DATABASE TO VSOP; --給遠端使用者exp_full_database的權限

-- Drop existing database link
drop public database link TEST2;
-- Create database link
create public database link TEST2
  connect to VSOP
  using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.31.213)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = idcms)
    )
  )';
           

2.建立目錄

mkdir  /oradata/dumpfile
SQL> create or replace directory data_pump_dir2 as '/oradata/dumpfile';
SQL> grant read,write on directory data_pump_dir2 to public;
           

建兩個簡單的導出導入腳本:

#!/usr/bin/env bash
source /home/oracle/.bash_profile
date
for user in `cat /tmp/user.txt`;do
    echo "expdp $user"
    expdp \'/ as sysdba\' network_link=test2 directory=DATA_PUMP_DIR2 SCHEMAS=${user} content=all dumpfile=${user}.dmp logfile=exp_${user}.log &> /dev/null
done
date
           
#!/usr/bin/env bash
source /home/oracle/.bash_profile
date
for user in `cat /tmp/user.txt`;do
    echo "impdp $user"
    impdp \'/ as sysdba\' directory=DATA_PUMP_DIR2  DUMPFILE=${user}.dmp table_exists_action=skip logfile=imp_${user}.log &> /dev/null
done
date