大数据表备份方案求教

特能输 2008-11-14 09:38:07
我现在有一个表大概是在6千万条数据左右,是从06年开始每天加载的。
现在想把06年到08年以来按每年一个备份数据做起来,最后删除06年的数据。
由于用delete回滚不够,并产生大量的archive log。所以想请教各位有没有一个好的方案提供参考,谢谢各位了
...全文
167 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyy16xx 2008-11-19
  • 打赏
  • 举报
回复
lz一定要记住在把数据库整好后,一定要做个全备。
yonghengdizhen 2008-11-18
  • 打赏
  • 举报
回复
可以将数据按年分区,不常用的数据转移到存储于磁带上的只读表空间,或者转移到其它表空间之后离线.
Liubinglin 2008-11-18
  • 打赏
  • 举报
回复
用imp 或者impdp中的query写限制条件 日期>2006 把数据导出来
然后truncate table
然后再把表导入就OK
Well 2008-11-18
  • 打赏
  • 举报
回复
用ctas
paopaolong5747 2008-11-17
  • 打赏
  • 举报
回复
改变成noarchive模式,可以省掉一些log。不过你再想找可就。。。。呵呵
kiliyzhang 2008-11-17
  • 打赏
  • 举报
回复

通过create table *** as 备份记录比较快。
create table table2006 as select * from tableold where Data>=To_date('2006-01-01','yyyy-mm-dd') and Data <To_date('2007-01-01','yyyy-mm-dd');
create table table2007 as select * from tableold where Data>=To_date('2007-01-01','yyyy-mm-dd') AtoND Data <To_date('2008-01-01','yyyy-mm-dd');

删除记录的话,如果业务上,这张表可以暂停使用的话,以下方式你可以试试看。以防万一,先不要drop原表,rename好了。
先把保留的数据插入新表,再把原表改名,或删除。再将新建的表改成原表。
create table newtable as select * from tableold where Data>=To_date('2007-01-01','yyyy-mm-dd');
如果有索引的话可以先建好。
rename tableold to tableold1; --
rename newtable to tableold;
这样影响业务的时间就是rename两张表的瞬间。
如果 索引名一定要参照以前的名字,那么可能就要rename之后重建索引。影响业务的时间就比较长了,建索引时间比较慢(采用并行稍微快一点)




傻儿哥 2008-11-14
  • 打赏
  • 举报
回复
把归档模式关闭了,再把undo表空间设大点行不行
vc555 2008-11-14
  • 打赏
  • 举报
回复
没看出来需要用delete阿。
你用CTAS来做。
Andy__Huang 2008-11-14
  • 打赏
  • 举报
回复
Oracle备份与恢复案例
http://epub.itpub.net/5/1.htm


数据库备份脚本

冷备份脚本:

rem script:coldbak.sql

rem creater:chenjiping

rem date:5.8.2003

rem desc:offline full backup database



--connect database

connect internal/password;

--shutdown database

shutdown immediate;

--Copy Data file

!xcopy d:\Oracle\oradata\test\*.dbf d:\database/H/R;

--Copy Control file

!xcopy d:\Oracle\oradata\test\*.ctl d:\database/H/R;

--Copy Log file

!xcopy d:\Oracle\oradata\test\*.log d:\database/H/R;

--startup database

startup;

wht8008 2008-11-14
  • 打赏
  • 举报
回复
我水平低,看了半天没有看懂你说的备份方案,只知道truncate不写日志。呵呵。
liulif 2008-11-14
  • 打赏
  • 举报
回复
大概明白你的意思了,你可以这样导出,你先创建一个Table2006、Table2007、Table2008

然后做个存储过程
1、Insert INTO Table2006 Select * From Table Where Data>=To_char('200X-0Y-01','yyyy-mm-dd') AND Data<To_char('200X-0Z-01','yyyy-mm-dd'),将数据一个一个月往里面插入。
2、删除刚才插入的数据 Delete From Table Where Data>=To_char('200X-0Y-01','yyyy-mm-dd') AND Data<To_char('200X-0Z-01','yyyy-mm-dd')
3、做一个JOB,定时调用它

上面的X、Y、Z可以用天来定义它,如果今天是14号,那么X=4+2就是6、Y=1、Z=Y+1,
就是用小刀杀牛的办法,慢慢地插入数据、慢慢地删除,应该不会造成回滚地问题。
ruihuahan 2008-11-14
  • 打赏
  • 举报
回复
暂时把表改成 nologging

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧