Oracle数据逻辑迁移综合实战篇
本文适合迁移大量表和数据的复杂需求。
如果你的需求只是简单的迁移少量表,可直接参考这两篇文章即可完成需求:
Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
本次需求:
指定用户表结构迁移,所有表需要数据(因为此用户下的数据规模是10T的级别,所以想完全迁移不现实,最终确定为大表迁移部分数据,小表迁移全部数据)。
至于大表和小表的界定,研发侧不能提供,需要DBA自行评估划分。
最终确定迁移方案如下:
1. 首先导出所有表结构:
如果expdp 导出元数据长时间导不出来的话,可以考虑使用exp导出(rows=n)
导出示例:
数据泵导出元数据:
expdp system/oracle DIRECTORY=jy SCHEMAS=scott CONTENT=metadata_only EXCLUDE=statistics DUMPFILE=scott_metadata_only.dmp LOGFILE=scott_metadata_only.log VERSION=10.2.0.2
exp导出元数据:
nohup exp scott/tiger OWNER=scott ROWS=n BUFFER=10240000 STATISTICS=none RESUMABLE=y FILE=scott_metadata_exp.dmp LOG=scott_metadata_exp.log &
注意:
低版本->高版本迁移,不需要指定VERSION选项,
高版本->低版本迁移,需要指定VERSION选项。
导入示例:
数据泵导入元数据:
impdp system/oracle DIRECTORY=jy SCHEMAS=scott REMAP_SCHEMA=scott:scott_new REMAP_TABLESPACE=users:dbs_d_xxx TABLE_EXISTS_ACTION=replace DUMPFILE=scott_metadata_only.dmp LOGFILE=scott_metadata_only.log
imp导入元数据:
nohup imp scott/tiger BUFFER=10240000 RESUMABLE=y FILE=scott_metadata_exp.dmp LOG=imp_scott_metadata_exp.log IGNORE=y FULL=y &
2. 导出所有小表(单表预估占用空间小于等于1000M)的数据:
使用expdp并行导出, CONTENT=data_only
导出示例:
expdp scott/tiger PARFILE=scott_small_onlydata
配置文件scott_small_onlydata示例:
DIRECTORY=jy
TABLES=EMP,
DEPT
CONTENT=data_only
PARALLEL=16
DUMPFILE=scott_small_onlydata%U.dmp
LOGFILE=scott_small_onlydata.log
导入示例:
impdp scott/tiger DIRECTORY=jy CONTENT=data_only PARALLEL=16 DUMPFILE=scott_small_onlydata%U.dmp LOGFILE=impdp_scott_small_onlydata.log
3. 导出大表(单表预估占用空间大于1000M)部分数据:
## 3.1 统一导出大表当前月份的一个分区数据。 ##
导出示例:
expdp scott/tiger PARFILE=scott_big_onlydata1
配置文件scott_big_onlydata1示例:
DIRECTORY=jy
TABLES=EMP:P20150606,
DEPT:P201507
CONTENT=data_only
PARALLEL=8
DUMPFILE=scott_big_onlydata1_%U.dmp
LOGFILE=scott_big_onlydata1.log
导入示例:
impdp scott/tiger DIRECTORY=jy CONTENT=data_only PARALLEL=8 DUMPFILE=scott_big_onlydata1_%U.dmp LOGFILE=impdp_scott_big_onlydata1.log
3.2 对于未分区的大表,视表的具体情况选择性导出全部或部分数据。
导出示例:
expdp scott/tiger PARFILE=scott_big_onlydata2
配置文件scott_big_onlydata2示例:
DIRECTORY=jy
TABLES=EMP,
DEPT
CONTENT=data_only
QUERY=EMP:"where start_time>=to_date('2015-06-01','yyyy-mm-dd') and start_time<to_date('2015-06-08','yyyy-mm-dd')",
DEPT:"where dept_no > 20"
PARALLEL=8
DUMPFILE=scott_big_onlydata2_%U.dmp
LOGFILE=scott_big_onlydata2.log
导入示例:
impdp scott/tiger DIRECTORY=jy CONTENT=data_only PARALLEL=8 DUMPFILE=scott_big_onlydata2_%U.dmp LOGFILE=impdp_scott_big_onlydata2.log
4. 逻辑迁移前的检查脚本:
```
#!/bin/bash
#Usage: check information before migrate data.
#ex: sh checkinfo.sh username password
#Author: AlfredZhao
#Version: 1.0.0
sqlplus -s $1/$2 < ./checkinfo_$1.log
prompt 0.数据库版本
prompt 0.DB Version
select * from v$version;
prompt 1.确定当前连接用户下的表空间: #
prompt 1.To examine all tablespace_name that the current user owned: #
select tablespace_name from user_tables union
select tablespace_name from user_tab_partitions union
select tablespace_name from user_indexes union
select tablespace_name from user_ind_partitions;
prompt 2.预估当前连接用户的数据量 #
prompt 2.To estimate the sum(bytes/1024/1024/1024) "GB" of current user.
select sum(bytes/1024/1024/1024) "GB" from user_segments;
--确认:用户下的预估数据量小于10G的用户,可以将表结构和数据一起导出,其他用户则先导出表结构,然后对数据量进行进一步的分析确定导出方案。
prompt 3.查询每个用户的每个对象占用空间情况 #
prompt 3.To examine the space usage of every objects;
set linesize 140 pagesize 100
col SEGMENT_NAME for a55
select /*+ rule */ segment_name, sum(bytes/1024/1024)"Size (MB)" from user_segments where segment_type in('TABLE','TABLE PARTITION') group by segment_name order by 2 desc;
prompt 查询大于1000M的表
prompt more 1000M table_name
select /*+ rule */ segment_name, sum(bytes/1024/1024)"Size (MB)" from user_segments where segment_type in('TABLE','TABLE PARTITION') group by segment_name having sum(bytes/1024/1024) > 1000;
prompt 创建2个视图:v_more1000M, v_1000M
prompt create view v_more1000M,v_1000M
--create view
create view v_more1000M as select /*+ rule */ segment_name, sum(bytes/1024/1024)"Size (MB)" from user_segments where segment_type in('TABLE','TABLE PARTITION') group by segment_name having sum(bytes/1024/1024) > 1000;
create view v_1000M as select /*+ rule */ segment_name, sum(bytes/1024/1024)"Size (MB)" from user_segments where segment_type in('TABLE','TABLE PARTITION') group by segment_name having sum(bytes/1024/1024) <= 1000;
prompt 查询大于1000M的表和小于1000M的表分别的预估总大小
prompt select total_size
select sum("Size (MB)") from v_more1000M;
select sum("Size (MB)") from v_1000M;
prompt 查询大于1000M和小于1000M的表的数量
prompt select count(1)
prompt 大于1000M的表数量
prompt more1000M
select count(1) FROM v_more1000M;
prompt 小于1000M的表数量
prompt less or equal 1000M
select count(1) FROM v_1000M;
prompt 4.查询大于1000M的表是否分区 #
prompt 4.To judge whether more than 1000M table partition.
set linesize 140 pagesize 100
col SEGMENT_NAME for a55
prompt 查询大于1000M的未分区的表:
prompt select the name of normal table which more than 1000M
select /*+ rule */ segment_name, sum(bytes/1024/1024)"Size (MB)" from user_segments where segment_type in('TABLE','TABLE PARTITION') and partition_name is null group by segment_name having sum(bytes/1024/1024) > 1000;
--prompt 查询大于1000M分区的表分区个数:
--select TABLE_NAME, PARTITIONING_TYPE, SUBPARTITIONING_TYPE, PARTITION_COUNT from user_part_tables where table_name in (select segment_name from v_more1000M) order by 4;
prompt 查询分区表的分区类型DAY(P20150606),Hour(P2015060612),MONTH(P201507)
prompt 此部分只适合分区名规范的情况
set pagesize 100
select a.table_name || ',' ||
(case length(a.partition_name)
when 9 then
'Day'
when 11 then
'Hour'
when 7 then
'MONTH'
end) tab_part_desc
from user_tab_partitions a,
(select table_name, max(partition_position) max_a
from user_tab_partitions b
group by b.table_name) c
where a.table_name = c.table_name
and a.partition_position = c.max_a
and a.table_name in (select segment_name from v_more1000M)
and a.table_name not like 'BIN%';
prompt 5.查询小表清单
prompt user_small_onlydata
set pagesize 1500
select segment_name from v_1000M where segment_name not like 'BIN$%';
prompt 删除过程中创建的2个视图:v_more1000M, v_1000M
prompt drop view v_more1000M,v_1000M
--drop view
drop view v_more1000M;
drop view v_1000M;
EOF
												
											Oracle数据逻辑迁移综合实战篇的更多相关文章
- Oracle数据库逻辑迁移之数据泵的注意事项
		
环境:数据迁移,版本 11.2.0.4 -> 12.2.0.1 思考: 对于DBA而言,常用物理方式的迁移,物理迁移的优势不必多说,使用这种方式不必担心对象前后不一致的情况,而这往往也解决了不懂 ...
 - oracle数据文件迁移
		
这篇文章是从网络上获取的,然后根据内容一步步操作, 1.目前的疑问:移动日志文件的时候,为何要先进行切换? 2.move操作后,再进行rename操作的原理 --------------------- ...
 - Oracle 数据文件迁移
		
背景 这两天做一个oracle数据库迁移,以前都是用exp.imp来走,这次用到了expdp.impdp,的确有些优势,但同时又想起了只是拷贝数据文件迁移的方式,其实这个方式不常用做迁移,更多用在磁盘 ...
 - Oracle数据文件迁移到裸设备
		
本文主要描述如何将Oracle表空间的文件系统形式的数据文件迁移到LV裸设备上. 前提条件 1.oracle运行正常. 2.已使用LVM命令规划好LV文件.如/dev/vgoracle/lvdatat ...
 - Oracle逻辑迁移某业务用户及数据
		
1.确定基本信息 2.源数据库导出 3.目的数据库导入 4.逻辑迁移注意事项 1.确定基本信息 确定基本信息: 源数据库所在系统类型:________ 源数据库地址:__.__.__.__ 源数据库版 ...
 - 从SQL Server到MySQL,近百亿数据量迁移实战
		
从SQL Server到MySQL,近百亿数据量迁移实战 狄敬超(3D) 2018-05-29 10:52:48 212 沪江成立于 2001 年,作为较早期的教育学习网站,当时技术选型范围并不大:J ...
 - 通过Navicat Premium迁移Oracle到EDB迁移实战
		
1.1 DB migration analysis 在从Oracle向EDB迁移数据之前,须要做非常多准备工作.比方须要分析源数据库数据量大小.数据是否稳定.异构数据库兼容.编码方式.业务逻辑(存 ...
 - Oracle数据迁移至HBase操作记录
		
Oracle数据迁移至HBase操作记录 @(HBase) 近期需要把Oracle数据库中的十几张表T级别的数据迁移至HBase中,过程中遇到了许多苦难和疑惑,在此记录一下希望能帮到一些有同样需求的兄 ...
 - Web安全测试中常见逻辑漏洞解析(实战篇)
		
Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...
 
随机推荐
- Code Review 程序员的寄望与哀伤
			
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
 - 轻量级“集合”迭代器-Generator
			
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
 - 04.SQLServer性能优化之---读写分离&数据同步
			
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 过段时间再继续写文章吧,本来准备把SQLServer一个系列写完的,最近状态很差很不好, ...
 - Python标准模块--Unicode
			
1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...
 - 解决vs创建或打开C++浏览数据库文件*.sdf时发生错误的问题
			
VS2012, 创建或打开C++浏览数据库文件*.sdf时发生错误. IntelliSense 和浏览信息将不能用于C++项目. 请确保已安装 Microsoft SQL Server Compac ...
 - 【Big Data】HADOOP集群的配置(一)
			
Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...
 - Django
			
一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...
 - 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
			
建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...
 - 从display:run-in;中学习新技能
			
有时我们想在一行内显示一个标题,以及一段内容,虽然看起来比较简单,但是为了语义化用dl比较合适,但是它默认是block元素,改成inline?那么有多段呢?不就都跑上来了?用float?那问题也挺多. ...
 - css样式之超出隐藏
			
文本超出部分隐藏,总结两种方法. 1.单行隐藏 html代码 <div class="mi">当文字超过范围的时候,超出部分会隐藏起来.</div> css ...