海量数据迁移之传输表空间(一) (r5笔记第71天)
在自己接触的很多的数据迁移工作中,使用外部表在一定程度上达到了系统的预期,对于增量,批量的数据迁移效果还是不错的,但是也不能停步不前,在很多限定的场景中,有很多物理迁移中使用传统方法还是相当不错的,传输表空间就是一个样例。
最近的有一个数据迁移任务是需要把一些全新的数据表迁移到另外一个库中,因为这些表在目标库中不存在,所以使用逻辑迁移就显得有些力不从心了。尽管在速度可以接受的情况下,最大的痛处就是大量的归档文件了。
因为需要在原有的schema下增加一些全新的数据表,不是很肯定传输表空间的校验是否能够完全支持。所以在给出方案之前还是做了做测试,达到了预期的想法。
为了对比清晰,我创建了两个全新的表空间,然后创建一个用户,创建两个表,制定到两个不同的表空间下,然后使用exp使用传输表空间模式导出,然后拷贝数据文件,导入,为了简单验证,就在同一个实例下做了测试。唯一多出来的步骤就是做一些简单的清理。
--数据准备
创建两个表空间
create tablespace test_new datafile '/u02/ora11g/oradata/TEST11G/test_new01.dbf' size 10M;
create tablespace test_old datafile '/u02/ora11g/oradata/TEST11G/test_old01.dbf' size 10M;
创建一个用户
create user test_tts identified by oracle default tablespace test_old;
grant connect,resource to test_tts;
然后创建两个表制定不同的表空间
create table test1 tablespace test_new as select *from all_objects where rownum<1000;
create table test2 tablespace test_old as select *from all_objects where rownum<100;
可以简单验证一下数据情况。
select count(*)from test1;
select count(*)from test2;
然后查看user_tables简单验证一下表所处的表空间
select tablespace_name,table_name from user_tables;
TABLESPACE_NAME TABLE_NAME
------------------------------ ------------------------------
TEST_NEW TEST1
TEST_OLD TEST2
----表空间传输检查
在导出之前,使用dbms_tts做一下检查,在这个例子中是没有问题的。
exec dbms_tts.transport_set_check('TEST_NEW',TRUE);
使用给定的视图来查看是否有传输的限制。
select *from transport_set_violations;
--表空间传输导出
导出时需要指定表空间为只读模式alter tablespace test_new read only;
[ora11g@oel1 ~]$ exp 'sys/oracle as sysdba' file=test_new.dmp transport_tablespace=y tablespaces=test_new log=test_new_tts.log
Export: Release 11.2.0.1.0 - Production on Wed Jun 17 18:26:17 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in AL32UTF8 character set and AL16UTF16 NCHAR character set
Note: table data (rows) will not be exported
About to export transportable tablespace metadata...
For tablespace TEST_NEW ...
. exporting cluster definitions
. exporting table definitions
. . exporting table TEST1
. exporting referential integrity constraints
. exporting triggers
. end transportable tablespace metadata export
Export terminated successfully without warnings.
--额外的步骤,做一下简单的备份和数据清理。因为在同一个实例中实验,所以需要备份一下,然后把数据删除。
备份:
cp /u02/ora11g/oradata/TEST11G/test_new01.dbf /u02/ora11g/oradata/TEST11G/test_new01.dbf1
清理
drop table TEST1 purge;
drop tablespace test_new including contents and datafiles cascade constraint
简单验证是否数据文件存在,需要确定数据文件的句柄已经释放。
sys@TEST11G> !ls -l /u02/ora11g/oradata/TEST11G/test_new01.dbf
ls: /u02/ora11g/oradata/TEST11G/test_new01.dbf: No such file or directory
然后重命名数据文件,把原有的备份恢复。这个时候数据文件就回来了。
!mv /u02/ora11g/oradata/TEST11G/test_new01.dbf1 /u02/ora11g/oradata/TEST11G/test_new01.dbf
!ls -l /u02/ora11g/oradata/TEST11G/test_new01.dbf
--表空间导入
imp 'sys/oracle as sysdba' file=test_new.dmp transport_tablespace=y tablespaces=test_new datafiles=/u02/ora11g/oradata/TEST11G/test_new01.dbf
Import: Release 11.2.0.1.0 - Production on Wed Jun 17 18:42:47 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V11.02.00 via conventional path
About to import transportable tablespace(s) metadata...
import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
. importing SYS's objects into SYS
. importing SYS's objects into SYS
. importing TEST_TTS's objects into TEST_TTS
. . importing table "TEST1"
. importing SYS's objects into SYS
Import terminated successfully without warnings.
--迁移后的补充
迁移后需要把表空间设置为read,write模式alter tablespace test_new read write;
--数据检查
select tablespace_name,table_name from user_tables;
淡然了上面的步骤只是简单的一个常规步骤,其实还是有不少的细节考虑的,后面继续补充。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 重构 | 持续优化统一管理 Gradle
- 快速学习-XXL-JOB调度中心/执行器 RESTful API
- 快速学习-XXL-JOB快速入门
- binlog2sql,你该知道的数据恢复工具
- java反射总结
- 玩转dnmp之port篇
- 玩转dnmp之自定义容器
- python那些实用且不为人知的技巧
- 实现接口的契约测试
- java泛型总结
- 彻底搞懂 etcd 系列文章(九):etcd compact 和 watch API
- lru算法和redis的lru
- ThreadLocal
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换