一、源端操作
1、操作系统准备工作
- 创建导出的dump文件的目录并赋予权限
(1)此环境需要添加新盘作为目录
[root@test ~]# mkdir -p /dumpdir
[root@test]# fdisk /dev/vdc
[root@test]# mkfs.xfs /dev/vdc1
[root@test]# mount /dev/vdc1 /dumpdir/
[root@test]# df -h
(2)创建目录并赋予权限(给oracle权限才行)
[root@test ~]# chown -R oracle:oinstall /dumpdir/
2、数据库层面创建目录
数据库层面创建目录(对应上面目录)并赋予权限 SQL>
SQL>create or replace directory dumpdir as '/dumpdir';
SQL>grant read,write on directory dumpdir to system;
SQL>SELECT directory_name, directory_path FROM dba_directories;
3、用数据泵expdp
在oracle的用户下执行expdp操作
expdp system/oracle schemas=XXXX_USER compress=n file=export%U.dmp log=export.log directory=dumpdir filesize=2G parallel=4;
二、传输操作
如果实现scp需要在ssh这2台机器可连通的情况下
scp -P 2222 /u01/app/oracle/oradata/dumpdir/export*.dmp xx.xx.xx.xx:/data/dumpdir
如果是默认的端口则为2222,特殊端口可能回事9922
三、目标端操作
1、目标端创建用户、表空间、权限
(1)利用脚本工具拿到源端的ddl语句,并在目标端执行
表空间DDL
select dbms_metadata.get_ddl('TABLESPACE',' XXXX ') from dual;
用户DDL
select dbms_metadata.get_ddl('USER',' XXXX') from dual;
用户对象权限
select dbms_metadata.get_granted_ddl('OBJECT_GRANT',' XXXX') from dual;
用户角色权限
select dbms_metadata.get_granted_ddl('ROLE_GRANT','XXXX') from dual;
用户系统权限
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT','XXXX') from dual;
(2)根据以上信息,拿到的语句如下
CREATE TABLESPACE "LMSTBS" DATAFILE
'/data/u01/app/oracle/oradata/xxxx/xxxxx01.dbf' SIZE 16106127360
AUTOEXTEND ON NEXT 5368709120 MAXSIZE 32767M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;
ALTER DATABASE DATAFILE
'/data/u01/app/oracle/oradata/xxxx/xxxxx01.dbf' RESIZE 34359721984;
CREATE USER "xxxxx" IDENTIFIED BY XSXS_RP_USER
DEFAULT TABLESPACE "xxxxx"
TEMPORARY TABLESPACE "TEMP"
GRANT WRITE ON DIRECTORY dumpdir TO "xxxxx"
GRANT READ ON DIRECTORY dumpdir TO "xxxxx"
GRANT RESOURCE TO "xxxxx"
GRANT DBA TO "xxxxx"
GRANT UNLIMITED TABLESPACE TO "xxxxx"
2、目标端创建dmp目录
目标端也需要同源端一样建立类似存放dmp文件的目录
[root@lmsdb ~]# mkdir -p /data/dumpdir
[root@lmsdb /]# chown -R oracle:oinstall /data/dumpdir/
SQL>create or replace directory dumpdir as '/data/dumpdir';
SQL>grant read,write on directory dumpdir to system;
SQL>SELECT directory_name, directory_path FROM dba_directories;
3、用数据泵impdp
导入的时候,如果有重复操作,需要进行参数修改
【正常导入】
impdp system/oracle schemas=XXXX_USER directory=dumpdir dumpfile=export%U.dmp logfile=import.log table_exists_action=replace parallel=4
【重复导入】
impdp system/oracle schemas=XXXX_USER directory=dumpdir dumpfile=export%U.dmp logfile=import.log table_exists_action=truncate parallel=4
***如果在导出时候没用用到%U的格式,并导入总是报“在 KUPW$WORKER.”类似的错误,需要去掉统计信息导入
impdp system/oracle schemas=XXXX_USER directory=dumpdir dumpfile=export01.dmp logfile=import_01.log table_exists_action=replace EXCLUDE=STATISTICS
四、问题解决
1、问题1:ORA-39082-失效对象
select 'alter '||object_type||' '||owner||'.'||object_name||' compile;'
from dba_objects
where status !='VALID'
and owner in ('XXXXX')
2、问题2:字符集问题导入失败【临时处理】
源端和目标端字符集不同时,会导致导入溢出报错
具体的报错代码为:ORA-02374 ORA-12899 ORA-02372
查询双端的字符集是否相同select userenv('language') from dual;
startup mount
alter database mount exclusive;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set zhs16gbk;
--ORA-12712: new character set must be a superset of old character set
--ORA-12712:新字符集必须为旧字符集的超集
alter database character set internal_use zhs16gbk;
--使用 internal_use 使oracle数据库绕过了子集与超集的校验.
shutdown immediate
startup
3、问题3:因为触发器导入失败
(1)错误代码为:ORA-31693 ORA-29913 ORA-04091 ORA-06512 ORA-04088
(2)涉及到表为-----忽略
4、问题4:导入中文变为乱码
提前查询源端数据库的字符集信息,需要在建库时候保持一致,必要时候只能dbca重新建库
select userenv('language') from dual;
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';