Oracle数据迁移

背景:
需要把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
上一篇:centos7安装docker并设置开机启动


下一篇:Java并发编程系列之一:Java线程池ThreadPoolExecutor分析