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