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

expdp impdp datadump 迁移可能会用到的知识点

原创 张玉龙 2022-01-10
1955

NFS,空间不足用来挂载目录

服务端

mkdir /datadump chown oracle:oinstall /datadump/ cat /etc/exports /datadump 192.168.0.*(rw,sync,no_root_squash,insecure) systemctl start nfs systemctl start rpcbind

客户端

# linux mkdir /expdp mount -t nfs -o nolock,rw,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,noac,vers=3,timeo=600 192.168.0.112:/datadump /expdp chown -R oracle:oinstall /expdp vi /etc/fstab 192.168.0.112:/datadump /expdp nfs nolock,rw,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,noac,vers=3,timeo=600 0 0 #AIX # vi /etc/filesystems /arc/xtts_bak: dev = "/arc/xtts_bak" vfs = nfs nodename = 192.168.0.112 mount = true options = cio,rw,bg,hard,intr,rsize=32768,wsize=32768,timeo=600,vers=3,proto=tcp,noac,sec=sys account = false # mount /arc/xtts_bak # Solaris # mkdir -p /data/xtts # mount -o rw,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,vers=3,suid 192.168.0.112:/data/xtts /data/xtts mount 加上 noac 导致传输慢 Solaris NFS Mount Is extremely Slow while writing files to an NFS mount. (文档 ID 2171414.1) Thu Jul 15 01:58:30 2021 WARNING:NFS mount of file /xtts_bak/aa/AA01_8.tf on filesystem /xtts_bak done with incorrect options:rw,suid,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,vers=3,xattr,dev=63c0009 WARNING:Expected NFS mount options: rsize>=32768,wsize>=32768,hard,noac/actimeo=0 # mount -o rw,bg,hard,actimeo=0,nointr,rsize=32768,wsize=32768,proto=tcp,vers=3,suid 192.168.0.112:/xtts_bak /xtts_bak

Linux客户端卸载

# umount /expdp umount.nfs: /expdp: device is busy umount.nfs: /expdp: device is busy # fuser -m /expdp ^C # umount -lf /expdp

借用共享存储划分空间

当源端和目标端的本地空间都不够,而此时 还有未使用的共享存储,可以借用共享存储作为备份文件目录空间
注意: 此操作具有破坏性,请仔细核对共享存储磁盘路径

磁盘分区:

# parted /dev/asm-data08 mklabel gpt print mkpart primary 0 537GB # 根据实际情况划分大小 set 1 lvm on

挂载目录:

pvcreate /dev/sdk1 /dev/sdl1 vgcreate -s 512M backup_vg /dev/sdk1 /dev/sdl1 vgdisplay lvcreate -l 12282 -n backup_lv backup_vg mkfs.ext4 /dev/backup_vg/backup_lv mkdir /datadump mount /dev/backup_vg/backup_lv /datadump

根据上文使用 NFS 进行远程挂载

还原划分的存储

systemctl stop nfs umount /datadump lvremove backup_lv backup_vg vgremove backup_vg pvremove /dev/sdk1 /dev/sdl1 parted /dev/sdk rm 1 dd if=/dev/zero of=/dev/asm-data08 bs=1k count=3000 SQL> alter diskgroup data add disk '/dev/asm-data08','/dev/asm-data09'; alter diskgroup data add disk '/dev/asm-data08','/dev/asm-data09' * ERROR at line 1: ORA-15032: not all alterations performed ORA-15075: disk /dev/asm-data09 is not visible on instance number 2 ORA-15075: disk /dev/asm-data08 is not visible on instance number 2 lrwxrwxrwx 1 root root 4 Jul 12 10:57 /dev/asm-data09 -> sdl1 <<<<<<<<<<<<<<<<<<<节点2没变回来 lrwxrwxrwx 1 root root 4 Jul 12 10:57 /dev/asm-data08 -> sdm1 # parted /dev/sdm <<<<<<<<<<<<<<<<< parted重新识别一下

创建目录

> sqlplus / as sysdba create directory PUMP_DIR as '/expdp'; grant read,write on directory PUMP_DIR to system; col DIRECTORY_PATH for a100 set line 300 SELECT privilege, directory_name, DIRECTORY_PATH FROM user_tab_privs t, all_directories d WHERE t.table_name(+) = d.directory_name ORDER BY 2, 1;

注意: datadump 不导 directory,如果源端有特殊的 directory ,需要手动在目标端创建

tnsnames.ora

检查源端 dblink 是否引用本地的连接串,提前将源端的 tnsnames.ora 里的连接串复制到目标端的 tnsnames.ora 中,并tnsping测试连通性。

创建临时 监听(其他端口)和DBLINK,用于调试或数据对比

$ vi /u01/app/11.2.0/grid/network/admin/listener.ora LISTENER_1523 = (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.112)(PORT=1523)) ) ) SID_LIST_LISTENER_1523 = (SID_LIST= (SID_DESC= (GLOBAL_DBNAME=orcl) (ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1) (SID_NAME=orcl1) ) ) $ lsnrctl start LISTENER_1523 --目标端创建dblink连接源端 create public database link qianyi_dblink connect to system identified by oracle using '192.168.0.112:1523/orcl'; select name from v$database@qianyi_dblink;

整理角色,按用户导入不会导入角色的创建语句,只会导入角色授权语句

select * from dba_roles where ROLE in (select distinct GRANTED_ROLE from dba_role_privs where GRANTEE in (select username from dba_users where ACCOUNT_STATUS not like 'EXPIRED%' and USERNAME not in ('SYS', 'SYSTEM')) and GRANTED_ROLE not in ('DBA', 'RESOURCE', 'CONNECT', 'OEM_MONITOR', 'SELECT_CATALOG_ROLE')); select 'CREATE ROLE "' || GRANTED_ROLE || '";' CREATE_ROLE_DDL from (select distinct GRANTED_ROLE from dba_role_privs where GRANTEE in (select username from dba_users where ACCOUNT_STATUS not like 'EXPIRED%' and USERNAME not in ('SYS', 'SYSTEM')) and GRANTED_ROLE not in ('DBA', 'RESOURCE', 'CONNECT', 'OEM_MONITOR', 'SELECT_CATALOG_ROLE'));

整理PROFILE

目标端按用户导入,会自动创建用户,创建用户的语句指定了自定义的PROFILE,当PROFILE在目标端不存在时 用户将自动创建失败,从而导致后面的导入失败。

column username for a25 column account_status for a20 column temporary_tablespace for a20 col PROFILE for a20 select username,account_status,LOCK_DATE,EXPIRY_DATE,PROFILE,default_tablespace,temporary_tablespace,CREATED,AUTHENTICATION_TYPE from dba_users order by CREATED; USERNAME ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE PROFILE DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED AUTHENTI ------------------------- -------------------- ------------------- ------------------- -------------------- ------------------------------ -------------------- ------------------- -------- SYSTEM OPEN DEFAULT SYSTEM TEMP 2016-09-07 10:15:38 PASSWORD SYS OPEN DEFAULT SYSTEM TEMP 2016-09-07 10:15:38 PASSWORD OUTLN EXPIRED & LOCKED 2016-09-07 10:15:39 2016-09-07 10:15:39 DEFAULT SYSTEM TEMP 2016-09-07 10:15:39 PASSWORD DIP EXPIRED & LOCKED 2016-09-07 10:17:19 2016-09-07 10:17:19 DEFAULT USERS TEMP 2016-09-07 10:17:19 PASSWORD ... ... APP_ADM OPEN SEC_PROFILE USERS TEMP 2018-04-23 16:35:17 PASSWORD APP_APP OPEN SEC_PROFILE USERS TEMP 2018-04-23 16:35:17 PASSWORD select * from dba_profiles where PROFILE='SEC_PROFILE'; PROFILE RESOURCE_NAME RESOURCE LIMIT ------------------------------ -------------------------------- -------- ---------------------------------------- SEC_PROFILE COMPOSITE_LIMIT KERNEL UNLIMITED SEC_PROFILE SESSIONS_PER_USER KERNEL UNLIMITED SEC_PROFILE CPU_PER_SESSION KERNEL UNLIMITED SEC_PROFILE CPU_PER_CALL KERNEL UNLIMITED SEC_PROFILE LOGICAL_READS_PER_SESSION KERNEL UNLIMITED SEC_PROFILE LOGICAL_READS_PER_CALL KERNEL UNLIMITED SEC_PROFILE IDLE_TIME KERNEL UNLIMITED SEC_PROFILE CONNECT_TIME KERNEL UNLIMITED SEC_PROFILE PRIVATE_SGA KERNEL UNLIMITED SEC_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD 10 SEC_PROFILE PASSWORD_LIFE_TIME PASSWORD UNLIMITED SEC_PROFILE PASSWORD_REUSE_TIME PASSWORD UNLIMITED SEC_PROFILE PASSWORD_REUSE_MAX PASSWORD UNLIMITED SEC_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION_11G SEC_PROFILE PASSWORD_LOCK_TIME PASSWORD 1 SEC_PROFILE PASSWORD_GRACE_TIME PASSWORD 10

这里的PROFILE使用了密码复杂度检查函数 VERIFY_FUNCTION_11G,这个函数可以使用脚本 $ORACLE_HOME/rdbms/admin/utlpwdmg.sql 创建。

SQL> @?/rdbms/admin/utlpwdmg.sql SQL> create profile SEC_PROFILE limit composite_limit unlimited sessions_per_user unlimited cpu_per_session unlimited cpu_per_call unlimited logical_reads_per_session unlimited logical_reads_per_call unlimited idle_time unlimited connect_time unlimited private_sga unlimited failed_login_attempts 10 password_life_time UNLIMITED password_reuse_time UNLIMITED password_reuse_max UNLIMITED password_verify_function VERIFY_FUNCTION_11G password_lock_time 1 password_grace_time 10;

整理表空间的创建语句,导入前需要提前创建表空间

select tablespace_name,round(sum(bytes)/1024/1024,2) tbs_size_mb from dba_data_files group by tablespace_name order by tbs_size_mb; CREATE TABLESPACE TBS DATAFILE '+DATA' SIZE 32760M AUTOEXTEND OFF; ALTER TABLESPACE TBS ADD DATAFILE '+DATA' SIZE 32760M AUTOEXTEND OFF; DROP TABLESPACE <TS_NAME> INCLUDING CONTENTS AND DATAFILES; alter database datafile '+DATA/.../.../DATAFILE/system.425.1077813511' resize 32760M; alter database datafile '+DATA/.../.../DATAFILE/system.425.1077813511' autoextend off; alter database datafile '+DATA/.../.../DATAFILE/sysaux.426.1077813511' resize 32760M; alter database datafile '+DATA/.../.../DATAFILE/sysaux.426.1077813511' autoextend off; alter database tempfile '+DATA/.../.../TEMPFILE/temp.427.1077813515' resize 32760M; alter database tempfile '+DATA/.../.../TEMPFILE/temp.427.1077813515' autoextend off; ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA' size 32760M autoextend off;

整理LOB比较大的表,粗略的判断

set line 300 pages 1000 col OWNER for a20 col SEGMENT_NAME for a30 select ds.OWNER, dl.TABLE_NAME, ds.SEGMENT_NAME, ds.SEGMENT_TYPE, ds.TABLESPACE_NAME, ds.BYTES / 1024 / 1024 as mb from dba_segments ds, dba_lobs dl where ds.SEGMENT_NAME = dl.SEGMENT_NAME and SEGMENT_TYPE like 'LOB%' and BYTES / 1024 / 1024 > 1024 order by MB;

精准的LOB占用空间计算:How to Compute the Size of a Table containing Outline CLOBs and BLOBs (Doc ID 118531.1)

# vi lob_table_size.sql ACCEPT SCHEMA PROMPT 'Table Owner: ' ACCEPT TABNAME PROMPT 'Table Name: ' SELECT (SELECT SUM(S.BYTES) / 1024 / 1024 -- The Table Segment size FROM DBA_SEGMENTS S WHERE S.OWNER = UPPER('&SCHEMA') AND (S.SEGMENT_NAME = UPPER('&TABNAME'))) + (SELECT SUM(S.BYTES) / 1024 / 1024 -- The Lob Segment Size FROM DBA_SEGMENTS S, DBA_LOBS L WHERE S.OWNER = UPPER('&SCHEMA') AND (L.SEGMENT_NAME = S.SEGMENT_NAME AND L.TABLE_NAME = UPPER('&TABNAME') AND L.OWNER = UPPER('&SCHEMA'))) + (SELECT SUM(S.BYTES) / 1024 / 1024 -- The Lob Index size FROM DBA_SEGMENTS S, DBA_INDEXES I WHERE S.OWNER = UPPER('&SCHEMA') AND (I.INDEX_NAME = S.SEGMENT_NAME AND I.TABLE_NAME = UPPER('&TABNAME') AND INDEX_TYPE = 'LOB' AND I.OWNER = UPPER('&SCHEMA'))) "TOTAL TABLE SIZE MB" FROM DUAL; SQL> @lob_table_size.sql Table Owner: LOB_USER Table Name: LOB_TABLE old 4: WHERE S.OWNER = UPPER('&SCHEMA') AND new 4: WHERE S.OWNER = UPPER('LOB_USER') AND old 5: (S.SEGMENT_NAME = UPPER('&TABNAME'))) + new 5: (S.SEGMENT_NAME = UPPER('LOB_TABLE'))) + old 8: WHERE S.OWNER = UPPER('&SCHEMA') AND new 8: WHERE S.OWNER = UPPER('LOB_USER') AND old 9: (L.SEGMENT_NAME = S.SEGMENT_NAME AND L.TABLE_NAME = UPPER('&TABNAME') AND L.OWNER = UPPER('&SCHEMA'))) + new 9: (L.SEGMENT_NAME = S.SEGMENT_NAME AND L.TABLE_NAME = UPPER('LOB_TABLE') AND L.OWNER = UPPER('LOB_USER'))) + old 12: WHERE S.OWNER = UPPER('&SCHEMA') AND new 12: WHERE S.OWNER = UPPER('LOB_USER') AND old 13: (I.INDEX_NAME = S.SEGMENT_NAME AND I.TABLE_NAME = UPPER('&TABNAME') AND INDEX_TYPE = 'LOB' AND I.OWNER = UPPER('&SCHEMA'))) new 13: (I.INDEX_NAME = S.SEGMENT_NAME AND I.TABLE_NAME = UPPER('LOB_TABLE') AND INDEX_TYPE = 'LOB' AND I.OWNER = UPPER('LOB_USER'))) TOTAL TABLE SIZE MB ------------------- 16662

停数据库服务

停crontab srvctl stop listener --停监听 srvctl stop scan_listener select OWNER,TYPE,count(1) from dba_recyclebin group by OWNER,TYPE order by OWNER; purge dba_recyclebin; show parameter job --1000 alter system set job_queue_processes=0; --停job --两个节点 备份sql_plan create table sql_plan_bak_node1 as select * from v$sql_plan; create table sql_plan_bak_node2 as select * from v$sql_plan; ps -ef |grep "LOCAL=NO"|grep -v grep |awk '{print "kill -9 " $2}'|sh --停分布式事务" select local_tran_id,state from dba_2pc_pending; --kill alter system archive log current; alter system checkpoint; --检查是否还有幸存的会话 [root@rac1 scripts]# cat kill.sql select 'alter system kill session '''||sid||','||serial#||''' immediate -- ' ||username||'@'||machine||' ('||program||');' commands_to_verify_and_run from v$session where &1 and sid != (select sid from v$mystat where rownum = 1) / SQL> @kill TYPE='USER' --确保只有一个本身会话

expdp 导出

  • 正常全库导出
expdp sys/xxx dumpfile=orcl%U_20211230.dmp directory=PUMP_DIR full=y parallel=16 logfile=expdp_orcl_20211230.log cluster=N EXCLUDE=STATISTICS / as sysdba
  • 排除表导出,不能指定用户,如果多个用户下有相同表名,都会被排除掉
expdp sys/xxx dumpfile=orcl%U_20211230.dmp directory=PUMP_DIR full=y parallel=16 logfile=expdp_orcl_20211230.log cluster=N EXCLUDE=STATISTICS exclude=TABLE:\"IN\(\'TB_TABLE\',\'LOG_TABLE\',\'FORM_TABLE\'\)\"

或者使用parfile,不需要转义

# vi expdp_orcl.par directory=PUMP_DIR dumpfile=orcl%U_20211230.dmp parallel=16 logfile=expdp_orcl_20211230.log EXCLUDE=STATISTICS cluster=N full=y EXCLUDE=TABLE:"IN('TB_TABLE','LOG_TABLE','FORM_TABLE')" # expdp sys/xxx parfile=expdp_yxdb.par select OWNER,TABLE_NAME from dba_tables where TABLE_NAME in ('TB_TABLE','LOG_TABLE','FORM_TABLE');
  • 指定表导出,LOB比较大的或数据量特别大的表考虑单独导
# vi expdp_orcl_lob.par directory=PUMP_DIR dumpfile=orcl_lob_20211230_%U.dmp parallel=16 logfile=orcl_lob_20211230.log EXCLUDE=STATISTICS cluster=N TABLES=TB.TB_TABLE,LOG.LOG_TABLE,FORM.FORM_TABLE # expdp sys/xxx parfile=expdp_orcl_lob.par
  • 排除用户导出
expdp sys/xxx dumpfile=orcl%U_20211230.dmp directory=PUMP_DIR full=y parallel=16 logfile=expdp_orcl_20211230.log cluster=N EXCLUDE=STATISTICS EXCLUDE=SCHEMA:\"=\'HR\'\"

或者使用parfile,不需要转义

# vi expdp_orcl.par directory=PUMP_DIR dumpfile=orcl%U_20211230.dmp parallel=16 logfile=expdp_orcl_20211230.log EXCLUDE=STATISTICS cluster=N full=y EXCLUDE=SCHEMA:"IN('TB','LOG','FORM')" # EXCLUDE=SCHEMA:"='HR'" # expdp sys/xxx parfile=expdp_orcl.par
  • 指定用户导出
expdp sys/xxx dumpfile=orcl_hr%U_20211230.dmp directory=PUMP_DIR SCHEMAS='HR','TT' parallel=16 logfile=expdp_orcl_hr_20211230.log cluster=N EXCLUDE=STATISTICS
  • 高版本数据库导入到低版本数据库,指定低版本数据库的版本号,参数 version
expdp sys/xxx dumpfile=full%U_20151117.dmp directory=dir_dp full=y parallel=4 logfile=dump20151117.log cluster=N EXCLUDE=STATISTICS version=10.2.0.4

IMPDP导入

  • 如果数据量比较大且目标端是新库,可以考虑导入前关闭归档模式,导入完成后再启用归档模式,19C 可以使用TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y在不关闭归档模式的情况下导入时不 产生归档日志,下文有说明。
srvctl stop database -d orcl -o immediate startup mount alter database noarchivelog; alter database open;
  • 按用户导入,导入前确保提前创建了表空间,角色,PROFILE
impdp sys/xxx dumpfile=orcl%U_20220104.dmp directory=PUMP_DIR schemas='ADM','HR' parallel=16 logfile=impdp_orcl_20220104_2.log cluster=N
  • 按表导入,导入前确保存在用户
impdp sys/xxx directory=DUMP_DIR dumpfile=LOB_20211211_%U.dmp parallel=16 TABLES=HR.LOB_HR logfile=impdp_LOB_20211211.log cluster=N
  • 如果数据量比较大,索引比较多,可以考虑排除索引导入 EXCLUDE=INDEX,再生成索引创建语句配置参数,设置并行,执行手动创建索引。
impdp sys/xxx dumpfile=orcl%U_20220104.dmp directory=PUMP_DIR schemas='ADM','HR' cluster=N include=index sqlfile=orcl_20220104.sql vi /datadump/orcl_20220104.sql --替换并行度 :%s/PARALLEL 1/PARALLEL 32/g --将以下参数放到脚本的开头,能一定程度加快索引的创建 alter session set workarea_size_policy=MANUAL; alter session set db_file_multiblock_read_count=512; alter session set events '10351 trace name context forever, level 128'; alter session set sort_area_size=734003200; alter session set "_sort_multiblock_read_count"=128; alter session enable parallel ddl; --如果存在索引和表不是同一个用户的情况下,也可以在此处更正,例如有的客户将索引创建在SYSTEM用户下,表空间使用的是SYSTEM表空间。
  • 导入系统授权和PUBLIC对象
impdp sys/xxx dumpfile=orcl%U_20220104.dmp directory=PUMP_DIR logfile=impdp_orcl_public_20220104.log cluster=N include=SYSTEM_GRANT,ROLE_GRANT,DB_LINK,PUBLIC_SYNONYM full=y
  • 19C 在不关闭归档模式的情况下导入时 不产生归档日志
alter database no force logging; impdp system/'oracle'@192.168.0.2:1521/pdb dumpfile=orcl%U_20210805.dmp directory=PUMP_DIR schemas='ADM','HR' TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y parallel=16 logfile=impdp_orcl_20210805.log cluster=N logtime=all exclude=index impdp system/'oracle'@192.168.0.2:1521/pdb dumpfile=orcl%U_20210805.dmp directory=PUMP_DIR schemas='ADM','HR' cluster=N include=index sqlfile=orcl_index_20210805.sql # 创建索引后开启force logging alter database force logging;

删除用户重新导入

SQL> drop user TEST cascade; drop user TEST cascade * ERROR at line 1: ORA-01940: cannot drop a user that is currently connected SQL> select INST_ID,SID,USERNAME,MACHINE,MODULE,STATUS from gv$session where USERNAME='NWTLCS_TEST'; INST_ID SID USERNAME MACHINE MODULE STATUS ---------- ---------- ----------- ---------- -------------------- -------- 2 3698 TEST jdbcclient JDBC Thin Client INACTIVE 2 5811 TEST jdbcclient JDBC Thin Client INACTIVE SQL> @kill USERNAME='TEST'

编译无效对象

col OWNER for a20 col STATUS for a15 col object_name for a50 col object_id for 99999999 col object_type for a30 SELECT OWNER,OBJECT_NAME, OBJECT_ID, OBJECT_TYPE,to_char(CREATED,'yyyy-mm-dd hh24:mi:ss') CREATED,to_char(LAST_DDL_TIME,'yyyy-mm-dd,hh24:mi:ss') LAST_DDL_TIME,STATUS,TEMPORARY,GENERATED FROM dba_objects where status<>'VALID' and owner in (select username from dba_users where ACCOUNT_STATUS in ('OPEN','EXPIRED') and username not in ('SYSTEM','SYS') and DEFAULT_TABLESPACE not in ('SYSTEM','SYSAUX')) order by owner,object_name,OBJECT_TYPE; @?/rdbms/admin/utlrp.sql

收集统计信息

nohup sqlplus / as sysdba <<EOF > stats.log & exec dbms_stats.gather_database_stats(estimate_percent => 10, degree => 32, granularity => 'ALL', cascade => TRUE); EOF

源端和目标端对比对象

对比对象个数

set line 300 pages 100 col object_type for a40 select owner,object_type,count(*) from dba_objects where owner in ('ADM','APP','HR') group by owner,object_type order by owner,count(*);

对比对象有效性

col OBJECT_NAME for a40 select owner,object_name,object_type,status old_status from dba_objects@qianyi_dblink t where status='VALID' and OBJECT_NAME not like 'SYS_%$$' and OBJECT_NAME not like 'BIN$%==%' and owner in (select username from dba_users where ACCOUNT_STATUS in ('OPEN','LOCKED') and username not in ('SYSTEM','SYS')) and not exists(select 1 from dba_objects where owner=t.owner and object_name=t.object_name and object_type=t.object_type) order by object_name; OWNER OBJECT_NAME OBJECT_TYPE OLD_STA ------------------------------ ---------------------------------------- ------------------- ------- HR AGENT_COPYX INDEX VALID HR IDX_P_ET INDEX VALID HR IDX_RAMSGL INDEX VALID HR PK_BAGCK1 INDEX VALID HR PK_BAGCK2 INDEX VALID HR PK_BFLUX INDEX VALID HR PK_BORIDRAW INDEX VALID HR PK_MSTDAILY INDEX VALID HR SYS_C0076347 INDEX VALID HR SYS_C0076383 INDEX VALID --DATAPUMP导入建表语句可能会自带约束,自动命名为 SYS_C*,对比下目标库是否存在相同列的 UNIQUE 索引 select OWNER,INDEX_NAME,INDEX_TYPE,UNIQUENESS from dba_indexes where OWNER='HR' and INDEX_NAME in ('AGENT_COPYX','IDX_P_ET','IDX_RAMSGL','PK_BAGCK1','PK_BAGCK2','PK_BFLUX','PK_BORIDRAW','PK_MSTDAILY') OWNER INDEX_NAME INDEX_TYPE UNIQUENES ------------------------------ ------------------------------ --------------------------- --------- HR AGENT_COPYX NORMAL UNIQUE HR IDX_P_ET NORMAL NONUNIQUE HR IDX_RAMSGL NORMAL UNIQUE HR PK_BAGCK1 NORMAL UNIQUE HR PK_BAGCK2 NORMAL UNIQUE HR PK_BFLUX NORMAL UNIQUE HR PK_BORIDRAW NORMAL UNIQUE HR PK_MSTDAILY NORMAL UNIQUE select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE from DBA_CONSTRAINTS where OWNER='HR' and CONSTRAINT_TYPE='U'; SQL> @ddl HR.IDX_P_ET CREATE INDEX "HR"."IDX_P_ET" ON "HR"."P_ET" ("FILE_NAME") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 731906048 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "ET_DEX" ;

导入遇到过的问题

创建 UNIQUE 索引使用并行会出现以下报错:

SQL> CREATE UNIQUE INDEX "APP"."IDX_PK_ID" ON "APP"."TABLE" ('FD_ID') ... TABLESPACE "TBS" PARALLEL 16 ; ERROR at line 1: ORA-00600: internal error code, arguments: [15803], [15], [0], [], [], [], [], [], [], [], [], [] SQL> CREATE UNIQUE INDEX "APP"."IDX_PK_ID" ON "APP"."TABLE" ('FD_ID') ... TABLESPACE "TBS" PARALLEL 1 ; Index created.

用户缺少创建dblink的权限

ORA-31685: Object type DB_LINK:"HR"."HR.ORACLE.COM" failed due to insufficient privileges. Failing sql is: CREATE DATABASE LINK "HR.ORACLE.COM" CONNECT TO "AA" IDENTIFIED BY VALUES ':1' USING 'aa' SQL> grant CREATE DATABASE LINK to hr; Grant succeeded.

修改RAC集群的 public IP地址(相同网段)

可能存在这种情况,当把数据迁移完成后,需要将目标环境的IP地址与原环境的IP地址进行对调,这样应用程序就不需要修改连接数据库的IP地址。

# 源端 down public 网卡 ifdown bond0 # 目标端修改 /etc/hosts vi /etc/hosts # 目标端检查 VIP 配置 export PATH=/u01/app/11.2.0/grid/bin:$PATH crsctl status res -t srvctl config vip -n rac1 # 此时 因修改了/etc/hosts,VIP的配置可能也会自动修改 srvctl config vip -n rac2 # 目标端停止监听和VIP srvctl stop listener srvctl stop vip -n rac1 srvctl stop vip -n rac2 crsctl status res -t # 目标端如果VIP没有自动修改,可以使用以下方式修改 srvctl modify nodeapps -A 192.168.0.3/255.255.255.0/bond0 -n rac1 srvctl modify nodeapps -A 192.168.0.5/255.255.255.0/bond0 -n rac2 # 目标库修改 local_listener alter system set local_listener = '(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3)(PORT = 1521))' sid='orcl1'; alter system set local_listener = '(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.5)(PORT = 1521))' sid='orcl2'; # 目标端检查 SCAN 配置 srvctl config scan # 目标端停止SCAN srvctl stop scan_listener srvctl stop scan crsctl status res -t # 目标端修改SCAN srvctl modify scan -n db-scan srvctl config scan # 目标端RAC依次关闭CRS,修改物理IP地址 crsctl stop crs vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.0.2 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 TYPE=Ethernet BONDING_OPTS="mode=1 miimon=100" # 目标端重启网卡 ifdown bond0 ifup bond0 # 目标端启动CRS crsctl start crs #检查 crsctl status res -t lsnrctl status lsnrctl status LISTENER_SCAN1

目标端修改完成后,可以安装以上方法再修改源端IP。

最后修改时间:2023-03-24 13:11:42
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论