暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORACLE数据迁移合集

IT那活儿 2023-08-25
267
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

生产中由于设备更换或灾备等原因,经常会出现数据迁移的操作,而数据迁移又分为多种方式。接下来我们详细了解一下ORACLE数据库相关的三种迁移方式。


数据泵不落地式导入数据
1.1 在目标数据库配置tns
vi /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

TNSWLFDB =                //创建的tns名字
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.XXX.XXX.116)//源数据库ip(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)    //源数据库实例名SID
    )

[oracle@rac3 admin]$ tnsping TNSWLFDB  //验证tns

复制
1.2 在目标数据库创建dblink
没有权限到sys用户授权。
grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to TEST;
select * from dba_db_links;  /查看dblink
方式一:
create public database link TEST_LINK connect to system identified by "oracle" using 'TNSWLFDB';
方式二:
create public database link TEST_LINK connect to system identified by "oracle" using 'TNSWLFDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.XXX.XXX.116)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME =orcl)
    )'
;

create directory ORABAK_TEST as '/orabak/TEST'; //创建逻辑目录

select * from test_a@TEST_LINK;  //查看源数据库表验证dblink

alter public database link TEST_LINK connect to system identified by "654321";  //修改dblink密码

drop public database link "TEST_LINK";  //删除dblink

复制
1.3 导入数据

impdp system/654321 network_link=TEST_LINK tables=test_a; //根据表导入数据

impdp system/654321 DIRECTORY=ORABAK_TEST PARALLEL=8  
CLUSTER=NO SCHEMAS=TEST remap_tablespace=SYSTEM:USERS
network_link=TEST_LINK parfile=TEST.par; //根据用户导入数据

复制

数据泵落地式导入数据
注:oracle用户下操作。
2.1 执行以下语句,创建“test_dir”文件夹
mkdir test_dir
复制
2.2 执行以下语句创建逻辑目录,将“test_dir”指定为“/home/oracle/test_dir”
create or replace directory test_dir as '/home/oracle/test_dir'
复制
2.3 确认逻辑目录是否存在
select * from dba_directories;
复制
2.4 执行以下语句,将“test_dir”的读、写和执行权限赋给xx(数据用户名)用户
grant all on directory test_dir to xx
复制
2.5 执行以下语句,将sysdb用户的表备份到“test_dir”目录下
expdp 要导出表所在的数据库用户名/密码@数据库实例名 directory=test_dir(存放dmp文件) dumpfile=expdb.dmp    //需要在所创建目录下执行:
1)按用户导
expdp TEST/123456@orcl schemas=TEST dumpfile=expdp.dmp DIRECTORY=test_dir;
复制
2)并行进程parallel
expdp TEST/123456@orcl directory=test_dir dumpfile=TEST3.dmp parallel=8 job_name=TEST3
复制
3)按表名导
expdp TEST/123456@orcl TABLES=test_a(多个表以 , 分割) dumpfile=expdp.dmp DIRECTORY=test_dir;
复制
4)按条件导
expdp TEST/123456@orcl directory=test_dir dumpfile=expdp.dmp Tables=test_a query='WHERE rownum<100';
复制
5)按表空间导
expdp system/654321 DIRECTORY=test_dir DUMPFILE=tablespace.dmp TABLESPACES=test_dat;
复制
6)导整个数据库
expdp system/654321 DIRECTORY=test_dir DUMPFILE=full.dmp FULL=y;
复制
7)数据过大分多个文件导出

expdp system/654321 schemas=test directory=test_dir dumpfile=expdp_%u.dmp filesize=102400

复制

跨版本导入导出表
expdp system/654321@orcl TABLES=test directory=test_dir
dumpfile=test.dmp version=11.2.0.4.0; //需要在导出时设置版本号
复制
导入数据:
  • 登陆到目标服务器执行1-4步。
  • 把导出的test.dmp 移动到目标服务器 /home/oracle/ 目录下:scp test.dmp 192.XXX.XXX.113:/home/oracle/dump/
1)导到指定用户下
impdp system/654321 DIRECTORY=test_dir DUMPFILE=expdp.dmp 
REMAP_SCHEMA=TEST:system;

复制
2)导入表空间
impdp system/654321DIRECTORY=test_dir DUMPFILE=tablespace.dmp TABLESPACES=test_dat;
复制
3)全库导入
impdb system/654321 DIRECTORY=test_dir DUMPFILE=full.dmp FULL=y;
复制
4)仅导入表结构
导入操作CONTENT参数和remap_schema,其中hdoa:defDB是把hdoa下的表结构转义为DEFDB用户下
impdp defDB/defDB DIRECTORY=test_dir CONTENT=METADATA_ONLY 
DUMPFILE=expdp.dmp logfile=expdp.log remap_schema=test:system;

复制
5)导入表
impdp TEST/123456@orcl TABLES=test dumpfile=expdp.dmp DIRECTORY=test_dir;
复制
6)导入多个文件
impdp system/123456 schemas=test directory=test_dir dumpfile=expdp_%u.dmp
复制
7)加入全库导入中途出错
  • 查询所有表:
SQL> select table_name from user_tables;
复制
  • 批量删除表:

select 'drop table '||table_name||';' 
from cat
where table_type='TABLE'

复制

sqlldr导入/导出数据

4.1 sqlldr导入数据

1)在目标数据库创建表结构
create table TEST
(
  userid   VARCHAR2(100),
  username VARCHAR2(100),
);

复制
2)存放数据文件
1,zhangsan
2,lisi
3,wangwu

复制
3)控制文件
APPEND // 追加数据
INSERT // 空表添加数据
REPLACE // 清除原有数据重新添加
TRUNCATE // 清除原有数据重新添加

load data
infile '/home/oracle/test.txt'
--
infile '/home/oracle/test1.txt'(导入多个文件到同一张表继续往后追加)
append
into table TEST
fields terminated by ','
trailing nullcols
(
    userid (position(1:5)),            // position(1:5)指的
是从第一个字符载止到第五个字符作为ename的值,绝对偏移量

    username,
)

复制
4)导入数据
Nohup Sqlldr TEST/123456 control=/home/oracle/control.ctl &
复制
4.2 sqlldr导出数据
上传sqluldr2_linux64_10204.bin到Oracle执行目录:/u01/app/oracle/product/19c/dbhome_1/bin
修改属组和读写权限:
chown oracle:oinstall sqluldr2_linux64_10204.bin 
chmod 755 sqluldr2_linux64_10204.bin
query导出
./sqluldr2_linux64_10204.bin user=system/123456 query="select * from test;" head=yes file=/home/oracle/test.txt charset=UTF-8;

复制
expdp/impdp、sqlldr的区别:
  • expdp/impdp为逻辑备份,在跨版本或者只导出个别表等采用expdp导出方便。
  • sqlldr:用来进行异构数据库的数据迁移,比如从Oracle导入到mysql,是生成txt文件。

END


本文作者:梁明磊(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论