海量数据迁移之通过shell估算数据量

简介: 在数据迁移的时候,需要根据用户量来评估需要在表空间理添加的空间大小。比如迁移5百万的用户和迁移200万,两者需要添加的数据量差别很大,在资源有限的情况下,需要一些比较合理的估算,毕竟在生产环境中做数据加载的时候报了空间不足的问题就是准备太不充分了,稍后的数据修复任务就难上加难。
在数据迁移的时候,需要根据用户量来评估需要在表空间理添加的空间大小。比如迁移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,然后通过如下的脚本来做计算。

awk '{print "'\''" $1 "'\''" ","}' tablst |sed -e '/^$/d' -e '$s/.$//' > tablst.temp
table_list=`cat tablst.temp`

sqlplus -s  xxxxxxx 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

通过如下的脚本来估算索引的表空间使用情况。

awk '{print "'\''" $1 "'\''" ","}' tablst |sed -e '/^$/d' -e '$s/.$//' > tablst.temp
table_list=`cat tablst.temp`

sqlplus -s  xxxx 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


    

目录
相关文章
|
Shell 数据安全/隐私保护 存储
|
SQL Oracle 关系型数据库
使用shell批量生成数据整合式迁移的脚本
对于数据整合式迁移,基本就是小霸王的二合一,四合一,八合一这样的节奏,把几个尽可能相关业务的数据库中的数据整合到一个库里。彼此还是独立的schema,倒也是相安无事。 在这种整合式迁移中,比较让人纠结的部分就是性能不是排第一位,而是迁移前的准备比较琐碎。
1080 0
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
454 9
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
367 2
|
6月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
289 60
|
3月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
9月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。