资讯专栏INFORMATION COLUMN

使用xtts迁移oracle数据库

IT那活儿 / 3296人阅读
使用xtts迁移oracle数据库
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!
ORACLE有DATA GUARD(ADG)、EXPDP/IMPDP、RMAN、存储、XTTS几种迁移方式,早前发布过一篇《ORACLE-ADG方式迁移数据库-NBU中恢复数据文件》,大家可以回顾一下,本次迁移使用xtts方式迁移数据库

确定迁移对象

compute sum of size_gb ON report break on report on SIZE_GB
select  TABLESPACE_NAME,sum(BYTES)/1024/1024/1024  size_gb from  dba_segments
where  TABLESPACE_name not  in(SYSTEM,SYSAUX) group  
by  TABLESPACE_NAME;
存在部分用户下无表或者索引的情况,合计所有用户(一定要和开发商确认)如下:

set  line 200  pages 999
select  USERNAME,ACCOUNT_STATUS,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE
from  dba_users
where  USERNAME not  in  (select  * from  DBA_USERS_WITH_DEFPWD) and  USERNAME not  in(SYST
EM
,SYS,OUTLN,MGMT_VIEW,DBSNMP,ANONYMOUS,CTXSYS,SYSMAN,MDSYS,ORDPLUG
INS
,SI_INFORMTN_SCHEMA,OLAPSYS,DMSYS,XDB,EXFSYS,ORDSYS,WMSYS,SCOTT,
ORACLE_OCM
,DIP,TSMSYS,MDDATA,APEX_030200,APPQOSSYS,OWBSYS,ORDDATA,FLO
WS_FILES
,OWBSYS_AUDIT,APEX_PUBLIC_USER);

迁移方案

  • XTTS传输表空间(使用dbms_file_transfer初始化) 
    ##空间需求
    源库
        增量备份文件存放路径;
      (增量备份根据业务情况进行确定,如迁移之前已经暂停业务则增量备份会较小,注意根据当前网络状态,周期越长增量备份集越大)
    新库
        增量备份文件存放路径;

      (要注意生产的表空间的一天的增量备份会有多大,增量备份周期越短越好)

提前准备工作

1. 检查时区设置

select  dbtimezone  from  dual;

如果源和目标不一致,则检查有没有列类型为timezone的表。

Data Pump TTS ImportFails With ORA-39002 And ORA-39322 DueTo TIMEZONE Conflict (Doc ID 1275433.1)

2. 失效对象检查

--提前检查
set  linesize 200  pages 999
col  OWNERfor a30
col  OBJECT_NAME for  a30
col  OBJECT_TYPE for  a25
select  owner,object_name,object_type ,status  from  all_objects where  status  = INVAL ID;

3. 检源库不可用索引检查

确认是否重建或删除 --提前检查
为了避免TTS迁移触发Oracle Bug 12321309,确认原环境无不可用索引
select owner, index_name, status from dba_indexes where status=UNUSABLE order by 1, 2;
no rows selected
select i.owner, i.index_name, p.partition_name, p.status from dba_ind_partitions p,db a_indexes i where p.index_name=i.index_name and p.status=UNUSABLE order by 1,2,3;
no rows selected
select i.owner,i.index_name,s.subpartition_name,s.status from dba_ind_subpartitions s ,dba_indexes i
where s.index_name=i.index_name and s.status=UNUSABLE order by 1,2,3;
no rows selected
###compatible Advanced Queues检查 --提前检查
可传输表空间不支持8.0-compatible advanced queues with multiple recipients的迁移。
select owner,queue_table,recipients,compatible 
from dba_queue_tables
where recipients=MULTIPLE and compatible like %8.0%;

4. 检查目标端补丁情况

set  line 200  pages 999
col  opatch for  a40
col  comments for  a80
select  opatch,comments from  dba_registry_history;
如果准备阶段使用dbms_file_transfer方法,目标端建议安装的补丁如下

Patch 19023822,修复目标端使用dbms_file_transfer.get_file包获取源端数据文件出现ORA-03106的情况。

Patch 22171097: MERGE REQUEST ON TOP OF DATABASE PSU 11.2.0.4.6 FOR BUGS 17534365 19023822

5. 检查相同表空间下是否存在不同目录下的同名数据文件

col file_name for a45 
select file_name, bytes / 1024 / 1024 / 1024 G
  from dba_data_files
  order by 1;

select count(*)
from (select file_name, bytes / 1024 / 1024 / 1024 G
from dba_data_files
order by 1);

select count(*)
from (select distinct file_name from dba_data_files order by 1);
--注意数据文件路径是否相同,如果不同,需要进一步处理,如:
select  count(*) from  (
select  distinct(substr(file_name,26)) from  dba_data_files 3 )
--由于是ASM管理,所以不存在不同目录的同名数据文件###基于XMLSchema的XMLType对象检查 --提前检查
col OWNER for a25 
col LOC for a15
col SCHEMA_URL for a150
set line 200 pages 9999 
SELECT OWNER, LOCAL, SCHEMA_URL FROM DBA_XML_SCHEMAS;
6. 在目标端创建检查用dblink
--提前执行;
--创建dblink用于比对原环境。
create database link ttslink connect to db****** identified by xxx using ****; 
create public database link XTTSLINK connect to perfstat identified by perfstat using 
XTTSSRE;

7. 检查数据库独有永久表空间

-在目标库环境中执行如下命令:
select rownum, tablespace_name, type from ( select s.tablespace_name, l.encrypted type from dba_tablespaces@XTTSLINK s, 
dba_tablespaces L where s.tablespace_name = l.tablespace_name(+) and l.tablespace_name is null and s.contents=PERMANENT order by 1 );
ROWNUM TABLESPACE_NAME TYP ---------- ------------------------------ ---
1 DBDATA
2 DBIDX
3 PART201211
4 PART201211_IDX
5 PART201212
6 PART201212_IDX
7 PART201301
8 PART201301_IDX
9 PART201302
10 PART201302_IDX
11 PERFSTAT
   ROWNUM TABLESPACE_NAME TYP ---------- ------------------------------ ---
12 USERS

8. 检查源数据库和目标库具有重复名称的表空间

--除不参与传输的表空间外(SYSTEM,SYSAUX,PERFSTAT,XDB等),不能有重名表空间。

--提前检查+实施前检查。

表空间不能重名。
select  rownum, tablespace_name, type
from  (
select  s.tablespace_name, l.encrypted type
from  dba_tablespaces@xttslink s, dba_tablespaces L
where  s.tablespace_name = l.tablespace_name and  s.contents=PERMANENT
order  by  1);
9. 检查是否存在应用用户建在system,sysaux上的情况
users表空间,可以把目标端现有的users表空间rename执行如下命令:
--提前检查+实施前检查,若为系统用户则无需处理。
还需要注意users表空间的情况:
set line 200 pages 999 
col owner for a20;
col segment_name for a40;
col tablespace_name for a40;
col segment_type for a30;
select distinct owner ,segment_name, tablespace_name,segment_type
from dba_segments@xttslink s, dba_users@xttslink u
where s.owner=u.username and u.default_tablespace not in (SYSAUX, SYSTEM) and s.t ablespace_name in (SYSTEM, SYSAUX);

10. 检查命令进行自包含检查 

--提前检查+实施前检查。

--在源环境执行如下命令:
declare 
checklist clob;
i number := 0;
begin for ts in (select tablespace_name from dba_tablespaces where tablespace_name not in (SYSTEM,SYSAUX) and contents = PERMANENT) loop if (i=0) then checklist := ts.tablespace_name;
else checklist := checklist||,||ts.tablespace_name; end if; i := 1;
end loop;
dbms_tts.transport_set_check(checklist,TRUE,TRUE);
 end;

/--检查是否存在记录,如不存在,则正确。
select * from transport_set_violations;

11. 比对新旧环境role是否一致,如不一致,则手工创建(包括角色的赋权)

--提前检查,环境搭建过程中应创建:
SELECT T.ROLE
FROM (SELECT S.ROLE ROLE,L.ROLE DIFFER_ROLE,S.PASSWORD_REQUIRED,L.AUTHENTICATION_TYPE FROM DBA_ROLES@XTTSLINK S, DBA_ROLES L WHERE S.ROLE = L.ROLE(+)) T 
WHERE T.DIFFER_ROLE IS NULL;
提前创建role:
create role ROLE_OPER; 
grant SELECT ANY DICTIONARY,SELECT ANY TABLEto ROLE_OPER;
select * from dba_sys_privs where grantee =ROLE_OPER;
GRANTEE PRIVILEGE ADM ------------------------------ -----------------------------
 ROLE_OPER SELECT ANY DICTIONARY NO
 ROLE_OPER SELECT ANY TABLE NO
12. 比对新旧环境profile是否一致,如不一致,则手工创建
--提前检查,环境搭建过程中应创建:
select  distinct(t.pro) from
(select  s.profile pro, l.profile pro2
from  dba_profiles@xttslink s, dba_profiles l
where  s.profile = l.profile(+)) t where  t.pro2 is  null
order  by  t.pro;
PRO
---------------------------------------------
LIMIT_USER
MUSIC_BASE
--提前创建:
create  profile LIMIT_USER limit  PASSWORD_GRACE_TIME  7;
create  profile MUSIC_BASE limit  PASSWORD_GRACE_TIME  7;
--限制:
set  line 200  pages 999
col  PROFILE for  a25
col  LIMIT  for  a45
col  RESOURCE_NAME for  a30
col  RESOURCE_TYPE for  a25
select  * from  dba_profiles@xttslink where  PROFILE=upper(&pro_name) and  LIMIT  not  in (DEFAULT);

  select  ALTER profile ||PROFILE || limit || RESOURCE_NAME|| ||LIMIT  ||;  f rom dba_profiles@xttslink where  PROFILE=upper(&pro_name) and  LIMIT  not  in  (DEFAULT );

13. 确认用户默认表空间情况

--查询差异用户默认表空间:
set  line 200  pages 999
select  USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE
from  dba_users@xttslink
where  username in  (select  s.USERNAME name
from  dba_users@xttslink s, dba_users l
where  s.username = l.username(+)
and  l.username is  null);
--生成恢复用户默认表空间和临时表空间的脚本。
---提前准备:
select alter user  || username ||  
default tablespace
 || default_tablespace || temporary tablespace  ||
temporary_tablespace || ;
from dba_users@xttslink
where username in (select s.USERNAME name from dba_users@xttslink s, dba_users l where s.username = l.username(+) and l.username is null);
--保存结果备用:
alter user DBMBOPR default tablespace DATAWEB temporary tablespace TEMP; 
alter user YANGHUAN default tablespace USERS temporary tablespace TEMP;
alter user YD_CHENSHUAI default tablespace USERS temporary tablespace TEMP;
alter user YINQI default tablespace TBS_OPER temporary tablespace TEMP;
14. 创建非默认的temp表空间
如果存在用户的默认表空间在目标哭不存在,则创建:
CREATE  TEMPORARY  TABLESPACE  "TEMP2"  TEMPFILE +data;
###新旧环境网络配置文件检查。
在新旧环境中对比listener.ora、tnsnames.orasqlnet.ora文件,需保持一致。

15. 在新环境中比对并创建用户

执行以下命令获取新环境缺少的用户,获取HPUX环境应用用户创建脚本,将所有应用用户默认表空间修改为users,临时表  空间修改为TEMP,在新环境上创建应用用户 --提前创建。
--检查缺少的用户:
select  s.USERNAME name
from  dba_users@xttslink s, dba_users l
where  s.username = l.username(+)
and  l.username is  null
order  by  name;

--创建用户并使用原密码

    先查询出源密码再创建用户:

set  line 300  pages 0
select  alter user   || name  || identified by values   ||   ||
PASSWORD || ;
from  sys.user$@xttslink
where  name  in  (select  s.USERNAME name
from  dba_users@xttslink s, dba_users l
where  s.username = l.username(+)
and  l.username is  null);
set  line 200  pages 999
select  create user   || USERNAME || identified by oracle; from  dba_users@xttslink s
where  s.username in  (select  s.USERNAME name
from dba_users@xttslink s, dba_users l
where s.username = l.username(+)
and l.username is null);
--创建完成后再次通过查询确认是否一致。
###检查原环境是否存在空段。
select  OWNER||.||TABLE_NAME from  dba_tables where  OWNER in(xx) and  NUM_ROWS=0;
--结果不一定准确,取决于统计信息。
手工分配一个段:
set  line 200  pgaes 9999
select  alter table || OWNER||.||TABLE_NAME || allocate extent;  from  dba_tables where  num_rows=0  and  OWNER in(xx)

若存在,deferred_segment_creation参数需修改后true,迁移完成后修为false

16. 生成为应用用户赋对象权限脚本

--检查脚本并删除其中对系统用户赋权的语句:
set head off 
set linesize 500 pages 999999 
spool tts_sys_privs.sql
-- Grant Table privileges
select grant  || privilege ||  on " || owner || "." || table_name || 
" to " || grantee || " || 
decode(grantable, YES, with grant option ) || 
decode(hierarchy, YES, with hierarchy option ) || ; 
from dba_tab_privs a
where owner in 
(select name from system.logstdby$skip_support where action = 0)
and grantee in 
(select username
from dba_users
where username not in (select name
from system.logstdby$skip_support
where action = 0))
and a.table_name not in (select DIRECTORY_NAME from dba_directories);
-- Grant Column privileges
select grant  || privilege ||  ( || column_name || )  ||  on  || 
owner || . || table_name ||  to  || grantee ||   || 
decode(grantable, YES, WITH Grant option) || ;
 from dba_col_privs
where owner in 
(select name from system.logstdby$skip_support where action = 0) and grantee in

(select username from dba_users where username not in 
(select name from system.logstdby$skip_support where action = 0));
 --Grant directories privileges. select grant  || privilege ||  on directory " || owner || "." || table_name || " to " || grantee || " || decode(grantable, YES, with grant option ) || decode(hierarchy, YES, with hierarchy option ) || ; from dba_tab_privs a where owner in (select name from system.logstdby$skip_support where action = 0) and grantee in (select username from dba_users where username not in (select name from system.logstdby$skip_support where action = 0)) and a.table_name in (select DIRECTORY_NAME from dba_directories); select GRANT ||PRIVILEGE|| TO ||GRANTEE||; from dba_sys_privs where grantee in (SRPT,WEBSW);
--注意修改对应的schema spool off set head on

17. 数据库字符集检查

--新库和原库字符集要设置一致,否则后面表空间元数据导入会失败重要!!!!!!
--经检查新旧两库字符集均为:
set  line 200  pages 999
col  NAME  for  a35 col  VALUE$ for  a35
col  COMMENT$ for  a75
select  * from  props$ where  name  like  %CHARACTERSET%;

NAMEVALUE$ COMMENT$
------------------------------------- ---------------------
NLS_CHARACTERSETZHS16GBK Character  set NLS_NCHAR_CHARACTERSETAL16UTF16 NCHAR  Character  set

select  * fromsys.props$@XTTSLINK where  name  like  %CHARACTERSET%;
18. 在目标库上创建对应的schema以及授权
--该部分要在目标端创建schema、对象权限、系统权限;
Per generic TTS requirement, ensure that the schema users required for the tablespace transport exist in the destination database.软件包准备和配置。
###下载上传。

19. 解压部署

  • .XTTS脚本部署
    l source节点:/backup
    l target节点:/backup (完成配置后可从source端配置完成后复制过来)
  • 确定目标【需要更新】
    确定主机
    Source hostname =
    Source DB name =
    Destination hostname =
    Destination DB name =
    lxtt.properties 参数文件配置
-重点!!!
(特别注意oracle环境变量的一个参数设置,TMPDIR--该参数会生成对应的rman等脚本,如果不设置会保存到/tmp目录下)
tablespaces= {需要传输的表空间}
platformid= {源端平台号,select * from v$transportable_platform  order by platform_id 语句查询得到)}
srcdir= {当使用dbms_file_transfer时使用,表示源库存放数据文件的路径(数据库里的dir,不是os上的 dir)}
dstdir= {当使用dbms_file_transfer时使用,表示目标库存放数据文件的路径(数据库里的dir,不是os上的dir)}
srclink= {从目标端指向源端的dblink,当使用dbms_file_transfer时使用}
dfcopydir= {源端datafile convert保存路径}
backupformat= {源端增量备份保存路径}
stageondest= {目标端备份文件,建议和backupondest设置为同一路径}
backupondest= {目标端备份文件保存路径,建议和stageondest设置为同一路径}
storageondest= {目标端恢复到数据库的数据文件保存位置,如果是diskgroup则需要注意还需要对应的数据库名}
cnvinst_home= {新环境$ORACLE_HOME}
cnvinst_sid= {新环境ORACLE_SID}
asm_home= {如果是直接恢复到diskgroup,则需要指定对应的grid_home和ASM实例}
asm_sid= {如果是直接恢复到diskgroup,则需要指定对应的grid_home和ASM实例}
parallel= {设置并行,建议设置为6或者8,根据CPU情况设置}
rollparallel= {roll forward 并行,如果数据库大的话建议设置为8}
getfileparallel= {getfile 并行度,建议设置为6或者8,根据CPU情况设置}
desttmpdir= {设置目标端tempdir目录,建议指向xtts目录)}
-- example
  • ** 注意每一行之后不要有空格**
tablespaces=test1,test2 
platformid=13

srcdir=SREDIR,DIR02 --如果有多个用逗号分隔
dstdir=TARDIR
srclink=ttslink
dfcopydir=/stage_source
backupformat=/backup_data
stageondest=/backup_data
backupondest=/backup_data storageondest=+DATA/ora11g/datafile
cnvinst_home=/u01/app/oracle/product/11.2/db_1 cnvinst_sid=ora11g
asm_home=/u01/app/11.2.0/grid
asm_sid=+ASM
parallel=3 
rollparallel=2 
getfileparallel=4
  • 创建并检查对应的目录是否存在。
    源库和新库都要检查。
  • 确定迁移表空间。

迁移过程

1. 配置目录对象和dblink
目标端的数据库版本是 11.2.0.4,使用dbms_file_transfer方式进行文件文件转换。
--创建源端DIR:
create  directory  SREDIR as  +data/ZHDB/datafile;
--配置xtt.properties:
  xtt.properties中的参数srcdir指定源端dir.
--创建目标端DIR:
create  directory  TARDIR as  +data/ZHDB/datafile;
--配置xtt.properties:
  xtt.properties中的参数dstdir指定目标端dir.

注意源端DIR与目标端DIR需要满足以下要求中的一个:

  • 目标端DIR如果大于一个,需要源端目录数和目标端目标数相同,目标端每个目录大小大于等于源端大小;
  • 目标端DIR只有一个,目标端的目录大小要足够存放所有的表空间数据文件。
多个目录用逗号分隔
在目标库建立指向源端的DBLINK。
注意源端 dblink使用的用户要对SREDIR目录有读的权限。

2. 配置环境变量

export TMPDIR=/backup export XTTDEBUG=1

3. 数据文件转换

该阶段通过dbms_file_transfer方法将迁移表空间的对应的数据文件从源端传输到目标端的最终位置,同时会对进行跨平台格 式转换。
【源库端】以oracle用户在源端执行以下命令:
perl  xttdriver.pl -S
此步骤会生成xttnewdatafiles.txt, getfile.sql两个文件,需要拷贝到目标端。
【目标端】以oracle用户执行以下命令:
perl  xttdriver.pl -G
该步骤执行完成之后,数据将从源端传输到目标端,并会进行格式转换。
4. 第1次增量备份和recover
4.1【源库端】第1次增量备份
【source system】, logged in as the oracle user with 
the environment (ORACLE_HOME and ORACLE_SID environment variables) pointing to the source database,
run the create inc remental step as follows:
$  su – oracle
$  export  XTTDEBUG=1 (打开debug功能)
$  TMPDIR=/backup <--必须
$  export  TMPDIR
$  cd  $TMPDIR
$  nohup perl xttdriver.pl -i > xttdriver.pl_i.out
该过程会生成tsbkupmap.txt、incrbackups.txt、xttplan.txt文件,将这三个文件连体备份集,一起传输到目标端,其中要注意需要incrbackups.txt中备份集的目录,并且拷贝一份到目标端的备份集存放的位置。
scp incrbackups.txt tsbkupmap.txt xttplan.txt ora11204:/home/oracle/xtts
scp `cat incrbackups.txt`  ora11204:/home/oracle/xtts

4.2【源库端】将增量备份文件和关键文件传到目标端

  • incrbackups.txt 文件copy到【目标端】stageondest参数配置路径;
  • copy 对应增量备份到stageondest参数配置路径;
生成的增量备份集文件名称在incrbackups.txt,将该文件记录的文件拷贝到目标端的Stageondest参数指定的路径。
scp `cat incrbackups.txt`  oracle@dest:/stage_dest
4.3【目标端】进行第1次recover
$ export  XTTDEBUG=1 (打开debug功能)
$ export  TMPDIR=/backup <--必须
$ env|grep ORA
$ cd  $TMPDIR
确认完成后在【目标端】执行recover:
nohup  perl  xttdriver.pl  -r  > xttdriver.pl_r.out  &
此处目标库会自动发生重启操作。
4.4【源库端】进行From_SCN递增
注意:【目标端】每次做完recover动作后,【源端】要确定下一次增量备份的起点。
在【源端】执行如下操作:
perl  xttdriver.pl -s

【源库端】第2-N次增量备份

视具体情况,重复进行增量备份恢复。

5. 最后的增量备份和recover
5.1【源库端】表空间设置为read only
停数据库监听:
srvctl stop  listener
将表空间设为只读:
alter  tablespace  USERS  read  only;
alter  tablespace  PERFSTAT read  only;
alter  tablespace  DBDATA read  only;
alter  tablespace  DBIDX read  only;
alter  tablespace  PART201211 read  only;
alter  tablespace  PART201212 read  only;
alter  tablespace  PART201301 read  only;
alter  tablespace  PART201302 read  only;
alter  tablespace  PART201211_IDX read  only;
alter  tablespace  PART201212_IDX read  only;
alter  tablespace  PART201301_IDX read  only;
alter  tablespace  PART201302_IDX read  only;
--检查表空间状态:(检查是否有遗漏)
select  TABLESPACE_NAME,status  from  dba_tablespaces;
--read only后检查表空间状态:
select  tablespace_name ,status  from  dba_tablespaces 
where  tablespace_name not  in  (sel ect tablespace_name
from  dba_temp_files) order  by  2;
5.2【源库端】最后一次增量备份
su – oracle
export XTTDEBUG=1 (打开debug功能)
TMPDIR=/xxxx/xxxxx/xxxx <--必须export TMPDIR
cd $TMPDIR
nohup perl xttdriver.pl -i > xttdriver.pl_i.out
scp incrbackups.txt oracle@dest: /home/oracle/xtt
scp xttplan.txt oracle@dest: /home/oracle/xtt
scp tsbkupmap.txt oracle@dest: /home/oracle/xtt
5.3【目标端】目标库recover
su – oracle
cd  $TMPDIR
env|grep  ORA (检查ORA*环境变量)
env|grep  TMP (检查TMPDIR设置 )
export XTTDEBUG=1  (打开debug功能)
nohup perl  xttdriver.pl -r > xttdriver.pl_r.out &
看到如下状态:
CONVERTED BACKUP PIECE/ogg/11204/xtts/xib_0jpuu017_1_1_5
PL/SQL procedure successfully completed.
Entering RollForward
After applySetDataFile
Done: applyDataFileTo
Done: applyDataFileTo
Done: RestoreSetPiece
Done: RestoreBackupPiece
PL/SQL procedure successfully completed.
alter database mount
alter database open
之后该步骤正常结束。

以上步骤是脚本自动将目标库重启,不需要人工干预,如果出现到mount状态出现异常,根据情况手工执行后续命令

元数据同步

1. 在目标端创建owner用户,临时表空间和对象
1.1 创建owner用户
使用准备阶段生成的脚本创建owner用户,先使用users表空间为默认表空间。
CREATE  USER  "PERFSTAT"  IDENTIFIED  BY  VALUES  AC98877DE1297365
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP"
PROFILE "JKPROFILE";
CREATE  USER  "CMS_QK"  IDENTIFIED  BY  VALUES  77BA35F33A8487D6
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "HTWH"  IDENTIFIED  BY  VALUES  87FFC382FE7C1DA2
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "MONITOR"  IDENTIFIED  BY  VALUES  A3A1625C0BBFBB11
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "CMS_QK_MON"  IDENTIFIED  BY  VALUES  363F33F53D8E54BD
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "CMS_WEB"  IDENTIFIED  BY  VALUES  64AA14665800955C
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "GGMGR"  IDENTIFIED  BY  VALUES  0282C015C1E7863A
DEFAULT  TABLESPACE  "PERFSTAT"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "CP_CMS"  IDENTIFIED  BY  VALUES  2D31CF8737D9DF4A
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "RWPS"  IDENTIFIED  BY  VALUES  C414AE2DF79E4D88
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "QA_ADM"  IDENTIFIED  BY  VALUES  96E1D9DBE01FE02A
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "TONGJI"  IDENTIFIED  BY  VALUES  AC21D229C2D4B335
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "LIPING"  IDENTIFIED  BY  VALUES  10FA98B59CE40EAC
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "CMS_KARA"  IDENTIFIED  BY  VALUES  A54B542ECE4941CB
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "TMP"  IDENTIFIED  BY  VALUES  03F30EDF384785D9
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "MIGUER"  IDENTIFIED  BY  VALUES  8BA29466C43A2BA5
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "ZHENGPQ"  IDENTIFIED  BY  VALUES  DA33E25E0F999444
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "TAOCHAO"  IDENTIFIED  BY  VALUES  FFAE2FBDA1C6B120
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "MIGU"  IDENTIFIED  BY  VALUES  19C0D04708B4AA31
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP"
PROFILE "LIMIT_USER";
CREATE  USER  "ZABBIX"  IDENTIFIED  BY  VALUES  S:3EBE9EF3CF34E469BD2C1BD04EA25AAD8B95BA89 A2D1E9C2B7E080AE827B;9A31F4B8D0743A01
DEFAULT  TABLESPACE  "USERS_OLD"
TEMPORARY  TABLESPACE  "TEMP";
CREATE  USER  "GGMGR"  IDENTIFIED  BY  VALUES  0282C015C1E7863A
DEFAULT TABLESPACE " USERS_OLD
TEMPORARY TABLESPACE "
TEMP";
1.2 创建临时表空间
依照原库上的临时表空间大小,在目标端创建同名临时表空间。
1.3 创建临时表
查询原库中的临时表,并获取创建语句:
Select table_name,owner from dba_tables where TEMPORARY=Y; Set long 9999
Select dbms_metadata.get_ddl(table,table_name,owner) from dual;
如果临时表对象较多,可以在传输阶段元数据导入后,将这些临时表的表结构导入到目标端。
2. 第一次元数据导入
--导入之前,先检查用户,profile等,如不存在就先导入用户信息。
2.1 目标环境执行
1 perl  xttdriver.pl -e
修改xttplugin.txt作为参数文件,脚本是利用dblink导入数据,太慢;直接在源端导出dmp,目标端导入更快;
cat  xttplugin.txt
impdp directory=
logfile=log>
network_link=
transport_full_check=no  
transport_tablespaces=TTS1,TTS2,TTS3
transport_datafiles=+DATA/orcl/datafile/tts1_267_946218825,+DATA/orcl/datafile/tts 2_268_946218837,+DATA/orcl/datafile/tts3_269_946218841
2.2 导出参数如下
userid=/ as sysdba
directory=mydir
dumpfile=xtts.dmp
TRANSPORT_TABLESPACES=TTS2,TTS1,TTS3 --从xttplugin.txt文件里取
transport_full_check=no
exclude=STATISTICS,INDEX_STATISTICS,TABLE_STATISTICS --仅仅只写STATISTICS,仍然会导出统计信息
导出元数据不能开并行,如果数据库较大,会很耗时,务必要排除统计信息。
2.3 导入参数如下
userid=/ as sysdba
directory=mydir
dumpfile=xtts.dmp
transport_datafiles=+data/orcl/DATAFILE/tts1_267_946218825,+data/orcl/DATAFILE/tts
2_268_946218837
,+data/orcl/DATAFILE/tts3_269_946218841
cluster=n ----从xttplugin.txt文件里取
3. 第二次导入元数据
3.1 导出参数文件如下
userid=/ as sysdba
directory=mydir
dumpfile=metadata.dmp
schemas=zly1,zly2,zly3
content=metadata_only exclude=index,table,constraint,STATISTICS
parallel=1
exclude=STATISTICS
3.2 导入参数如下
userid=/ as sysdba
directory=mydir
dumpfile=metadata.dmp
parallel=1
原库|目标库表空间设置为read write
导入完成后,目标库表空间的表空间设置为read write,原库表空间设置为read write

alter  tablespace  USERS  read  write;
alter  tablespace  PERFSTAT read  write;
alter  tablespace  DBDATA read  write;
alter  tablespace  DBIDX read  write;
alter  tablespace  PART201211 read  write;
alter  tablespace  PART201212 read  write;
alter  tablespace  PART201301 read  write;
alter  tablespace  PART201302 read  write;
alter  tablespace  PART201211_IDX read  write;
alter  tablespace  PART201212_IDX read  write;
alter  tablespace  PART201301_IDX read  write; alter  tablespace  PART201302_IDX read  write;

后续工作

1. 建立PUBLIC同义词
检查新环境同义词,若无,则按以下脚本创建:
set  line 230  pages 999
SELECT  CREATE PUBLIC SYNONYM ||SYNONYM_NAME|| FOR ||TABLE_OWNER||.||TABLE_NAME|
|;
FROM  DBA_SYNONYMS WHERE  TABLE_OWNER in  (**,test) AND  OWNER = PUBLIC;
(create_synonym.txt)
2. 建立PUBLIC database link
知道密码的情况下直接创建,不知道则使用数据泵导出,或者交由业务处理。

3. 编译失效对象

SQL>@?/rdbms/admin/utlrp.sql
grant execute on sys.DBMS_AQ to QA_ADM;
4. 用户设置更改
使用准备阶段生成的脚本更改用户的DEFAULT_TABLESPACE,,TEMPORARY_TABLESPACE ,权限以及profile。
alter user MIGU default tablespace USERS ;
alter user PERFSTAT default tablespace DBDATA ;
alter user GGMGR default tablespace PERFSTAT ;
alter user MIGUER default tablespace DBDATA ;
alter user TONGJI default tablespace DBDATA ;
alter user LIPING default tablespace DBDATA ;
alter user ZABBIX default tablespace USERS ;
alter user MONITOR default tablespace DBDATA ;
alter user RWPS default tablespace DBDATA ;
alter user CMS_QK_MON default tablespace DBDATA ;
alter user TMP default tablespace USERS ;
alter user CMS_KARA default tablespace DBDATA ;
alter user CMS_QK default tablespace DBDATA ;
alter user QA_ADM default tablespace DBDATA ;
alter user CMS_WEB default tablespace DBDATA ;
alter user CP_CMS default tablespace DBDATA ;
alter user TAOCHAO default tablespace USERS ;
alter user HTWH default tablespace DBDATA ;
alter user ZHENGPQ default tablespace USERS ;

5. 序列重建

通过原库生成序列脚本,新库上重建创建。
第二次导入源数据已经导入了序列,此处不必再处理。

6. 临时表的处理

--获取临时表的定义,并在新环境创建:
set  linesize 200  pages 999  long  999999
select  dbms_metadata.get_ddl
(TABLE,upper(t.TABLE_NAME),upper(t.OWNER)) from  dba_ta bles t where  TEMPORARY=Y  and  owner=RPT;
第二次元数据导入时已经导入,不必处理。

7. 索引状态检查

检查索引状态是否有效,如有索引失效,则开并行重建(完成后将degree修改为0) ,迁移后新旧环境比对。

8. 对象个数比较

注意:验证新旧环境对象个数前,原环境需要清理dba_recyclebin,保证检查对象一致。
purge recyclebin;
9. 验证新旧环境segment_type, TMP临时表空间和CLOB索引不一致则默认无异
【新环境执行】:
select  r.owner, r.segment_type, r.remote_cnt Source_Cnt, l.local_cnt Target_Cnt
from  ( select  owner, segment_type, count(owner) remote_cnt
from  dba_segments@xttslink
where  owner not  in
(select  name
from  system.logstdby$skip_support
where  action=0)
AND  SEGMENT_NAME NOT  LIKE  BIN%  group  by  owner, segment_type ) r, ( select  owner, segment_type, count(owner) local_cnt
from  dba_segments
where  owner not  in
(select  name
from  system.logstdby$skip_support
where  action=0) AND  SEGMENT_NAME NOT  LIKE  BIN%  group  by  owner, segment_type ) l
where  l.owner (+) = r.owner
and  l.segment_type (+) = r.segment_type
and  nvl(l.local_cnt,-1) != r.remote_cnt
order  by  1, 3  desc

10. 验证新旧环境object_type

【新环境执行】:
select  r.owner, r.object_type, r.remote_cnt Source_Cnt, l.local_cnt Target_Cnt
from  ( select  owner, object_type, count(owner) remote_cnt
from  dba_objects@xttslink
where  owner not  in
(select  name
from  system.logstdby$skip_support
where  action=0) group  by  owner, object_type ) r
, ( select  owner, object_type, count(owner) local_cnt
from  dba_objects
where  owner not  in
(select  name
from  system.logstdby$skip_support
where  action=0) group  by  owner, object_type ) l
where  l.owner (+) = r.owner
and  l.object_type (+) = r.object_type
and  nvl(l.local_cnt,-1) != r.remote_cnt
order  by  1, 3  desc;
若不一致使用以下脚本检查具体的差异性,并确认原因, 如果OBJECT_NAMESYS_LOB%或者SYS_C00的错误则可忽略。
select  owner,object_name,SUBOBJECT_NAME,object_type from  dba_objects@xttslink
where  status  = VALID  and  owner in  (XXXX)
minus
select  owner,object_name ,SUBOBJECT_NAME,object_type from  dba_objects
where  status  = VALID  AND  owner in  (XXXX); 注意修改
如果是公共同义词不一致且非系统同义词,则手工创建。(SYS_IL0000886564C00009$$ 这一类的索引也可以忽略,LOB索引,在源库和新库上生成的索引名字不同而已)
  • 查到索引再建在哪一张表:
select OWNER,INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,
TABLE_TYPE,STATUS from DBA_indexes where 
INDEX_NAME=SYS_IL0000886564C00010$$
  • 根据表名在源环境和新环境去检查:
select
OWNER,INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,
TABLE_TYPE,STATUS from DBA_indexes where 
TABLE_NAME=IVR_CALL_20160627;
  • 查看有差异的表:
alter session set nls_date_format = yyyy-mm-dd hh24:mi:ss;
select OWNER,OBJECT_NAME,OBJECT_TYPE,CREATED from 
dba_objects where OBJECT_NAME=SYS_TEMP_FBT;

11. 新旧环境检查失效对象是否一致

【新环境执行】:
select  l.owner, l.object_type, r.remote_cnt Source_Cnt, l.local_cnt Target_Cnt
from  ( select  owner, object_type, count(owner) remote_cnt
from  dba_objects@xttslink
where  owner not  in
(select  name
from  system.logstdby$skip_support
where  action=0) and  status=INVALID
group  by  owner, object_type ) r
, ( select  owner, object_type, count(owner) local_cnt
from  dba_objects
where  owner not  in
(select  name
from  system.logstdby$skip_support
where  action=0) and  status=INVALID
group  by  owner, object_type ) l
where  l.owner = r.owner (+)
and  l.object_type = r.object_type (+)
and  l.local_cnt != nvl(r.remote_cnt,-1)
order  by  1, 3  desc
如果失效对象不一致,则查看新环境中对象失效原因。拷贝源端tnsnames.ora sqlnet.ora等文件到目标端。

12. 地址修改

数据库在确认迁移成功后 ,将原VIP和SCAN IP地址修改到目标端停源端CRS,在两节点执行。
1 crsctl stop  crs
  • 修改VIP地址。
  • 获取当前的配置信息:
[oracle@mhdb1 backup]$ srvctl config nodeapps -n mhdb1 -a
-n option  has been deprecated.
 Network exists: 1/10.25.136.0/255.255.255.0/bond0, type  static
 VIP exists: /mhdb1-vip/10.25.136.12/10.25.136.0/255.255.255.0/bond0, hosting node mhd b1
[oracle@mhdb1 backup]$ srvctl config nodeapps -n mhdb2 -a
-n option  has been deprecated.
 Network exists: 1/10.25.136.0/255.255.255.0/bond0, type  static
 VIP exists: /mhdb2-vip/10.25.136.14/10.25.136.0/255.255.255.0/bond0, hosting node mhd b2
  • 停目标端数据库:
srvctl stop  database  –d zhdb
  • 停目标端VIP:
srvctl stop  vip –n mhdb1 -f
srvctl stop  vip –n mhdb2 -f
-两个节点修改目标端/etc/hosts文件:
10.25.136.37  mhdb1-vip
10.25.136.38  mhdb2-vip
10.25.136.240  mhdb-scanip
  • 修改VIP,以root执行:
srvctl  modify nodeapps -n mhdb1 -A mhdb1-vip/255.255.255.0/ bond0
srvctl modify nodeapps -n mhdb2 -A mhdb2-vip/255.255.255.0/ bond0
  • 验证修改后的IP地址:
srvctl  config nodeapps -a
  • 修改SCAN IP:
srvctl stop  scan_listener
srvctl stop  scan
srvctl modify  scan  –n mhdb-scanip srvctl config scan
srvctl start  scan
srvctl start  scan_listener
[oracle@mhdb1 backup]$ srvctl config scan
SCAN  name: mhdb-scanip, Network: 1/10.XX.136.0/255.255.255.0/bond0 SCAN  VIP name: scan1, IP: /mhdb-scanip/10.25.136.16
  • 重启CRS集群验证,在两节点用root执行:
./crsctl stop  crs –f
./crsctl start  crs

13. 停机时间评估

序号
数据库
操作流程
开始时间
耗时(分钟)
实施方
1
目标端
创建用户,进行XTTS表空间传输,并进行多次增量恢复
提前完成
6小时
新炬
2
源端
停全部业务
00:00


3
源端
将表空间设为只读
00:00
10
新炬
4
目标端
最后一次增量恢复,并实施数据字典迁移
00:10
30
新炬
5
目标端
表空间迁移完成后进行相关对象处理
00:40
20
新炬
6
源端
停CRS集群
01:00
10
新炬
7
目标端
修改IP地址,并启动数据库
1:10
20
新炬
8
目标端
启动业务并测试
1:30

卓望


经验总结

1. 加速rman备份
RMAN> show all;
RMAN configuration parameters for  database with db_unique_name ZHDB are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT  DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR  DEVICE TYPE DISK TO %F; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1  BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR  DEVICE TYPE DISK TO 1; # default
‍CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR  DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM AES128; # default
CONFIGURE COMPRESSION ALGORITHM BASIC  AS  OF RELEASE DEFAULT  OPTIMIZE FOR  LOAD TRU
E ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO /oracle/app/oracle/product/11.2.0/db/dbs/snap
cf_zhdb1.f
; # default
修改并行度:
CONFIGURE  DEVICE TYPE DISK PARALLELISM 4;
2. 中途扩容表空间
已经初始化之后,源库需要扩容表空间,如有可能,尽量通过resize表空间,而不是添加新的数据文件,如添加了数据文件,可以考虑手工rman cope,传输到目标端手工转换格式。
脚本3.0已经支持add datafile。

3. 导入元数据慢

原因:缺少索引。

解决办法:创建索引。具体参看如下文档:

Conventional  And  Direct  Path  Exports/Imports  Are  Extremely  Slow  (文档 ID  729248.1)

4. 增量备份权限错误

Cant locate strict.pm in @INC (@INC contains: /u01/oracle/11.2.0/grid/perl/lib/5.10. 0/x86_64-linux-thread-multi /u01/oracle/11.2.0/grid/perl/lib/5.10.0 /u01/oracle/11.2. 0/grid/perl/lib/site_perl/5.10.0/x86_64-linux-thread-multi /u01/oracle/11.2.0/grid/pe rl/lib/site_perl/5.10.0 /u01/oracle/11.2.0/grid/lib 
/u01/oracle/11.2.0/grid/lib/asmcm d
/u01/oracle/11.2.0/grid/rdbms/lib/asmcmd
/u01/oracle/11.2.0/grid/perl/lib/5.10.0/x8 6_64-linux-
thread-multi /u01/oracle/11.2.0/grid/perl/lib/5.10.0
/u01/oracle/11.2.0/gr id/perl/lib/site_perl/5.10.0/x86_64-
linux-thread-multi /u01/oracle/11.2.0/grid/perl/l
ib/site_perl/5.10.0
/u01/oracle/11.2.0/grid/perl/lib/5.10.0/x86_64-linux-thread-
multi
/u01/oracle/11.2.0/grid/perl/lib/5.10.0/x86_64-linux-thread-
multi /u01/oracle/11.2.0/ grid/perl/lib/5.10.0
/u01/oracle/11.2.0/grid/perl/lib/site_perl/5.10.0/x86_64-
linux-t
hread-multi
/u01/oracle/11.2.0/grid/perl/lib/site_perl/5.10.0 /u01/oracle/11.2.0/grid
/perl/lib/site_perl .) at
/u01/oracle/11.2.0/grid/bin/asmcmdcore line 143.
BEGIN failed--compilation aborted at
/u01/oracle/11.2.0/grid/bin/asmcmdcore line 143. Can
t Run ASMCMD As Non-Product Owning User (文档 ID 1668244.1)
su - grid

chmod -R 751 $ORACLE_HOME/perl
chmod 770 -R $ORACLE_HOME/log/diag/asmcmd chmod 1777 $ORACLE_HOME/log/diag
chmod 660 $ORACLE_HOME/lib/libexpat.so.1
5. 增量备份监控脚本
dir=/data/backup
tfile=`ls ${dir}/*.trc`
while  true
do
echo ************************* completed files *****************************echo " `cat ${tfile}|grep input datafile|wc -l` file backups com
pleted"

echo
echo ************************* filesystem used *****************************
bdf
echo
echo ******************************************** rman backup process ************************************************
sqlplus -S / as  sysdba<SET  linesize 250  PAGES 0  FEEDBACK OFF  VERIFY  OFF  HEADING  OFF
col  OPNAME for  a45
SELECT  SID,
OPNAME,
SERIAL#,
CONTEXT,
SOFAR,
TOTALWORK,
ROUND(SOFAR / TOTALWORK * 100, 2) "%_COMPLETE"
FROM  V$SESSION_LONGOPS
WHERE  OPNAME LIKE  RMAN%
AND  OPNAME NOT  LIKE  %aggregate%
AND  TOTALWORK != 0
AND SOFAR <> TOTALWORK
order  by  "%_COMPLETE"  desc  ;
disconnect;
exit;
EOF
echo
echo
sleep 60
dones

参考文档:

  • Transportable Tablespace Downtime using Cross Platform Incremental Backup (文档 ID 1389592.1) 
  • Migrate database to Exadata with DBMS_FILE_TRANSFER (文档 ID 1902618.1)
  • 12C - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (文档 ID 2005729.1)V4 
  • Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1)


本文作者:张雷员(上海新炬王翦团队)

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129235.html

相关文章

  • 阿里云如何打破Oracle迁移上云的壁垒

    摘要:摘要第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破迁移上云的壁垒为题的演讲。于是,阿里云给出了上面的解决方案。 摘要: 2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲。Oracle是指数据库管理系统,面对Oracle迁移上云的壁垒,阿里云如何能够打破它呢?本文提出了Oracle 到云数据库P...

    chavesgu 评论0 收藏0
  • Oracle发布Oracle Soar全面云迁移产品

    摘要:客户可以通过一款移动应用监控其迁移状态。表示,随着产品在后续版本中不断调整,将转向自主交付。然而认为,提供了更加全面的解决方案,包括咨询和教育服务。现在已经支持向和迁移的以及客户。最终将把产品扩展到支持向转移的和客户,以及向转移的客户。Oracle Soar将一系列自动迁移工具与专业服务相结合,所有这些都由Oracle提供——这是一套完整的内部迁移解决方案。这种半自动化的解决方案,也让Ora...

    teren 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<