快速复制一张大表讨论
有这样的一类需求,快速复制一张表,而这张表的数据量又非常的大。比方说本来是分区表,要把它重新变成非分区表,怎么能够快速的完成这样的操作呢?我下面给出2种大致的方法:
第一,就是利用CTAS方式来创建一张新表,当然要想加快速度,在数据库不是force logging的前提下,可以使用nologging方式来创建表
SQL> create table auction_auctions_bak
2 tablespace tbs_taobao
3 nologging
4 as
5 select * from auction_auctions;
Table created.
SQL> select count(*) from auction_auctions;
COUNT(*)
----------
4179779
SQL> select count(*) from auction_auctions_bak;
COUNT(*)
----------
4179779
在建立完成表以后,要注意将表的属性重新变成logging:
SQL> select logging from tabs where table_name=\'AUCTION_AUCTIONS_BAK\';
LOG
---
NO
SQL> alter table auction_auctions_bak logging;
Table altered.
当然也可以这样:CREATE TABLE ... AS SELECT .. WHERE 1=2;然后使用 INSERT /*+ APPEND */ INTO .. SELECT ...。
最后将表名更改过来,建立一下新的索引,然后就可以了。
SQL> drop table auction_auctions;
Table dropped.
SQL> rename auction_auctions_bak to auction_auctions;
Table renamed.
第二,在原理上,它其实和第一种方式差不多,就是阻止数据库记录日志来加快速度,大概过程如下:
1、exp出原表(建议compress=n)
2、drop 原表
3、以nologging的方式,新建与原表同名的空表
4、imp原表至空表中,注意要把ignore设置为y
5、更改新表的属性为logging
我这次分别都对两种方式做了测试,结果第二种方式远远快于第一种方式,大概是其10倍的速度。注意以上两种方式都是在数据库没有force logging的前提下完成的。如果数据库被force logging了,那么怎样才能加快复制速度,这个大家可以说说。
建议继续学习:
- vim的复制粘贴小结 (阅读:6604)
- VIM复制粘贴的那些事 (阅读:4182)
- MySQL5.5复制/同步的新特性及改进 (阅读:3851)
- MySQL Cluster 与 MongoDB 复制及分片设计及原理 (阅读:3298)
- MySQL复制的概述、安装、故障、技巧、工具 (阅读:3328)
- HIVE的CTAS用法探究 (阅读:2395)
- [MySQL优化案例] — slave延迟很大优化方法 (阅读:2977)
- Google Docs Ctrl + C 技术浅析 (阅读:1834)
- 用 JS 复制艺术 (阅读:1704)
- 在 Linux 上复制和重命名文件 (阅读:929)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:小霸王 来源: ilonng
- 标签: CTAS 复制
- 发布时间:2009-10-12 10:05:23
-
[60] memory prefetch浅析
-
[58] find命令的一点注意事项
-
[35] 读书笔记-壹百度:百度十年千倍的29条法则
-
[32] Oracle bbed工具的编译
-
[29] 基本排序算法的PHP实现
-
[28] 小屏幕移动设备网页设计注意事项
-
[27] 卡诺模型―设计品质与设计价值的思考
-
[24] 程序员技术练级攻略
-
[24] 8大实用又重要Mac使用技巧
-
[21] 杨建:网站加速--Cache为王篇