海量資料遷移之透過shell估算資料量
比如我們現在客戶提供瞭如下的資訊,需要我們評估一下在目前的使用者基礎上遷移幾百萬使用者需要新增的空間。
表空間假設是如下的儲存情況。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 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 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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347028/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用impdp,expdp資料泵進入海量資料遷移
- 超大資料量遷移方案,XTTS vs OGG大資料TTS
- 資料遷移(1)——通過資料泵表結構批量遷移
- 達夢資料庫資料檔案遷移過程資料庫
- Mysql百萬級資料遷移,怎麼遷移?實戰過沒?MySql
- ORM實操之資料庫遷移ORM資料庫
- Laravel 學習之資料庫遷移Laravel資料庫
- Linux透過Shell命令向埠傳送資料Linux
- Harbor資料遷移
- gitlab資料遷移Gitlab
- 資料庫遷移資料庫
- Kafka資料遷移Kafka
- 企業資訊系統在遷移過程中,資料遷移要注意什麼?
- 系統資料遷移
- laravel資料庫遷移Laravel資料庫
- congregate遷移gitlab資料Gitlab
- 資料庫遷移 :理解資料庫
- Fastdfs資料遷移方案AST
- Mysql資料遷移方法MySql
- 【Hive】hive資料遷移Hive
- 【Redis】 redis資料遷移Redis
- redis資料庫遷移Redis資料庫
- 達夢遷移工具之MySQL資料庫遷移到達夢MySql資料庫
- 運維效率之資料遷移自動化運維
- 伺服器資料遷移的方法-硬體不同如何遷移資料伺服器
- 雲資料庫管理與資料遷移資料庫
- dm資料庫遷移命令資料庫
- SAP資料遷移需要多久?
- 用rman遷移資料庫資料庫
- 資料庫遷移手記資料庫
- 遷移MySQL 5.7資料庫MySql資料庫
- 資料庫遷移神器——Flyway資料庫
- Redis migrate 資料遷移工具Redis
- AWS RDS Oracle資料遷移Oracle
- 資料遷移方案選擇
- linux mysql資料庫遷移LinuxMySql資料庫
- django資料庫遷移-15Django資料庫
- geoserver資料儲存遷移Server
- SQL Server資料庫遷移SQLServer資料庫