`
shangjava
  • 浏览: 1237477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

写有效的历史数据迁移sql

阅读更多
转自:http://rdc.taobao.com/blog/dba/html/124_oracle_data_transfer.html
作者:丁原

对于高并发oltp系统,生产库可能只需保留当前几个月的数据,之前的数据要全部迁移到历史库中。那么,如何处理这样的需求,如何写合适的历史迁移程序呢?
1.常规写法

begin
--迁移数据
insert into tb_users
select *
from tb_users_dbc a
where gmt_modified <= trunc(sysdate) - v_day and rownum<5000000;
--删除原表数据
delete from tb_users_dbc
where gmt_modified <= trunc(sysdate) - v_day and rownum<5000000;
commit;
end;


2.使用for循环

declare
v_counts number := 0;
begin
--中间表
insert into tmp_tb_users
select *
from tb_users_dbc
where gmt_modified <= trunc(sysdate) - v_day and rownum<5000000;
commit;
for i in (select id from tmp_tb_users) loop
--数据迁移
insert into tb_users
select * from tb_users_dbc where id = i.id;
delete from tb_users_dbc where id = i.id;
v_counts := v_counts + 1;
--分批提交
if mod(v_counts, 100) = 0 then
commit;
end if;
end loop;
end;

3.使用bulk collect

declare
type rec_rids is table of varchar2(32);
v_rids rec_rids;
cursor cur_aids is
select id
from tb_users_dbc
where gmt_modified <= trunc(sysdate) - v_day and rownum<5000000;
begin
open cur_aids;
loop
fetch cur_aids BULK COLLECT INTO v_rids LIMIT 1000;
for i in 1 .. v_rids.count loop
--数据迁移
insert into tb_users
select * from tb_users_dbc where id = v_rids(i);
delete from tb_users_dbc where id = v_rids(i);
end loop;
commit;
EXIT WHEN v_rids.COUNT = 0;
end loop;
close cur_aids;
end;

很少考虑常规写法,数据迁移一般会选择采用2,3种方法。
相比for迁移方式,采用bulk collect避免了上下文切换,在大批量数据迁移中还是有很大优势的,推荐采用bulk collect数据迁移方案。
Asktom上有很多关于历史迁移方案的帖子,Tom的答案一直都是常规写法,也就是上面的第一种写法,可是常规写法消耗大量的资源,出现异常时整个事务都得回滚。因此很多人都认为Tom的方案不可行,认为Tom并没有接触过大数据库等。
4.借助Tom的思想,把迁移的数据拆分成n个小表,对n个小表进行迁移

declare
pagecount number;
sumcount number;
loopcount number;
begin
--取要迁移的数据
execute immediate 'truncate table tmp_tb_users';
insert into tmp_tb_users
select id
from tb_users_dbc
where gmt_modified <= trunc(sysdate) - v_day and rownum < 5000000;
--计算迁移总数
select count(*) into sumcount from tmp_tb_users;
--设定每次迁移条数
pagecount = 2000;
--得到循环次数
loopcount := sumcount / pagecount + 1;
for i in 1 .. loopcount loop
begcount := (i - 1) * pagecount + 1;
endcount := i * pagecount;
--构建中间小表
execute immediate 'truncate table mid_tb_users';
insert into mid_tb_users
select id, b.rn
from tmp_tb_users b where b.rn >= begcount and b.rn <= endcount;
--小表和原表进行关联,迁移数据
insert into tb_users
select f.*
from mid_tb_users t, tb_users_dbc f
where t.biz_order_id = f.biz_order_id
and t.rn >= begcount and t.rn < = endcount;
--删除原表数据
delete from tb_users_dbc where id in (select id from mid_tb_users);
commit;
end loop;
end;

1.优于常规写法,可以分批多次进行提交,加入异常处理可以避免全部数据回滚。
2.优于for迁移,借助中间小表一次迁移多条记录,大大降低了insert,delete的执行次数。
3.主要是提供给大家一种思路。

结论:
其实写法好没有好坏之分,关键在于怎么用,就大批量迁移数据来说,我觉得3,4都是比较可行的方案。欢迎大家拍砖讨论,也欢迎贡献更好的数据迁移办法。

注:上面脚本是伪代码


分享到:
评论

相关推荐

    sql 数据迁移工具

    在IT行业中,数据库管理是一项至关重要的任务,而SQL数据迁移工具正是解决这一问题的有效手段。本文将深入探讨SQL数据迁移工具的功能、应用场景以及常见的迁移策略。 SQL数据迁移工具,如标题所示,是一种能够帮助...

    利用导出功能实现历史数据迁移

    在本次迁移方案中,我们将讨论如何 利用导出功能实现历史数据迁移,以腾出数据库的有效空间,提高系统和数据备份工作效率。以下是相关知识点的总结: 1. 需求分析 在进行数据迁移之前,需要了解客户的需求和环境。...

    sqlserver和oracle数据迁移方案

    ### SQLServer与Oracle数据迁移方案知识点详述 #### 前言 在信息化时代背景下,企业数据业务量急剧增加,对数据库的安全性、稳定性和高效性的需求也达到了前所未有的高度。许多快速成长的企业发现,其早期开发的...

    数据迁移整合的方案的报告.pdf

    在这个报告中,我们关注的是如何有效地进行历史数据迁移和不同系统间的整合,以确保业务的连续性和系统的稳定性。 首先,新老系统迁移整合的需求分析是整个过程的基础。系统迁移,即系统切换,涉及到数据资源整合、...

    shell脚本实现mysql从原表到历史表数据迁移

    这里我们关注的是使用Shell脚本来实现MySQL从原表到历史表的数据迁移。这种自动化的方法可以帮助我们高效、准确地处理大量数据,同时减少人为错误。 首先,让我们深入理解`shell`脚本。Shell是Linux和Unix系统中的...

    SQL Server数据迁移方案.docx

    SQL Server数据迁移是一项复杂的过程,涉及多个关键因素。在进行迁移时,必须考虑操作系统兼容性、数据库类型、版本、数据结构、数据量以及允许的停机时间。在这个特定的案例中,我们假设操作系统和数据库类型都是...

    系统历史数据迁移方案.doc

    【系统历史数据迁移方案】 系统历史数据迁移是一个复杂的IT任务,尤其当涉及到多个异构系统时,需要精细的规划和执行。在这个方案中,我们关注的是如何从旧系统平滑过渡到新系统,并确保所有关键数据的准确无误。新...

    迁移mysql数据到oracle上

    通过上述步骤,可以有效地将MySQL数据迁移到Oracle数据库中。在整个迁移过程中,最重要的是确保数据的准确性和一致性,同时也要关注迁移效率和性能优化。此外,合理选择迁移工具和服务,可以大大减轻迁移的工作量,...

    如何用VC实现COBOL系统的数据到SQL Server的迁移.pdf

    因此,如何将这些COBOL系统中的历史数据安全、有效地迁移到支持Windows的新系统(如SQL Server)成为了许多组织面临的问题。 **二、问题分析** 在案例中,余杭广电的收费系统就是基于COBOL开发的DOS时代产物。由于...

    kettle工具——用于数据迁移等

    1. **数据迁移**:将数据从旧系统迁移到新系统,或者在不同数据库之间迁移数据。 2. **数据整合**:从多个异构数据源中抽取数据,整合成统一的数据视图。 3. **数据清洗**:去除数据中的错误、重复或不一致信息,...

    ORACLE DBA工作笔记 运维数据迁移与性能调优

    标题中提到的“ORACLE DBA工作笔记 运维数据迁移与性能调优”揭示了这本书籍主要围绕着Oracle数据库管理员(DBA)在日常工作中经常需要进行的两项关键任务:数据迁移和性能调优。作为一名Oracle DBA,不仅要负责...

    mysql数据库到Sqlserver2008数据库的迁移工具使用说明.

    这个工具简化了数据库结构和历史数据从 MySQL 到 SQL Server 的转换过程。以下是使用 SSMA2008 for MySQL 进行迁移的具体步骤: 1. **创建迁移项目**: 在开始迁移之前,你需要创建一个新的迁移项目。通过启动 ...

    数据迁移方法概述.docx

    8. 历史数据迁移方法:利用数据提取、转移和装载工具或定制程序处理历史数据迁移,通常用于处理大量非实时数据的迁移需求。 这些方法的选择应根据实际业务需求、数据量、系统的在线状态、可用资源和预算来决定。...

    oracle数据迁移

    其次,数据泵是Oracle的新一代数据迁移工具,它比传统的Export和Import工具更快,因为它使用了专有API绕过SQL缓冲区,支持更高效的提取和插入。数据泵可以导出和导入特定对象,并且可以被作业控制,允许暂停、重启或...

    WinCC数据库SQL访问

    本文将深入探讨WinCC V6.2版本中的数据库访问技术,特别关注其与SQL Server 2005的集成,以及如何通过SQL Server Management Studio(SSMS)进行有效的数据库管理。 #### WinCC V6.2数据库访问概述 WinCC V6.2采用...

    Oracle数据迁移手册.rar

    首先,手册可能会涵盖数据迁移的基本原理,包括物理迁移(例如,通过备份和恢复)和逻辑迁移(如导出导入、SQL脚本生成与执行)。物理迁移通常适用于整个数据库的迁移,而逻辑迁移则更适合于部分数据或特定表的迁移...

    用于迁移sql视图、函数、触发器和策略的alembicsql.zip

    在数据库管理中,数据迁移是一项关键任务,尤其是在大型项目或者多环境部署的场景下。`Alembic` 是一个Python库,它为SQLAlchemy(一个流行的Python SQL工具包和ORM)提供了版本控制和数据库迁移的功能。`Alembic ...

    Oracle数据库数据迁移技术研究.pdf

    数据迁移的核心任务是将旧系统的有效历史数据安全、快速地转移到新系统中,这对系统的切换和后续新系统的稳定运行具有决定性的影响。在Oracle数据库中,数据迁移的方法主要有几种: 1. **导出/导入(Export/Import...

    SQL Server转Mysql的工具mss2sql

    这对于需要将大量历史数据迁移到新数据库的企业来说,是非常重要的。 在使用mss2sql之前,用户需要确保对SQL Server和MySQL都有一定的了解,包括它们的基本语法、数据类型以及数据模型。工具的使用过程可能涉及...

    SqlServer数据导入工具

    SqlServer数据导入工具支持DBF文件导入,使得这些历史数据能够顺利迁移到Sql Server中,便于后续管理和分析。 TXT和CSV文件是常见的文本数据格式,它们以逗号分隔值的形式存储数据,易于读取和交换。此工具能快速...

Global site tag (gtag.js) - Google Analytics