背景:
需要把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.htmlcreate 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