前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >海量数据迁移之通过shell估算数据量 (r2笔记93天)

海量数据迁移之通过shell估算数据量 (r2笔记93天)

作者头像
jeanron100
发布2018-03-14 17:15:45
1.1K0
发布2018-03-14 17:15:45
举报
文章被收录于专栏:杨建荣的学习笔记

在数据迁移的时候,需要根据用户量来评估需要在表空间理添加的空间大小。比如迁移5百万的用户和迁移200万,两者需要添加的数据量差别很大,在资源有限的情况下,需要一些比较合理的估算,毕竟在生产环境中做数据加载的时候报了空间不足的问题就是准备太不充分了,稍后的数据修复任务就难上加难。 比如我们现在客户提供了如下的信息,需要我们评估一下在目前的用户基础上迁移几百万用户需要添加的空间。 表空间假设是如下的存储情况。DATA开头的表空间存放表数据,INDX开头的表空间存放索引数据。

Tablespace

Init extent

Total MB

Free MB

Used MB

--------------------

----

------------

----------

-----------

DATAH01

16M

572,113

135,408

436,705

DATAL01

8M

216,179

141,360

74,819

DATAM01

4M

291,840

85,280

206,560

DATAS01

1M

302,080

74,508

227,572

INDXH01

4M

174,033

96,256

77,777

INDXM01

2M

141,312

56,812

84,500

INDXS01

128K

240,640

72,241

168,399

sum

1,938,197

661,865

1,276,332

现在得到的是整个数据库的存储情况。用户说现在库里还有600G左右的空间,让我们评估一下再迁移几百万的用户的情况需要多少空间。 比如数据库里用到的表有1000张,可能做数据迁移的时候关联的表只有100张。那么我们不能按照如下的比例来做计算。 10%*total_size*新添加的用户占用的比率 这样肯定是不科学的,而且估算的空间肯定是偏小的。 比如memo这一个表就80多个G,按照百分比计算就会出问题。 TABLE_NAME SIZE_MB TABLESPACE_NAME ------------------------------ ---------- ------------------------------ MEMO 81613 DATAS01 而从客户的角度出发,他们需要的结果类似下面的表格内容。 如果提供了如下的表格,客户一看就一目了然,大概需要添加多少的空间。

INDEX_SIZE

TOTAL_SIZE

INDXH01

INDXM01

INDXS01

sum

306093

62836

57302

185392

TABLE_SIZE

TOTAL_SIZE

DATAH01

DATAL01

DATAM01

DATAS01

sum

546981

132944

72400

126508

215129

我采用了如下的两个shell脚本来做计算。 如下的脚本计算存放表数据的表空间的数据量 我们假设我们有一个文件,里面是数据迁移中用到的表清单,取名为tablst,然后通过如下的脚本来做计算。

代码语言:javascript
复制
awk '{print "'\''" $1 "'\''" ","}' tablst |sed -e '/^$/d' -e '$s/.$//' > tablst.temp
table_list=`cat tablst.temp`
sqlplus -s  xxxxxxx <<EOF
set linesize 200
set pages 100
col table_name format a30
break on report
compute sum of total_size on report
compute sum of INDXH01 on report
compute sum of INDXM01 on report
compute sum of INDXS01 on report
select table_name,
 sum(size_MB) total_size,
 sum(decode(tablespace_name,'INDXH01', size_MB,0)) INDXH01,
 sum(decode(tablespace_name,'INDXM01', size_MB,0)) INDXM01,
 sum(decode(tablespace_name,'INDXS01', size_MB,0)) INDXS01
from (select idx.table_name, round(sum(seg.bytes/1024/1024)) size_MB,seg.tablespace_name from  user_segments seg,user_indexes idx where seg.segment_name=idx.index_name and  idx.table_name='MO1_MEMO' group by idx.table_name,seg.tablespace_name)
group by table_name;
EOF
rm tablst.temp

假设我们我们计算3个表。MEMO,CHARGE,CHARGE_REL,运行脚本后我们得到如下的清单,就很清楚的看到,哪些表占用了多少空间,在哪个表空间。 TABLE_NAME TOTAL_SIZE DATAH01 DATAL01 DATAM01 DATAS01 ------------------------------ ---------- ---------- ---------- ---------- ---------- CHARGE 104720 104720 0 0 0 MEMO 81613 0 0 0 81613 CHARGE_REL 12672 12672 0 0 0 ---------- ---------- ---------- ---------- ---------- sum 199005 117392 0 0 81613 通过如下的脚本来估算索引的表空间使用情况。

代码语言:javascript
复制
awk '{print "'\''" $1 "'\''" ","}' tablst |sed -e '/^$/d' -e '$s/.$//' > tablst.temp
table_list=`cat tablst.temp`
sqlplus -s  xxxxxxx  <<EOF
set linesize 200
set pages 100
col table_name format a30
break on report
compute sum of total_size on report
compute sum of DATAH01 on report
compute sum of DATAH01 on report
compute sum of DATAL01 on report
compute sum of DATAM01 on report
compute sum of DATAS01 on report
select table_name,
 sum(size_MB) total_size,
 sum(decode(tablespace_name,'DATAH01', size_MB,0)) DATAH01,
 sum(decode(tablespace_name,'DATAL01', size_MB,0)) DATAL01,
 sum(decode(tablespace_name,'DATAM01', size_MB,0)) DATAM01,
 sum(decode(tablespace_name,'DATAS01', size_MB,0)) DATAS01
from (select segment_name table_name, round(sum(bytes/1024/1024)) size_MB,tablespace_name from  user_segments where segment_name in ($table_list) group by segment_name,tablespace_name)
group by table_name;
EOF
rm tablst.temp

运行后得到的如下的一个清单,就可以看到表对应索引的存储情况。
TABLE_NAME                     TOTAL_SIZE    INDXH01    INDXM01    INDXS01
------------------------------ ---------- ---------- ---------- ----------
CHARGE                          27004      21620          0       5384
  CHARGE_REL                  28868      28868          0          0
MEMO                            33999          0          0      33710
                          ---------- ---------- ---------- ----------
sum                                 89871      50488          0      39094

得到了如上的列表,需要评估数据量的情况就有思路了。
可以基于当前数据库中的剩余空间来排查目前的空间是否足够,如果不够需要添加多少。

Tablespace

Init extent

Total MB

Free MB

Used MB

--------------------

----

------------

----------

-----------

DATAH01

16M

572,113

135,408

436,705

DATAL01

8M

216,179

141,360

74,819

DATAM01

4M

291,840

85,280

206,560

DATAS01

1M

302,080

74,508

227,572

INDXH01

4M

174,033

96,256

77,777

INDXM01

2M

141,312

56,812

84,500

INDXS01

128K

240,640

72,241

168,399

sum

1,938,197

661,865

1,276,332

得到一个基本的清单,我们就需要加入一定的buffer空间,个人觉得控制在30%左右比较好。这样留有一定富余。 最后给客户的建议就是如下的清单,客户一看就一目了然。

INDXM01 +50G

INDXS01 +100G

DATAM01 +50G

DATAS01 +100G

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2014-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档