XTTS数据迁移

文章目录

  • 一、全量迁移
    • 1、源端和目标端都需要配置XTTS脚本(源库和目标库都需要进行下列配置)
    • 2、源端调用 xttdriver.pl -p做迁移准备
    • 3、将源端的数据文件副本和rmanconvert.cmd传到目标端
    • 4、在目标端对数据文件拷贝进行字节序的转换
  • 二、XTTS 第1~n次增量前滚
    • 1、产生增量数据
    • 2、源端做增量备份
    • 3、将源端的增量数据传到目标端
    • 4、目标端进行增量转换和数据写入同步
    • 5、源端确定下一个增量备份的FROM_SCN
  • 三、XTTS 最后一次增量前滚
    • 1、将表空间置为RO状态
    • 2、源端做增量备份
    • 3、将源端的增量数据传到目标端
    • 4、目标端进行增量转换和数据写入同步
  • 四、迁移元数据
    • 1、在目标库创建业务用户
    • 2、导入xtts的元数据
    • 3、导入存储过程、触发器、函数、包、视图、序列
    • 4、导入公共同义词和dblink等其它对象
  • 五、迁移完成后的收尾工作
    • 1、查看源端、目标端的数据一致性
    • 2、更改用户默认表空间
    • 3、目标库的表空间修改为读写模式
    • 4、校验数据文件完整性

一、全量迁移

在此步骤中,表空间的数据文件将从源端数据库传输到目标端数据库,本步骤只需要执行一次,数据文件传输过程中不影响源端数据库正常访问。

此处有2种方法:dbms_file_transfer和rman方法。对于数据文件很多的情况下来说,dbms_file_transfer是推荐的方法。

此处使用rman方式。
本次迁移表空间为DS_DATA

资源包:
百度网盘链接:https://pan.baidu.com/s/1paVn-r5d-SzLJ4pX9BL03A?pwd=o0xw
提取码:o0xw
或者自行网上寻找也可以

1、源端和目标端都需要配置XTTS脚本(源库和目标库都需要进行下列配置)

rm -rf /u01/app/xtts/
rm -rf /home/oracle/scriptsmkdir -p /u01/app/xtts/inc_bk
chown oracle:oinstall /u01/app/xtts
chown oracle:oinstall /u01/app/xtts/inc_bk
mkdir -p /u01/app/xtts/df_bk
chown oracle:oinstall /u01/app/xtts/df_bkmkdir -p /home/oracle/scripts
cd /home/oracle/scripts
# 直接将rman_xttconvert_v3.zip上传到/home/oracle/scripts也可以
cp rman_xttconvert_v3.zip /home/oracle/scripts
# 解压XTTS包
unzip rman_xttconvert_v3.zip-- 注意修改相应参数(如果源库和目标库版本之类的信息不一样,需要修改参数内容)
cat > /home/oracle/scripts/xtt.properties  <<"EOF"
tablespaces=DS_DATA
platformid=13
#srcdir=SOURCEDIR
#dstdir=DESTDIR
#srclink=ttslink
dfcopydir=/u01/app/xtts/df_bk
backupformat=/u01/app/xtts/inc_bk
stageondest=/u01/app/xtts/df_bk
storageondest=/u01/app/oracle/oradata/P19C
backupondest=/u01/app/xtts/inc_bk
#cnvinst_home=/oracle/app/oracle/product/11.2.0/dbhome_1
#cnvinst_sid=targetdb
EOF

在这里插入图片描述
在这里插入图片描述

2、源端调用 xttdriver.pl -p做迁移准备

首先,确保源库处于OPEN阶段,所有表空间都处于online状态:

select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace 
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');select tablespace_name,status from dba_tablespaces;

在这里插入图片描述
在源端执行 xttdriver.pl -p做迁移准备:

cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -p

在这里插入图片描述
在这里插入图片描述

  • 查看备份的文件
ll /u01/app/xtts/df_bk/*

在这里插入图片描述

该操作执行过程包括以下内容:

1、此过程会将相关的表空间文件执行一次镜像拷贝过程,可以认为是全备,可以在rman中执行“list copy;”查看。此处会把数据文件拷贝一份到/u01/app/xtts/df_bk目录。需要注意目录/u01/app/xtts/df_bk的空间。

rman target /list copy;

在这里插入图片描述
2、会在/home/oracle/scripts 目录下产生几个文件,xttplan.txt、rmanconvert.cmd和xttnewdatafiles.txt:

ll -lrt

在这里插入图片描述
其中 xttplan.txt 文件中的内容如下:
我这里是只打算迁移DS_DATA表空间,如果上边配置的是多个的话这里会显示多个
在这里插入图片描述
该文件中的数值代表数据库的 SCN。如果后面再次运行脚本进行增量操作时,该值会发现改变。

再来看看脚本rmanconvert.cmd的内容:

more rmanconvert.cmd

在这里插入图片描述
上述脚本是 perl 脚本产生的 rman convert 脚本,需要将该脚本传递到目标端主机。注意,上述脚本文件格式需要注意,同时并行度是默认的,可以进行调整。

3、将源端的数据文件副本和rmanconvert.cmd传到目标端

将数据文件副本和rmanconvert.cmd文件拷贝到目标端。注意目标端的剩余空间:

scp /u01/app/xtts/df_bk/* 192.168.229.151:/u01/app/xtts/df_bk/scp /home/oracle/scripts/rmanconvert.cmd 192.168.229.151:/home/oracle/scripts/

在这里插入图片描述
在目标端查看到传输成功
在这里插入图片描述

4、在目标端对数据文件拷贝进行字节序的转换

注意目标端的空间:

cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -ccat /home/oracle/scripts/xttnewdatafiles.txtll -lrt /u01/app/oracle/oradata/P19C

在这里插入图片描述
转换后的数据文件拷贝会出现在 xtt.properties 文件中定义的参数 storageondest 下,即最终的数据文件目录。
在这里插入图片描述

二、XTTS 第1~n次增量前滚

在此阶段,在源端做增量数据,从源数据库创建增量备份(内部其实是仍然使用rman增量备份),将其传输到目标端,在目标端转换为目标系统Endian格式,然后应用于转换后的目标数据文件副本,将其前滚。此阶段可以多次重复运行。每次连续的增量备份都应该比以前的增量备份花费更少的时间,并且将使目标数据文件副本与源数据库更加一致。这样对于目标库上的数据文件拷贝,通过一次次应用增量数据就可以逐渐追上源库的生产数据。

这个阶段中的步骤可以运行多次,以使目标中的datafiles更接近源文件的时间/ SCN。在此阶段,源数据库完全可访问。

1、产生增量数据

# 产生增量数据
create table testxtts6 tablespace ds_data as select * from Shopping_Carts;

在这里插入图片描述

2、源端做增量备份

开始做增量备份:

cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i

在这里插入图片描述
上面的操作还会在 TMPDIR 目录下产生xttplan.txt.new、tsbkupmap.txt和incrbackups.txt文件:

more xttplan.txt.newmore tsbkupmap.txtll /u01/app/xtts/inc_bk/ -hrman target /list backupset;

在这里插入图片描述

3、将源端的增量数据传到目标端

这里传递增量数据的时候,还需要将源端/home/oracle/scripts/目录下的 xttplan.txt、 tsbkupmap.txt和incrbackups.txt文件都传输到目标端。每当你进行一次增量的备份操作,这 3个文件的内容都会发现变化 。

每一次增量操作之后,都需要将这 3个文件传到目标端数据库的 /home/oracle/scripts/目录中。

# 注意:增量内容应该拷贝到目标端的全量备份路径下
scp /u01/app/xtts/inc_bk/* 192.168.229.151:/u01/app/xtts/df_bk/scp /home/oracle/scripts/xttplan.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/tsbkupmap.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/incrbackups.txt 192.168.229.151:/home/oracle/scripts/

4、目标端进行增量转换和数据写入同步

export XTTDEBUG=1
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r

在这里插入图片描述
如果一套库上有多个实例的话,在执行该步骤之前,需要对环境变量进行确认,如检查当前ORACLE_SID是否是需要执行的SID,否则可能会恢复到其他实例上。(并非是真实的恢复,因为其他实例跟这个备份集没有任何关系,但恢复的过程会在其他实例上进行一遍,如关闭/启动数据库,包括增量恢复的日志都会在另一个数据库上显示。)如果发生了这种事情,不用紧张,调整好环境变量,再执行一次perl xttdriver.pl –r即可。误操作的实例不受影响。

5、源端确定下一个增量备份的FROM_SCN

cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -s

该步骤会计算下一个FROM_SCN,将其记录在xttplan.txt文件中,然后在创建下一个增量备份时使用该SCN。

该步骤会将-i时生成的xttplan.txt.new改名为xttplan.txt,并将原来的xttplan.txt备份。

建议在目标端每次做完recover动作后,源端就执行一次该命令,以免遗忘。
在这里插入图片描述

三、XTTS 最后一次增量前滚

1、将表空间置为RO状态

假设我们进行了多次增量操作之后,在停机时间的时候,再将源端数据库中需要传输的表空间设置为只读模式 :

# 产生增量数据
create table testxtts66 tablespace ds_data as select * from Shopping_Carts;select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
from v$tablespace 
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');select tablespace_name,status from dba_tablespaces;

在这里插入图片描述

2、源端做增量备份

首先对上一次的增量备份目录做迁移:

mv /u01/app/xtts/inc_bk /u01/app/xtts/inc_bk1
mkdir -p /u01/app/xtts/inc_bk

在这里插入图片描述
开始做增量备份:

cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -i

在这里插入图片描述

3、将源端的增量数据传到目标端

这里传递增量数据的时候,还需要将源端/home/oracle/scripts/目录下的 xttplan.txt、 tsbkupmap.txt和incrbackups.txt文件都传输到目标端。每当你进行一次增量的备份操作,这 3个文件的内容都会发现变化 。

每一次增量操作之后,都需要将这 3个文件传到目标端数据库的 /home/oracle/scripts/目录中。

# 注意:增量内容应该拷贝到目标端的全量备份路径下
scp /u01/app/xtts/inc_bk/* 192.168.229.151:/u01/app/xtts/df_bk/scp /home/oracle/scripts/xttplan.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/tsbkupmap.txt 192.168.229.151:/home/oracle/scripts/
scp /home/oracle/scripts/incrbackups.txt 192.168.229.151:/home/oracle/scripts/

在这里插入图片描述

4、目标端进行增量转换和数据写入同步

cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -r

在这里插入图片描述

四、迁移元数据

注意在导出时,TRANSPORT_TABLESPACES参数需要的表空间要写全,别遗漏。
在目标端进行IMPDP时,transport_datafiles需要将所有的数据文件添加进去。
如果数据文件很多,人为添加容易出错,可以使用perl xttdriver.pl –e获取全部数据文件列表。

1、在目标库创建业务用户

相关脚本在前边的准备阶段已经准备好了:

create user xxt identified by sys;
create user lhr identified by sys;
grant dba to xxt,lhr;

可以使用导出和导入分开来执行,也可以直接通过network_link来做远程导入,而不需要做导出操作:

2、导入xtts的元数据

生成导入脚本:

# 在目标端可以执行如下命令生成impdp,命令在xttplugin.txt文件
cd /home/oracle/scripts
export TMPDIR=/home/oracle/scripts
$ORACLE_HOME/perl/bin/perl xttdriver.pl -emore /home/oracle/scripts/xttplugin.txt
# 显示内容如下:
impdp directory=<DATA_PUMP_DIR> logfile=<tts_imp.log> \
network_link=<ttslink> transport_full_check=no \
transport_tablespaces=DS_DATA \
transport_datafiles='/u01/app/oracle/oradata/P19C/DS_DATA_5.dbf'

在这里插入图片描述
在目标端开始导入:

# 目标端创建dblink
create public database link ttslink connect to system identified by sys using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.229.151 )(PORT = 1521))  ) )';# 利用dblink直接迁移元数据,这里只会迁移表、索引、约束等,因为其它对象存储在系统表空间中
impdp system/lhr directory=DATA_PUMP_DIR logfile=tts_imp_lhr.log \
network_link=ttslink transport_full_check=no \
EXCLUDE=STATISTICS  \
transport_tablespaces=DS_DATA \
transport_datafiles='/u01/app/oracle/oradata/P19C/DS_DATA_5.dbf'

3、导入存储过程、触发器、函数、包、视图、序列

-- 导入存储过程、触发器、函数、包、视图、序列
impdp system/lhr directory=DATA_PUMP_DIR \
network_link=ttslink schemas=LHR,XXT content=metadata_only exclude=index,table,constraint parallel=8

4、导入公共同义词和dblink等其它对象

-- 导入公共同义词
set long 9999
select dbms_metadata.get_ddl('SYNONYM',SYNONYM_NAME,OWNER) 
FROM dba_synonyms 
where owner='PUBLIC' and table_owner in  ('LHR','XXT');-- 导入dblink
set long 9999
select dbms_metadata.get_ddl('DB_LINK',DB_LINK,OWNER) 
FROM DBA_DB_LINKS;

五、迁移完成后的收尾工作

1、查看源端、目标端的数据一致性

select count(*) from lhr.testxtts6;
select count(*) from lhr.testxtts66;select owner, object_type, count(*)from dba_objects
where object_name not like 'BIN%'and owner in ('LHR','XXT')
group by owner, object_type
order by 1,2 desc;select owner, object_type, count(*)from dba_objects
where status <> 'VALID'and owner in ('LHR','XXT')
group by owner, object_type
order by 1, 2 desc;

在这里插入图片描述
在这里插入图片描述
迁移后的对象个数和之前一致。

2、更改用户默认表空间

alter user xxt default tablespace USERS;

3、目标库的表空间修改为读写模式

select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace 
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');select tablespace_name,status from dba_tablespaces;

在这里插入图片描述

4、校验数据文件完整性

运行RMAN,通过运行VALIDATE TABLESPACE检查物理和逻辑块损坏情况,如下所示:

validate tablespace DS_DATA check logical;

完成迁移
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/308960.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端 Javascript笔记3

1、垃圾回收机制 内存中的生命周期 1、内存分配 2、内存使用&#xff08;读写&#xff09; 3、内存回收&#xff0c;使用完毕之后&#xff0c;垃圾回收器完成 内存泄漏&#xff1a;该回收的&#xff0c;由于某些未知因素&#xff0c;未释放&#xff0c;叫做内存泄漏 栈&#xf…

【DNS】

文章目录 DNS域名解析系统&#xff08;Domain Name System&#xff09;DNS系统需要解决的问题DNS域名解析系统&#xff08;Domain Name System&#xff09;问题1&#xff1a;DNS名字空间(The DNS Name Space&#xff09;DNS名字空间(The DNS Name Space)DNS名字空间(The DNS Na…

云手机提供私域流量变现方案

当今数字营销领域&#xff0c;私域流量是一座巨大的金矿&#xff0c;然而并非人人能够轻易挖掘。一家营销公司面临着利用社交、社区、自媒体等应用积累私域流量&#xff0c;并通过销售产品、推送广告等方式实现流量变现的挑战与困境。本文将详细介绍这家公司是如何通过云手机&a…

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

Spring高手之路17——动态代理的艺术与实践

文章目录 1. 背景2. JDK动态代理2.1 定义和演示2.2 不同方法分别代理2.3 熔断限流和日志监控 3. CGLIB动态代理3.1 定义和演示3.2 不同方法分别代理&#xff08;对比JDK动态代理写法&#xff09;3.3 熔断限流和日志监控&#xff08;对比JDK动态代理写法&#xff09; 4. 动态代理…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…

196算法之谜在 JSP 中使用内置对象 request 获取 form 表单的文本框 text 提交的数据。

(1&#xff09;编写 inputNumber . jsp &#xff0c;该页面提供一个 form 表单&#xff0c;该 form 表单提供一个文本框 text &#xff0c;用于用户输入一个正整数&#xff0c;用户在 form 表单中输入的数字&#xff0c;单击 submit 提交键将正整数提交给 huiwenNumber . jsp 页…

LeetCode 57—— 插入区间

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 第一步&#xff0c;我们先寻找新区间和原始区间列表的重叠部分。 假设新区间为 [ x 1 , x 2 ] [x_1, x_2] [x1​,x2​]&#xff0c;原始区间列表中的其中一个区间为 [ y 1 , y 2 ] [y_1, y_2] [y1​,y2​]&…

产生死锁的四个必要条件

产生死锁的四个必要条件 互斥使用: 一个资源每次只能被一个线程使用。这意味着如果一个线程已经获取了某个资源&#xff08;比如锁&#xff09;&#xff0c;那么其他线程就必须等待&#xff0c;直到该线程释放资源。 不可抢占: 已经获得资源的线程在释放资源之前&#xff0c;不…

Google Imagen 2对比OpenAI的Dall-E 3 - 同一提示,不同结果

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

咸鱼之王_手游_开服搭建架设_内购修复无bug运营版

视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…

【C++】深度解析---赋值运算符重载(小白一看就懂!!)

目录 一、前言 二、 运算符重载 &#x1f34e;运算符重载 ① 概念引入 ② 语法明细 ③ 练习巩固 ④ 代码展示 &#x1f347;赋值运算符重载 ① 语法说明及注意事项 ② 默认的赋值运算符重载 ③ 值运算符不能重载成全局函数&#xff01; 三、总结 四、共勉 一、前言…

centos 7.9 nginx本地化安装,把镜像改成阿里云

1.把centos7.9系统切换到阿里云的镜像源 1.1.先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2.下载新的CentOS-Base.repo配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo特别…

本地web项目启起来后,无法在浏览器(chrome)看到源码,从而无法打断点;Framework Ignore list

问题描述 本地web项目启起来后&#xff0c;无法在浏览器(chrome)看到源码&#xff0c;从而无法打断点 其他浏览器没看&#xff0c;开发环境一致专注于chrome&#xff08;其余浏览器有测试同事提缺陷了&#xff0c;才会去看&#xff09;&#xff0c;其余浏览器有没有这个问题&…

linux 内存寻址

&#xff08;持续更新&#xff09; 相关概念 查看的书籍为 深入linux内核 内存地址 当使用80x86&#xff08;32位&#xff09;微处理器时&#xff0c;一般分为三种不同的地址&#xff1a; 逻辑地址 包含在机器语言指令中用来指定一个操作数或一条指令的地址。每一个逻辑地址…

C#简单工厂模式的实现

using System.Diagnostics.Metrics; using System.Runtime.InteropServices; using static 手写工厂模式.Program;namespace 手写工厂模式 {internal class Program{public interface eats {void eat();}//定义了一个接口public class rice : eats{public void eat() {Console.…

neo4j-01

Neo4j是&#xff1a; 开源的&#xff08;社区版开源免费&#xff09;无模式&#xff08;不用预设数据的格式&#xff0c;数据更加灵活&#xff09;noSQL&#xff08;非关系型数据库&#xff0c;数据更易拓展&#xff09;图数据库&#xff08;使用图这种数据结构作为数据存储方…

Flutter第七弹 网格列表GridView

1) Flutter提供了网格列表&#xff0c;怎么设置列数&#xff1f; 2&#xff09;怎么初始化每个列表项Item&#xff1f; 一、GridView简介 Flutter也存在网格列表组建GridView&#xff0c;用于展示多行多列的列表。 1.1 GridView构建 采用GridView.count() 进行构建 1.2 Gr…

HarmonyOS实战开发-自定义分享

介绍 自定义分享主要是发送方将文本&#xff0c;链接&#xff0c;图片三种类型分享给三方应用,同时能够在三方应用中展示。本示例使用数据请求 实现网络资源的获取&#xff0c;使用屏幕截屏 实现屏幕的截取&#xff0c;使用文件管理 实现对文件&#xff0c;文件目录的管理&…

5.9 mybatis之callSettersOnNulls作用

文章目录 1. 当callSettersOnNullstrue时2. 当callSettersOnNullsfalse时 在mybatis的settings配置参数中有个callSettersOnNulls参数&#xff0c;官方解释为&#xff1a;指定当结果集中值为 null 的时候是否调用映射对象的 setter&#xff08;map 对象时为 put&#xff09;方法…