
1.1 测试环境说明
源库 | 目标库 | |
操作系统平台 | RHEL5.5 x86_64 | RHEL5.5 x86_64 |
IP地址 | 192.168.92.11 | 192.168.92.14 |
实例名 | VM11 | VM14 |
数据库版本 | 11.2.0.4.0 | 11.2.0.4.0 |
1.1.1 数据库监听
监听端口:1521
1.2 源库配置
1.2.1 启用archivelog(源库必须)
###root用户下创建归档文件目录
mkdir arch chown oracle:oinstall arch |
###登陆数据库配置归档
su - oracle sqlplus as sysdba startup mount; |
---配置归档目录 alter system set log_archive_dest_1='location=/arch' scope=both;
---启动归档配置 alter database archivelog;
---OPEN数据库 alter database open; ---检查归档配置 archive log list;
|
---切换归档,观察变化
select * from v$archived_log;
col name for a30 select recid,stamp,name,thread#,sequence#,next_change# from v$archived_log;
alter system switch logfile;
select recid,stamp,name,thread#,sequence#,next_change# from v$archived_log; |
1.2.2 源库配置静态监听
###源库配置静态监听
su - oracle cd $ORACLE_HOME/network/admin/ cat <<'EOF'>> listener.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = VM11) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME = VM11) ) ) EOF
cat listener.ora
lsnrctl start lsnrctl status
|
1.2.3 源库创建测试数据
---在源库上创建要迁移的表空间
create tablespace ts1 datafile '/u01/app/oracle/oradata/VM11/ts1_01.dbf' size 100m autoextend on; create tablespace ts2 datafile '/u01/app/oracle/oradata/VM11/ts2_01.dbf' size 100m autoextend on;
create tablespace idx1 datafile '/u01/app/oracle/oradata/VM11/idx1_01.dbf' size 100m autoextend on; create tablespace idx2 datafile '/u01/app/oracle/oradata/VM11/idx2_01.dbf' size 100m autoextend on; |
---在源库上创建要迁移的用户
create user u1 identified by u1 default tablespace ts1; create user u2 identified by u2 default tablespace ts2;
grant create session, resource, unlimited tablespace to u1; grant create session, resource, unlimited tablespace to u2;
conn u1/u1 create table t1 tablespace ts1 as select * from all_objects; create index idex01 on t1(owner,object_name) tablespace idx1; create index idex02 on t1(owner) tablespace users;
conn u2/u2 create table t2 tablespace ts2 as select * from all_users; create index idex01 on t2(user_id) tablespace idx2;
conn as sysdba set line 200 pages 1000 col INDEX_NAME for a20 col INDEX_TYPE for a20 col table_name for a20 col table_owner for a20 col tablespace_name for a20 col owner for a20 select owner,index_name,index_type,table_owner,table_name,table_type,TABLESPACE_NAME from dba_indexes where owner in ('U1','U2');
|
1.2.3.1高级配置,增加role和profile
---创建profile pro_xtts select profile from dba_profiles group by profile;
create profile pro_xtts limit idle_time 10 connect_time 100 password_life_time 100 FAILED_LOGIN_ATTEMPTS 3;
select profile from dba_profiles group by profile;
---创建角色 conn as sysdba create role r1; create role r2;
---给角色分配权限 conn as sysdba
grant select on dba_objects to r1; grant select on u2.t2 to r1;
grant select on dba_objects to r2; grant select on u1.t1 to r1;
---把角色赋予指定账户 conn as sysdba grant r1 to u1;
grant r2 to u2;
alter user u1 profile pro_xtts;
alter user u2 profile pro_xtts;
select username ,PROFILE from dba_users where username in ('U1','U2');
|
---辅助指令
cunn u1/u1 select 'grant select on U1.'|| tname ||' to U2;' from tab;
conn u2/u2 select 'grant select on U2.'|| tname ||' to U1;' from tab;
conn as sysdba
---删除角色 conn as sysdba drop role u1; drop role u2;
conn u1/u1 select count(*) from dba_objects;
conn u2/u2 select count(*) from dba_objects;
---删除用户 drop user test cascade; |
1.2.3.2JOB对象增加
---给普通用户授予作业管理权限 conn as sysdba create tablespace ts3 datafile '/u01/app/oracle/oradata/VM11/ts3_01.dbf' size 100m autoextend on;
create user u3 account unlock identified by u3 default tablespace ts3; grant connect,resource to u3; grant scheduler_admin to u3;
grant r2 to u3;
---T1用户创建测试表 create table u3.t1 as select * from dba_objects; conn u3/u3 create table t2 as select * from t1; create table t3 as select * from t1; select * from tab; select count(*) from t1;
---T1用户下创建更新T1表的存储过程 CREATE OR REPLACE PROCEDURE PRC_updateT1 IS BEGIN --更新T1表数据 insert into t1 select * from t3; COMMIT; END PRC_updateT1; /
---这是在sys用户下操作的 ---普通用户需要授权: grant scheduler_admin to t1; ---sqlplus中使用中文需要客户端和crt都使用中文配置 ---布置作业,每10秒执行一次更新T1表的存储过程 ---这里没有启动job,需要手动启用, begin sys.dbms_scheduler.create_job(job_name => '更新T1表', job_type => 'STORED_PROCEDURE', job_action => 'PRC_UPDATET1', start_date => sysdate, repeat_interval => 'Freq=Secondly;Interval=10', end_date => to_date(null), job_class => 'DEFAULT_JOB_CLASS', enabled => false, auto_drop => false, comments => '更新T1表'); end; / ---如果在sqlplus中操作,一定要将NLS_LANG改为与操作系统相符的,我这里的是: ---export NLS_LANG=AMERICAN_AMERICA.UTF8 |
---迁移用户的全部对象数统计
conn as sysdba
select count(*) from all_objects whereowner in ('BI','PM','SH','IX','OE','HR','U1','U2','U3');
---迁移用户的分类对象数统计
select object_type,count(1) as"NUM" FROM all_objects where owner in('BI','PM','SH','IX','OE','HR','U1','U2','U3') group by object_type;
1.2.4 源库启用RMAN块跟踪
---打开块跟踪,有利于减少增量备份带来的时间开销。
conn as sysdba ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/app/oracle/oradata/VM11/rman_change_track.f' REUSE; |
1.2.5 源库创建Direcotry
---创建数据文件所在目录,如果数据文件分布在多个目录中,可以创建多个directory
create or replace directory SOURCEDIR1 as '/u01/app/oracle/oradata/VM11'; |
---dropdirectory SOURCEDIR1;
---源库检查direcotry配置
set line 200 pages 100 col privilege for a20 col directory_name for a25 col directory_path for a70 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;
exit |
1.2.6 源库配置RMAN参数
###配置RMAN
rman target show all;
CONFIGURE BACKUP OPTIMIZATION ON; CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET; exit |
1.3 目标库配置
1.3.1 启动数据库
###open数据库 su - oracle export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 sqlplus as sysdba startup exit
|
1.3.2 目标库配置tnsnames
###目标库配置tnsnames su - oracle cd $ORACLE_HOME/network/admin/ cat <<'EOF'>> tnsnames.ora
VM11 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.92.11)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = VM11) ) ) EOF
tnsping VM11 11 sqlplus system/oracle@VM11 select name from v$database; exit
|
1.3.3 目标端重名表空间和数据文件改名
sqlplus as sysdba set line 200 pages 1000 col file_name for a70 col tablespace_name for a65 SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES;
alter tablespace users rename to users_old;
ALTER TABLESPACE USERS_OLD OFFLINE;
!mv /u01/app/oracle/oradata/VM14/users01.dbf /u01/app/oracle/oradata/VM14/users01_old.dbf
alter tablespace users_old rename DATAFILE '/u01/app/oracle/oradata/VM14/users01.dbf' TO '/u01/app/oracle/oradata/VM14/users01_old.dbf';
ALTER TABLESPACE USERS_OLD ONLINE;
alter tablespace EXAMPLE rename to EXAMPLE_OLD;
ALTER TABLESPACE EXAMPLE_OLD OFFLINE;
!mv u01/app/oracle/oradata/VM14/example01.dbf /u01/app/oracle/oradata/VM14/example01_old.dbf
alter tablespace EXAMPLE_OLD rename DATAFILE '/u01/app/oracle/oradata/VM14/example01.dbf' TO '/u01/app/oracle/oradata/VM14/example01_old.dbf';
ALTER TABLESPACE EXAMPLE_OLD ONLINE;
set line 200 pages 1000 col file_name for a70 col tablespace_name for a65 SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES;
|
1.3.4 迁移用户清理
drop user BI cascade; drop user PM cascade; drop user SH cascade; drop user IX cascade; drop user OE cascade; drop user HR cascade; drop user SCOTT cascade;
|
1.3.5 目标库创建Direcotry
---创建directory
sqlplus as sysdba create or replace directory DESTDIR1 as '/u01/app/oracle/oradata/VM14'; |
---检查directory配置
set line 200 pages 100 col privilege for a20 col directory_name for a25 col directory_path for a70 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;
|
1.3.6 目标库创建到源库的dblink
---在目标库创建指向源库的dblink
create public database link TTSLINK connect to system identified by oracle using 'VM11';
select 'Count=' || count(*) from dual@TTSLINK;
select instance_name from v$instance@TTSLINK;
exit |
1.3.7 目标库配置RMAN参数
###配置RMAN
rman target
CONFIGURE BACKUP OPTIMIZATION ON; CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET; exit
|
1.4 源库与目标库配置SSH互信
由于需要在源库和目标库上传输文件,建议配置SSH互信。
cd ssh-keygen -t rsa |
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.92.11 |
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.92.14 |
2 XTTS迁移工具配置
2.1 XTTS平台支持查询
需要注意的是platformid应设置为源数据库平台ID,通过如上图所示查询V $数据库中获得。
---请查询V$TRANSPORTABLE_PLATFORM 来查看受支持的平台,并确定每个平台的字节序。
set line 200 pages 100 COLUMN PLATFORM_NAME FORMAT A35 SELECT * FROM V$TRANSPORTABLE_PLATFORM order by platform_id; |
---确认当前数据库所在的系统平台
col SUBSTR(D.PLATFORM_NAME,1,30) for a40 SELECT tp.platform_id,substr(d.PLATFORM_NAME,1,30), ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME; |
2.2 采用dbms_file_transfer方式的配置文件
###原配置文件查看
cd home/oracle/xtts/
cat xtt.properties|grep -v '^#'| grep -v'^$'
注意:
1、此处需要注意的是表空间名称必须大写。
2、注意每个参数的结束后面不能有空格。
3、注意选中传输的表空间必须online + READ WRITE,并且表空间中的数据文件也必须是online。
4、需要注意的是platformid应设置为源数据库平台ID,通过如上图所示查询V $数据库中获得。
2.3 源库XTTS2.0版本快速配置
mkdir home/oracle/xtts cd home/oracle/xtts/ rm -rf * cp app/xtts_bak/rman-xttconvert_2.0.zip . unzip rman-xttconvert_2.0.zip ###mkdir -p xtts_rman_inc_bak rm -rf rman-xttconvert_2.0.zip ls -lrt |
mkdir -p nfs/xtts/full mkdir -p nfs/xtts/inc >xtt.properties cat <<'EOF'>> xtt.properties srcdir=SOURCEDIR1 dstdir=DESTDIR1 srclink=TTSLINK parallel=3 rollparallel=2 getfileparallel=4 tablespaces=EXAMPLE,USERS,TS1,TS2,TS3,IDX1,IDX2 platformid=13 dfcopydir=/nfs/xtts/inc backupformat=/nfs/xtts/inc stageondest=/nfs/xtts/inc backupondest=/u01/app/oracle/oradata/VM14 #storageondest=/u01/app/oracle/oradata/VM14 #destTMPDIR=/home/oracle/xtts ##cnvinst_home=/oracle/db11g ##cnvinst_sid=test #asm_home=/grid/grid_home #asm_sid=+ASM1 EOF cat xtt.properties |
2.3.1 xtt.properties参数说明
下表介绍了由xttdriver.pl使用的xtt.properties文件中定义的参数。
参数 | 描述 | 示例设置 |
tablespaces | 用逗号分隔的表空间从源数据库传输到目标数据库的列表。必须是单行,任何后续的行都不会被读取。 | 表空间= TS1,TS2 |
platformid | 源数据库平台ID,从V $ DATABASE.PLATFORM_ID获得。 | 平台= 2 |
SRCDIR | 源数据库中的目录对象,用于定义源数据文件当前所在的位置。可以用“,”分隔多个位置。srcdir到dstdir映射可以是N:1或N:N。即可以有多个源目录,文件将被写入单个目标目录,或者来自特定源目录的文件可以写入到特定的目标目录。 此参数仅在准备阶段方法为dbms_file_transfer时使用。 | SRCDIR = SOURCEDIR SRCDIR = SRC1,SRC2 |
dstdir | 目标数据库中的目录对象,用于定义目标数据文件的创建位置。如果使用多个源目录(srcdir),则可以定义多个目标,以便将特定的源目录写入特定的目标目录。 此参数仅在准备阶段方法为dbms_file_transfer时使用。 | DSTDIR = DSTDIR dstdir = DST1,DST2 |
srclink | 目标数据库中引用源数据库的数据库链接。数据文件将使用dbms_file_transfer通过此数据库链接进行传输。 此参数仅在准备阶段方法为dbms_file_transfer时使用。 | srclink = TTSLINK |
dfcopydir | 在“-p prepare”步骤中创建数据文件副本的源系统上的位置。 此参数仅在Prepare阶段方法为RMAN备份时使用。 | dfcopydir = stage_source |
backupformat | 在创建增量备份的源系统上的位置。 | backupformat = stage_source |
stageondest | 用户从源系统手动传输数据文件副本的目标系统上的位置。 | stageondest = stage_dest |
storageondest | 转换后的数据文件副本的目标系统上的位置将在“数据文件的-c转换”步骤中写入。 此参数仅在Prepare阶段方法为RMAN备份时使用。 | storageondest = + DATA |
backupondest | 在“-r前滚数据文件”步骤中将写入目标系统上已转换的增量备份的目标系统上的位置。 | backupondest = + RECO |
cnvinst_home | 如果使用单独的增量转换主目录,则只设置此参数。 在目标系统上运行的增量转换实例的ORACLE_HOME。 | cnvinst_home = U01 应用程序/ ORACLE 产品/ 11.2.0.4 xtt_home |
cnvinst_sid | 如果使用单独的增量转换主目录,则只设置此参数。 在目标系统上运行的增量转换实例的ORACLE_SID。 | cnvinst_sid = XTT |
asm_home | ORACLE_HOME,用于在目标系统上运行的ASM实例。 | asm_home = U01 应用程序/ 11.2.0.4 /格 |
asm_sid | ORACLE_SID,用于在目标系统上运行的ASM实例。 | asm_sid = + ASM1 |
parallel | 定义在RMAN CONVERT命令文件rmanconvert.cmd中设置的并行度。此文件在准备步骤中创建,由RMAN在转换数据文件步骤中用于转换目标系统上的数据文件副本。如果此参数未设置,则xttdriver.pl使用parallel = 8。 注:用于在RMAN备份准备阶段中创建的数据文件副本的RMAN并行性和在前滚阶段中创建的增量备份由源系统上的RMAN配置控制。它不受此参数控制。 | 平行= 3 |
rollparallel | 定义-r前滚操作的并行性级别。 | rollparallel = 2 |
getfileparallel | 定义-G操作的并行级别 默认值是1.最大支持值是8。 | getfileparallel = 4 |
2.4 目标库创建配置文件
xtt.properties文件在源和目标库一致,所以这里从源端copy一份过来。
mkdir home/oracle/xtts cd home/oracle/xtts scp -r 192.168.92.11:/home/oracle/xtts/* /home/oracle/xtts/ ls -lrt |
3 XTTS实施前的准备和检查
3.1 源库检查表空间的自包含性
sqlplus as sysdba execute dbms_tts.transport_set_check('EXAMPLE,USERS,TS1,TS2,TS3,IDX1,IDX2', TRUE); select * from transport_set_violations; |
4 XTTS准备阶段
在准备阶段,表空间相关的数据文件将传送到目标操作系统,并且转换endian格式。
在整个准备阶段,源端的表空间依然处于完全可以读写的情况。
准备阶段可以通过rman backup或者dbms_file_transfer包进行。
cd home/oracle/xtts export TMPDIR=/home/oracle/xtts export PERL5LIB=$ORACLE_HOME/perl/lib export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 $ORACLE_HOME/perl/bin/perl xttdriver.pl -S |
本步骤在源系统上执行以下操作:
验证表空间处于联机状态,处于“读写模式”,并且不包含脱机数据文件。
创建稍后在此过程中使用的以下文件:
xttnewdatafiles.txt
getfile.sql
正在传输的一组表空间必须全部联机,不包含脱机数据文件,并且必须是READ WRITE。
如果源数据库中的一个或多个数据文件或表空间处于脱机状态或只读,则“准备”步骤将显示错误信息。
如果一个表空间是只读的,并且在整个过程中保持不变,那么只需使用传统的跨平台可移动表空间进程来传输这些表空间即可,这些文件不需要增量应用。
4.1 检查配置目录和文件
cd home/oracle/xtts du -sh * | sort –n ls -lrt cat xttnewdatafiles.txt cat getfile.sql |
4.2 把生成的脚本和文件复制到目标端
cd home/oracle/xtts/ scp xttnewdatafiles.txt 192.168.92.14:/home/oracle/xtts/;scp getfile.sql 192.168.92.14:/home/oracle/xtts/ |
4.3 目标端执行
cd home/oracle/xtts/ ls -lrt |
cd home/oracle/xtts/ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -G |
完成此步骤后,正在传输的数据文件将驻留在目标数据库将使用的最终位置。请注意,endian转换(如果需要)在此步骤中自动执行。
继续执行前滚阶段以创建数据文件并将增量备份应用于数据文件。
4.3.1 目标端检查传输过来的文件
cd $ORACLE_BASE/oradata/VM14 ls -lrt du -sh * | sort -n -k1 |
4.4 源库和目标库定义的backupformat、backupondest都还没有使用
4.4.1 源库检查
cd home/oracle/xtts ls -lrt full/ ls -lrt inc/ |
4.4.2 目标库检查
cd home/oracle/xtts ls -lrt full/ ls -lrt inc/ |
5 XTTS前滚阶段
在前滚阶段,通过使用源数据库一次一次的增量备份,将备份转换后应用到目标库的相应数据文件上。
整个阶段,源库的相应表空间依然处于完全可以读写的情况。
在这个阶段,从原库上创建增量备份,传输到目标系统,转换为目标系统的字节格式,然后对目标库进行前滚。
这个阶段必须要运行多次,使目标库不断接近原始库。
5.1 源库上执行数据更新
----alter tablespace ts1 add datafile'/u01/app/oracle/oradata/VM11/ts1_02.dbf' size 100m autoextend on;
conn u1/u1 select count(*) from t1; insert into t1 select * from t1; commit; select count(*) from t1;
|
cd home/oracle/xtts du -sh * | sort -n ls -lrt cat getfile.sql cat xttnewdatafiles.txt cat xttnewdatafiles.txttemp cat xttplan.txt |
5.2 源库上执行增量备份
在此阶段,将从源数据库创建增量备份,传输到目标系统,转换为目标系统端格式,然后应用到转换后的目标数据文件副本以将其转发。
这个阶段可能会运行多次。每个连续的增量备份应比以前的增量备份花费更少的时间,并且会使目标数据文件副本与源数据库保持最新。所传输的数据在这个阶段是完全可以访问的。
cd home/oracle/xtts/ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -i |
创建增量的步骤:
该命令将对xtt.properties参数文件中指定的表空间,使用进行一个增量备份,同时会生成tsbkupmap.txt、 incrbackups.txt、 xttplan.txt三个文件。
备份的数据是从做xttdriver.pl -S时在xttplan.txt文件中记录的SCN开始的。
备份完成后需要将这3个文件连同增量备份集一起传输到目标端。
是执行RMAN命令生成xtt.properties文件中tablespaces参数定义的表空间的增量。
它创建了后续过程要使用的以下文件:
tsbkupmap.txt
incrbackups.txt
xttplan.txt
5.3 源库检查产生的增量备份文件
du -sh * | sort -n ls -lrt nfs/xtts/inc/ ls -lrt
cat incrbackups.txt cat tsbkupmap.txt cat xttplan.txt cat xttplan.txt.new |
5.4 源库上传输增量备份到目标库系统
###准确的copy
cd home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/;scp `cat incrbackups.txt` 192.168.92.14: nfs/xtts/inc/ |
###使用nfs共享的情况
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/ |
5.5 目标库应用增量备份
cd /u01/app/oracle/oradata/VM14/ ls -lrt du -sh * | sort -n -k1 |
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -r |
前滚数据文件步骤以SYS形式连接到增量转换实例,转换增量备份,然后连接到目标数据库并为正在传输的每个表空间应用增量备份。
但是如果一套库上有多个实例的话,在执行该步骤之前,需要对环境变量进行确认,如检查当前ORACLE_SID是否是需要执行的SID,否则可能会恢复到其他实例上。
(并非是真实的恢复,因为其他实例跟这个备份集没有任何关系,但恢复的过程会在其他实例上进行一遍,如关闭/启动数据库,包括增量恢复的日志都会在另一个数据库上显示。)
如果发生了这种事情,不用紧张,调整好环境变量,再执行一次perl xttdriver.pl –r即可。误操作的实例不受影响。
注意:
xttplan.txt和tsbkupmap.txt文件每次都必须复制过来,因为里面的内容不同。
第二次执行,会把第一次执行的文件改名,而不是删掉
注意:
1. 每次执行此步骤时,您都必须复制xttplan.txt和tsbkupmap.txt文件,因为每次迭代的内容都不相同。
2.不要更改,复制或更改脚本生成的xttplan.txt.new。
3.目标实例将被关闭并由此进程重新启动。
5.6 源库进行SCN推进
cd /home/oracle/xtts ls -lrt cat xttplan.txt cat xttplan.txt.new
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -s |
cd /home/oracle/xtts ls -lrt cat xttplan.txt cat xttplan.txt15xxx |
该命令将修改FROM_SCN,用于确定下一次增量备份的起点。
建议在【目标端】每次做完recover动作后,【源端】就执行一次该命令,以免遗忘。
确定新的FROM_SCN步骤将计算下一个FROM_SCN,将其记录在文件xttplan.txt中,然后在步骤源库前滚的增量备份总中创建下一个增量备份时使用该SCN。
每执行一次就会生成一个新的xttplan.txtXXXXX,xttplan.txt.new改名为xttplan.txt
6 第二次XTTS前滚(可选)
6.1 源库进行数据更新
sqlplus / as sysdba conn u2/u2 select count(*) from t2; |
insert into t2 select * from t2; commit; select count(*) from t2;
insert into t2 select * from t2; / / / / / commit; select count(*) from t2;
|
6.2 源库检查当前的文件及大小
cd /home/oracle/xtts/ du -sh * | sort -n -k1 ls -lrt |
cd /home/oracle/xtts/ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -i |
du -sh * | sort -n ls -lrt cat xttplan.txt cat xttplan.txt.new cat xttplan.txt151xxxx |
6.3 源库上把新产生的文件及配置copy给目标库
###准确的copy
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/;scp `cat incrbackups.txt` 192.168.92.14: /nfs/xtts/inc/ |
###NFS共享的情况
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/; |
6.4 目标库应用二次增量备份
注意:
1. 每次执行此步骤时,您都必须复制xttplan.txt和tsbkupmap.txt文件,因为每次迭代的内容都不相同。
2.不要更改,复制或更改脚本生成的xttplan.txt.new 。
3.目标实例将被关闭并由此进程重新启动。
cd /u01/app/oracle/oradata/VM14 du -sh * | sort -n -k1 |
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -r |
cd /u01/app/oracle/oradata/VM14 du -sh * | sort -n -k1 |
6.5 源库进行SCN推进
cd /home/oracle/xtts ls -lrt cat xttplan.txt cat xttplan.txt.new
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -s |
cd /home/oracle/xtts ls -lrt cat xttplan.txt cat xttplan.txt.new |
该命令将修改FROM_SCN,用于确定下一次增量备份的起点。
建议在【目标端】每次做完recover动作后,【源端】就执行一次该命令,以免遗忘。
确定新的FROM_SCN步骤将计算下一个FROM_SCN,将其记录在文件xttplan.txt中,然后在步骤源库前滚的增量备份总中创建下一个增量备份时使用该SCN。
每执行一次就会生成一个新的xttplan.txtXXXXX,xttplan.txt.new改名为xttplan.txt
7 第三次XTTS前滚(可选)
7.1 源库做第三次数据更新
conn u2/u2 select count(*) from t2;
insert into t2 select * from t2; / / commit; select count(*) from t2;
|
7.2 文件及配置检查
cd /home/oracle/xtts du -sh * | sort -n -k1 ls -lrt cat xttplan.txt cat xttplan.txt.new |
7.3 源库做增量操作
cd /home/oracle/xtts/ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -i |
7.4 源库增量操作后检查
du -sh * | sort -n -k1 ls -lrt
cat xttplan.txt
cat xttplan.txt.new
cat xttplan.txt15---查看最后一个 |
7.5 源库增量后产生的文件和配置copy给目标库
###准确的copy
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/;scp `cat incrbackups.txt` 192.168.92.14: /nfs/xtts/inc/ |
###NFS共享的情况
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/ |
7.6 目标库应用第三次增量备份
cd /u01/app/oracle/oradata/VM14 du -sh * | sort -n -k1 |
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -r |
cd /u01/app/oracle/oradata/VM14 du -sh * | sort -n -k1 |
7.7 源库进行SCN推进
cd /home/oracle/xtts ls -lrt cat xttplan.txt cat xttplan.txt.new
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -s |
cd /home/oracle/xtts ls -lrt cat xttplan.txt cat xttplan.txt.new |
该命令将修改FROM_SCN,用于确定下一次增量备份的起点。
建议在【目标端】每次做完recover动作后,【源端】就执行一次该命令,以免遗忘。
确定新的FROM_SCN步骤将计算下一个FROM_SCN,将其记录在文件xttplan.txt中,然后在步骤源库前滚的增量备份总中创建下一个增量备份时使用该SCN。
每执行一次就会生成一个新的xttplan.txtXXXXX,xttplan.txt.new改名为xttplan.txt
8 XTTS最终传送阶段(正式割接)
在这个阶段,原库相关表空间被置为READ ONLY模式。
相应表空间的最后一个增量备份将被应用到目标端。
目标库应用最后一次增量备份,应用完成后,目标和原库保持一致。
源端将元信息导出,并在目标端导入,目标端相应表空间设置为读写。
在该阶段,源端的相应表空间数据无法被操作,只可以被查询。
8.1 源库迁移的表空间置为readonly
conn / as sysdba alter tablespace USERS read only; alter tablespace EXAMPLE read only;
alter tablespace TS1 read only; alter tablespace TS2 read only; alter tablespace TS3 read only;
alter tablespace IDX1 read only; alter tablespace IDX2 read only;
set lien 200 pages 100 col TABLESPACE_NAME for a25 col status for a10 select TABLESPACE_NAME,status from dba_tablespaces;
conn u1/u1 select count(*) from t1;
conn u2/u2 select count(*) from t2; |
8.1.1 获取迁移对象相关信息
8.2 源库创建最后一次增量备份
8.2.1 源库检查配置和文件
cd /home/oracle/xtts du -sh * | sort -n ls -lrt |
8.2.2 源库执行最后一次增量备份
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -i |
8.2.3 源库检查配置和文件
cd /home/oracle/xtts du -sh * | sort -n -k1 ls -lrt cat xttplan.txt cat xttplan.txt.new cat xttplan.txt1515xxx |
8.3 源库传输增量文件和配置到目标库
###准确的copy
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/;scp `cat incrbackups.txt` 192.168.92.14: /nfs/xtts/inc/ |
###NFS的情况
cd /home/oracle/xtts scp /home/oracle/xtts/xttplan.txt 192.168.92.14:/home/oracle/xtts/;scp /home/oracle/xtts/tsbkupmap.txt 192.168.92.14:/home/oracle/xtts/ |
8.4 目标库应用增量备份
cd /u01/app/oracle/oradata/VM14 du -sh * | sort -n -k1 |
cd /home/oracle/xtts du -sh * | sort -n -k1 ls -lrt |
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -r |
cd /home/oracle/xtts du -sh * | sort -n -k1 ls -lrt |
cd /u01/app/oracle/oradata/VM14 du -sh * | sort -n -k1 |
在执行完恢复操作后,脚本会自动将目标库重启,不需要人工干预,如果出现到mount
状态出现异常,根据情况手工执行后续命令。
sqlplus / as sysdba select status from v$instance; |
8.5 目标库创建迁移用户
8.5.1 源库获取迁移用户创建语句
在source查询相应schema的权限及创建语句
---脚本获取用户创建DDL
conn / as sysdba SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON select dbms_metadata.get_ddl('USER', username) || '/' usercreate from dba_users where username in('BI','PM','SH','IX','OE','HR','U1','U2','U3','SCOTT'); |
8.5.2 目标库执行迁移用户创建
将上一节的输出结果进行编辑,只需要创建用户和密码配置部分:
CREATE USER "SCOTT" IDENTIFIED BY VALUES 'S:07921277EB685F9816BA4776231FA31B0C0A84DD4DF70E5DEC761A6F6B53;F894844C34402B67' / CREATE USER "U1" IDENTIFIED BY VALUES 'S:1B1C407E73C9C81F0460C7F06248438B3E91B512803A7398D1FBF008C43D;3E81B724A296E296' /
CREATE USER "U2" IDENTIFIED BY VALUES 'S:99F6058649361840F7FE042F3C5934B869D155CD2B6E21BD92D5A910D59B;668509DF9DD36B43' /
CREATE USER "U3" IDENTIFIED BY VALUES 'S:D19675A8A604BF907FF5F2731461C3D55D6C594C0A0F7E2122D79A909CE3;9CE6AF1E3F609FFC' /
CREATE USER "IX" IDENTIFIED BY VALUES 'S:209566545EBDAD366C2D9CBE9A4BE9B12E0809A70CEC268BD88B130C5E04;2BE6F80744E08FEB' /
CREATE USER "SH" IDENTIFIED BY VALUES 'S:56EDFB36DB34EAC763E0C5F29B1749C3FAB165898536ED8C8369D281E1DF;9793B3777CD3BD1A' /
CREATE USER "BI" IDENTIFIED BY VALUES 'S:9B7396B71A26F7D497DD40379345AE063B63343778AC3451864A57068C03;FA1D2B85B70213F3' /
CREATE USER "OE" IDENTIFIED BY VALUES 'S:7B4236B1B0317D04A695AB6B09319E0EF22E5F0341555980588065C2F08B;9C30855E7E0CB02D' /
CREATE USER "HR" IDENTIFIED BY VALUES 'S:754A6B21A6C30C674054B9E1E01F158169183384755D3CA0B9C1DF627884;6399F3B38EDF3288' /
CREATE USER "PM" IDENTIFIED BY VALUES 'S:45598664D7CEE174312FBE1716D8B64BD83AB6EE0D484E74045D18300414;72E382A52E89575A' / set line 200 pages 100 col username for a30 select * from all_users order by created; |
8.6 directory处理
SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON select dbms_metadata.get_ddl('DIRECTORY',DIRECTORY_NAME)||';' from dba_directories; |
忽略
8.7 源库空表未分配区问题(未使用)
注意导出导入时要设置NLS_LANG环境变量,并且在导出元数据之前对所有的空表分配区:
select 'alter table'||owner||'.'||table_name||' allocate extent;' from
dba_tables a, dba_segments b wherea.table_name=b.segment_name(+) and owner in ('U1','U2') and b.segment_name isnull;
忽略
8.8 role profile导入
8.8.1 profile操作
###源库操作
select profile from dba_profiles group by profile;
|
cd /u01/app/oracle/admin/VM11/dpdump expdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=exp_profile%U.dmp logfile=exp_profile.log full=y include=PROFILE:\"=\'PRO_XTTS\'\"
|
scpexp_profile*.dmp vm14:/u01/app/oracle/admin/VM14/dpdump
目标库操作
cd /u01/app/oracle/admin/VM14/dpdump impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=exp_profile%U.dmp logfile=imp_profile.log full=y
|
cd /u01/app/oracle/admin/VM14/dpdump impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=exp_profile%U.dmp logfile=imp_profile.log full=y include=PROFILE:\"=\'PRO_XTTS\'\"
|
select profile from dba_profiles group by profile;
|
8.8.2 role操作
文档ID 1916469.1
文档 ID 1082116.1
cd /u01/app/oracle/admin/VM11/dpdump
expdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=roles.dmpreuse_dumpfiles=y full=yinclude=role,SYSTEM_GRANT,ROLE_GRANT,DEFAULT_ROLE,TABLESPACE_QUOTAlogfile=roles.log
scp roles.dmp vm14:/u01/app/oracle/admin/VM14/dpdump |
impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=roles.dmp full=ylogfile=impdp-roles.log
---用户权限和角色检查
Conn / as sysdba set linesize 200 set pagesize 100 col grantee for a30 col privilege for a30 select grantee,count(*),'system priviliges' from dba_sys_privs where grantee in ('BI','PM','SH','IX','OE','HR','U1','U2','U3') group by grantee union all select grantee,count(*),'object priviliges' from dba_tab_privs where grantee in ('BI','PM','SH','IX','OE','HR','U1','U2','U3') group by grantee union all select grantee,count(*),'role priviliges' from dba_role_privs where grantee in ('BI','PM','SH','IX','OE','HR','U1','U2','U3') group by grantee;
SELECT * FROM DBA_SYS_PRIVS where grantee in ('BI','PM','SH','IX','OE','HR','U1','U2','U3');
Col owner for a20 Col table_name for a25 Col grantor for a20 select * from dba_tab_privs where grantee in ('BI','PM','SH','IX','OE','HR','U1','U2','U3');
COL GRANTEE FOR A20 COL GRANTED_ROLE FOR A28 select * from dba_role_privs where grantee in ('BI','PM','SH','IX','OE','HR','U1','U2','U3') ORDER BY GRANTEE; |
###可用 cd /u01/app/oracle/admin/VM11/dpdump cat <<'EOF'>> orcl_full.par #FULL=YES DIRECTORY=DATA_PUMP_DIR DUMPFILE=orcl_expdp-role.dmp SCHEMAS=BI,PM,SH,IX,OE,HR,U1,U2,U3 LOGFILE=orcl_expdp-role.log INCLUDE=ROLE,SYSTEM_GRANT,ROLE_GRANT,DEFAULT_ROLE,TABLESPACE_QUOTA EOF
expdp \'/ as sysdba\' parfile= orcl_full.par
|
###可用 cd /u01/app/oracle/admin/VM11/dpdump cat <<'EOF'>> orcl_full.par FULL=YES DIRECTORY=DATA_PUMP_DIR DUMPFILE=orcl_expdp-role.dmp LOGFILE=orcl_expdp-role.log INCLUDE=SCHEMA:"IN (SELECT USERNAME FROM dba_users where default_tablespace NOT in('SYSAUX','SYSTEM'))",ROLE,USER,SYSTEM_GRANT,ROLE_GRANT,DEFAULT_ROLE,TABLESPACE_QUOTA EOF
expdp \'/ as sysdba\' parfile= orcl_full.par
|
scp orcl_expdp-role.dmp vm14:/u01/app/oracle/admin/VM14/dpdump |
impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=orcl_expdp-role.dmp logfile=impdp-role.log |
impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=orcl_expdp-role.dmp INCLUDE=ROLE,SYSTEM_GRANT,ROLE_GRANT,DEFAULT_ROLE,TABLESPACE_QUOTA logfile=impdp-role.log |
impdp \'/ as sysdba\' directory=DATA_PUMP_DIR dumpfile=orcl_expdp-role.dmplogfile=impdp-role.log
8.9 目标库导入对象原数据
###在目标库上执行以下脚本生成DataPumpTTS命令
cd /home/oracle/xtts export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 export TMPDIR=/home/oracle/xtts $ORACLE_HOME/perl/bin/perl xttdriver.pl -e |
8.9.1 查看产生的元数据导入文件
cat /home/oracle/xtts/xttplugin.txt |
impdp directory=<DATA_PUMP_DIR> logfile=<tts_imp.log> \ network_link=<ttslink> transport_full_check=no \ transport_tablespaces=USERS,EXAMPLE,TS1,TS2,IDX1,TS3,IDX2 \ transport_datafiles='/u01/app/oracle/oradata/VM14/users01.dbf','/u01/app/oracle/oradata/VM14/example01.dbf','/u01/app/oracle/oradata/VM14/ts1_01.dbf','/u01/app/oracle/oradata/VM14/ts2_01.dbf','/u01/app/oracle/oradata/VM14/idx1_01.dbf','/u01/app/oracle/oradata/VM14/ts3_01.dbf','/u01/app/oracle/oradata/VM14/idx2_01.dbf' |
8.9.2 修改产生的元数据导入文件
impdp directory=DATA_PUMP_DIR logfile=tts_imp.log \ network_link=ttslink transport_full_check=no \ transport_tablespaces=USERS,EXAMPLE,TS1,TS2,IDX1,TS3,IDX2 \ transport_datafiles='/u01/app/oracle/oradata/VM14/users01.dbf','/u01/app/oracle/oradata/VM14/example01.dbf','/u01/app/oracle/oradata/VM14/ts1_01.dbf','/u01/app/oracle/oradata/VM14/ts2_01.dbf','/u01/app/oracle/oradata/VM14/idx1_01.dbf','/u01/app/oracle/oradata/VM14/ts3_01.dbf','/u01/app/oracle/oradata/VM14/idx2_01.dbf' |
8.9.3 目标库执行元数据导入
impdp "'/ as sysdba'" directory=DATA_PUMP_DIR logfile=tts_imp.log \ network_link=ttslink transport_full_check=no \ transport_tablespaces=USERS,EXAMPLE,TS1,TS2,IDX1,TS3,IDX2 \ transport_datafiles='/u01/app/oracle/oradata/VM14/users01.dbf','/u01/app/oracle/oradata/VM14/example01.dbf','/u01/app/oracle/oradata/VM14/ts1_01.dbf','/u01/app/oracle/oradata/VM14/ts2_01.dbf','/u01/app/oracle/oradata/VM14/idx1_01.dbf','/u01/app/oracle/oradata/VM14/ts3_01.dbf','/u01/app/oracle/oradata/VM14/idx2_01.dbf'
|
https://docs.oracle.com/cloud/latest/db112/SUTIL/dp_import.htm#SUTIL943
报错:由于没有提前导入role和profile导致的。
数据泵在导出表空间元数据如果出现bug,则使用传统exp/imp工具:
exp \'/ as sysdba\' file=soe_soe1.dmp tablespaces=U1,U2 transport_tablespace=y
imp \'/ as sysdba\' file=soe_soe1.dmptransport_tablespace=y lof=imp_tbs.logbuffer=1024M tablespaces=U1,U2datafiles='+DATADG/orcl/datafile/soe.dbf','+DATADG/orcl/datafile/soetest1.dbf','+DATADG/orcl/datafile/soe1.dbf','+DATADG/orcl/datafile/soetest2.dbf'
selectdbms_metadata.get_ddl('TABLE','PURCHASEORDER','OE') from dual;
8.10 临时表空间创建
8.11 修改用户默认表空间
---源库检查
conn / as sysdba set line 200 pages 1000 col username for a30 col default_tablespace for a20 col TEMPORARY_TABLESPACE for a20 col PROFILE for a20 select username,default_tablespace,temporary_tablespace,profile from dba_users where username in ('BI','PM','SH','IX','OE','HR','U1','U2','U3');
select 'alter user '||username||' default tablespace '||default_tablespace||';' from dba_users where username in ('BI','PM','SH','IX','OE','HR','U1','U2','U3'); |
---目标库获取
select 'alter user '||username||' default tablespace '||default_tablespace||' TEMPORARY TABLESPACE '||TEMPORARY_TABLESPACE|| ' PROFILE ' ||PROFILE||';' FROM dba_users@ttslink where username in ('BI','PM','SH','IX','OE','HR','U1','U2','U3','SCOTT'); |
select username,default_tablespace,temporary_tablespace,profile from dba_users where username in ('BI','PM','SH','IX','OE','HR','U1','U2','U3');
set line 200 pages 1000 col owner for a30 col object_name for a30 col object_type for a30 select owner,object_name,object_type from all_objects where owner='U1'; select owner,object_name,object_type from all_objects where owner='U2'; |
alter USER "U1" DEFAULT TABLESPACE "TS1" TEMPORARY TABLESPACE "TEMP" PROFILE "PRO_XTTS" /
alter USER "U2" DEFAULT TABLESPACE "TS2" TEMPORARY TABLESPACE "TEMP" PROFILE "PRO_XTTS" /
alter USER "U3" DEFAULT TABLESPACE "TS3" TEMPORARY TABLESPACE "TEMP" /
alter USER "IX" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
alter USER "SH" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
alter USER "BI" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
alter USER "OE" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
alter USER "HR" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
alter USER "PM" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
alter USER "SCOTT" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PASSWORD EXPIRE ACCOUNT LOCK /
conn / as sysdba SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON select dbms_metadata.get_ddl('USER', username) || '/' usercreate from dba_users where username in('BI','PM','SH','IX','OE','HR','U1','U2','U3'); |
8.12 目标库验证传输的数据
在此步骤中,传输的数据在目标数据库中是只读的。执行应用程序特定的验证来验证传输的数据。
另外,运行RMAN通过运行VALIDATE TABLESPACE来检查物理和逻辑块损坏情况,如下所示:
rman target /
validatetablespace USERS,TS1,TS2,TS3,IDX1,IDX2 check logical;
如果有坏块,需要查询V$DATABASE_BLOCK_CORRUPTION视图确认坏块属于什么对象。
此时,需要将应用切换到新库!
8.13 目标库修改表空间为read write
---检查所有表空间状态
set line 200 pages 100 col TABLESPACE_NAME for a25 col status for a10 select TABLESPACE_NAME,status from dba_tablespaces; |
---将迁移的表空间置为read write
alter tablespace USERS read write; alter tablespace TS1 read write; alter tablespace TS2 read write; alter tablespace TS3 read write; alter tablespace IDX1 read write; alter tablespace IDX2 read write; |
---检查所有表空间状态
set lien 200 pages 100 col TABLESPACE_NAME for a25 col status for a10 select TABLESPACE_NAME,status from dba_tablespaces; |
conn u1/u1 select count(*) from t1;
conn u2/u2 select count(*) from t2; |
9 清理阶段
如果为迁移创建了单独的增量转换主页和实例,则可能会关闭实例并删除软件。
这个过程创建的文件不再需要,现在可以删除。它们包括以下内容:
dfcopydir在源系统上的位置
源系统上的backupformat位置
在目的地系统上的最后的位置
目的地系统上的最后一个位置
$ TMPDIR在目标系统和源系统中的位置
10 验证部分
---检查对象的位置
col object_name for a25
col object_type for a25
select object_name,object_type FROMall_objects where owner='BI';
select OWNER,SEGMENT_NAME,PARTITION_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where SEGMENT_NAME='TIMES';
11 参考文献
官方文档
https://docs.oracle.com/cd/B19306_01/backup.102/b14191/dbxptrn.htm#BRADV05432
https://docs.oracle.com/cd/E18283_01/server.112/e17120/tspaces013.htm
异平台表空间传输迁移 MOS 1389592.1
11G - 使用跨平台增量备份减少可移动表空间停机时间(Doc ID 1389592.1)
跨平台可传输表空间的已知问题XTTS(文档ID 2311677.1)
注:1454872.1 - 可移动表空间(TTS)限制和限制:适用的详细信息,引用和版本
注:1454872.1 -传输表空间(TTS)限制和局限:详细信息,参考和版本在适用
注:1166564.1 -法师注意的传输表空间(TTS) -常见问题和问题
12 以下各章节均为未尽事宜,需确保完善,忽略掉的请添加
13 XTTS实施前准备和检查(待补充)
13.1 软件包上传
13.2 字节序检查
---请查询V$TRANSPORTABLE_PLATFORM 来查看受支持的平台,并确定每个平台的字节序。
set line 200 pages 100 COLUMN PLATFORM_NAME FORMAT A35 SELECT * FROM V$TRANSPORTABLE_PLATFORM order by platform_id; |
---确认当前数据库所在的系统平台名
col SUBSTR(D.PLATFORM_NAME,1,30) for a30 SELECT tp.platform_id,substr(d.PLATFORM_NAME,1,30), ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME; |
13.3 数据库用户检查
---用户数检查
setline 200 pages 1000
colusername for a35
selectusername from dba_users;
selectusername,CREATED from dba_users order by created;
select 'drop user'||username||' cascade;' from dba_users order by created;
13.4 数据库字符集检查
---数据库字符集检查
SELECT * FROMNLS_DATABASE_PARAMETERS;
col value for a30
col PARAMETER for a40
SELECT * FROMNLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
13.5 表空间及数据文件状态检查
---检查表空间状态
col tablespace_name for a30
select tablespace_name,statusfrom dba_tablespaces;
select tablespace_name,statusfrom dba_tablespaces where status != 'ONLINE';
---检查数据文件状态
set lien200 pages 1000
col name for a60
select T.FILE#,T.STATUS,T.NAME from v$datafile t;
---检查
col file_name for a60
selectfile_id,file_name,status from dba_data_files;
select file_id,file_name,status fromdba_data_files where online_status not in('ONLINE','SYSTEM');
13.6 表空间自包含检查
execute dbms_tts.transport_set_check('TS1,TS2', TRUE); select * from transport_set_violations; |
13.7 失效对象检查
---检查迁移schema无效对象数量
select count(*) fromall_objects where owner in ('SCOTT','HR') and status <>'VALID';
13.8 检查源数据库和目标库具有重复名称的表空间
select upper(substr(file_name, instr(file_name, '/', -1) + 1, length(file_name) - instr(file_name, '/', -1))), count(*) from dba_data_files group by upper(substr(file_name, instr(file_name, '/', -1) + 1, length(file_name) - instr(file_name, '/', -1))) having count(*) > 1; |
13.9 迁移对象统计
---检查数据库相关schema的对象总数
select count(*) from all_objects whereowner in ('SCOTT','HR');
----检查数据库相关schema的各类对象数量
select object_type,count(1) as"NUM" FROM all_objects where owner in ('SCOTT','HR') group byobject_type;
---用户对象表空间分布
set line 200 pages5000
colowner for a25
colTABLESPACE_NAME for a30
selectowner,tablespace_name,sum(bytes)/1024/1024/1024 "size_gb",count(*)"seg_count"
fromdba_segments
groupby owner,tablespace_name order by 2,4;
---对象segment检查
set line 200 pages 500
col segment_name for a50
select owner,segment_name,bytes/1024/1024from dba_segments where owner in ('SCOTT','HR') order by 3;
---统计指定用户表的行数
select t.TABLE_NAME,t.NUM_ROWS from all_tables t where owner in('SCOTT','HR') order by 2,1;
---详细无效对象统计
SET LINE 200 PAGES 1000
COL OWNER FOR A30
COL OBJECT_NAME FOR A35
COL OBJECT_TYPE FOR A30
SELECT OWNER,OBJECT_NAME,OBJECT_TYPE FROMDBA_OBJECTS where owner in ('SCOTT','HR')
andstatus <> 'VALID';
-- job 查询
COL JOB_NAME FOR A40
select owner, job_name, statefrom dba_scheduler_jobs;
select job_name, state fromuser_scheduler_jobs;
---检查JOB
SET LINE 300 PAGES 1000
col OBJECT_NAME for a20
col SUBOBJECT_NAME for a10
col TIMESTAMP for a20
select * from user_objectswhere object_type='JOB';
---检查DBLINK
SELECT OWNER,OBJECT_NAME,OBJECT_TYPEFROM DBA_OBJECTS WHERE OBJECT_TYPE='DATABASELINK';
col host for a80
col db_link for a20
SELECT * FROM DBA_DB_LINKS;
col name for a20
colhost for a80
select* from sys.link$;
---directory检查
SET LINE 300 PAGES1000
COLDIRECTORY_NAME FOR A30
COLDIRECTORY_PATH for a60
COLDATA_PUMP_DIR FOR A20
select* from dba_directories;
set line 200 pages 100
col privilege for a20
col directory_name for a25
col directory_path for a90
SELECT privilege,directory_name, DIRECTORY_PATH FROM user_tab_privs t, all_directories d WHEREt.table_name(+) = d.directory_name ORDER BY 2, 1;
13.10 检查原环境是否存在空段
13.11 基于XMLSchema的XMLType对象检查
从 Oracle Database 11gR1 开始,对于含有 XMLType 的表空间,必须使用数据泵来导出和导入表空间元数据。
---如下的查询返回了包含 XMLType 的表空间的列表:
select distinctp.tablespace_name
from dba_tablespaces p,dba_xml_tables x, dba_users u, all_all_tables t
wheret.table_name=x.table_name and
t.tablespace_name=p.tablespace_name and
x.owner=u.username;
select distinctp.tablespace_name from dba_tablespaces p,
dba_xml_tables x, dba_users u,all_all_tables t where
t.table_name=x.table_name andt.tablespace_name=p.tablespace_name
and x.owner=u.username;
select distinct p.tablespace_name
from dba_tablespaces p,
dba_xml_tab_cols x,
dba_users u,
all_all_tables t
where t.table_name=x.table_name
and t.tablespace_name=p.tablespace_name
and x.owner=u.username;
传输带有 XMLType 的表空间有如下限制:
目标数据库必须安装 XML DB。
XMLType 表引用的 schema 不能是 XML DB 标准 schema。
XMLType 表引用的 schema 不能有循环依赖。
XMLType 表上的任何行级别安全性都会在导入时丢失。
如果一个传输的 XMLType 表的 schema 不在目标数据库里,它会被导入并且注册。如果这个 schema 在目标数据库里已经存在了,就会返回一个错误,除非使用 ignore=y 选项。
高级队列可传输表空间不支持带有多个容器的 8.0 兼容版高级队列。
你无法传输 SYSTEM 表空间或者用户 SYS 拥有的对象。
不透明类型(例如 RAW,BFILE 和 AnyTypes)可以被传输,但是他们不会在跨平台传输操作中被转换。他们的实际框架只有应用知道,所以应用必须在这些类型被移动到新的平台后处理字节序的问题。
浮点数 BINARY_FLOAT 和 BINARY_DOUBLE 类型是可以传输的,但必须使用 Data Pump,不能使用原始的导出工具 EXP。
13.20 spatial 索引
注意在 10gR1 和 10gR2 中,对于 spatial 索引,不支持跨不同字节序平台的 TTS 操作。这个限制在 11g 中取消了。
在导出之前和传输之后,必须运行专门的 spatial 包,请参阅 Oracle Spatial 文档.
14. 无效对象处理
15. 手工收集统计信息
exec DBMS_STATS.GATHER_SCHEMA_STATS('U1')
exec DBMS_STATS.GATHER_SCHEMA_STATS('U2')
exec DBMS_STATS.GATHER_SCHEMA_STATS('U3')
executedbms_stats.GATHER_SCHEMA_STATS('nc57',DBMS_STATS.AUTO_SAMPLE_SIZE)
长按下图识别二维码或微信扫描下图二维码来关注甲骨人的微信公众号:甲骨人,学习最实用的数据库技术,获取数据库顶级认证,成为oracle技术专家





