Июн 172011
 

Иногда бывает, что нужно оценить размер некоторых таблиц в дампе, сделанном утилитой exp, но без импорта его в базу. Можно, конечно, сделать импорт с параметром show=y, но это не всегда удобно, т.к. imp в этом режиме показывает размеры таблиц в строках (а мы хотим в мегабайтах, к примеру), и требует подключения к базе данных, даже для имитации. Выход - написать свой скрипт для оценки размеров таблиц (прошу прощения за неряшливый код):

#!/usr/bin/perl -w 
#Created: Cube, 15.06.2011
#Version 1.0
 
use strict;
use POSIX;
 
my $buf     = '';
my $tblLen  =  0;
my $tblName = '';
my $ind     =  0;
 
open(DUMPFILE, '<', $ARGV[0]) || die("Unable to open file " . $ARGV[0]);
binmode DUMPFILE;
while ((read DUMPFILE, $buf, 1048576) != 0) 
{
	if(($ind = index($buf, "CREATE TABLE \"")) > 0)
	{
		if($tblName)
		{
			print $tblName, "\t", ceil(($tblLen + $ind)/1048576), " MB\n";
		}
                $tblLen  = length($buf) - $ind;
                $tblName = substr($buf, $ind + 14, index($buf, "\"", $ind + 14 ) - $ind - 14);
                seek(DUMPFILE, -length($buf) + $ind + 1, 1);
        }
        else
        {
                $tblLen += length($buf);
        }
}

Скрипт ищет в дампе строку "CREATE TABLE", берёт название таблицы, а всё, что идёт после (до следующего "CREATE TABLE"), считает данными и просто суммирует их размер.

  • Достоинства:
    • Кроссплатформенный
    • Не требует установленной базы данных или даже Oracle Client
    • Нормально обрабатывает секционированные таблицы
    • Шустро работает
  • Недостатки:
    • Оценивает размеры грубовато (± 5 Мб)
    • Не покажет размер индекса (хотя это не недостаток, а фундаментальное свойство, в дампе не хранятся индексы)
    • Не работает с дампами, полученными утилитой expdp

Использовать скрипт так:

dumpinfo.pl file.dmp
# или так:
perl dumpinfo.pl file.dmp

Можно свалить вывод в файлик с помощью ">" и искать в нём интересующие таблицы grep'ом, а можно отсортировать по убыванию размеров с помощью команды sort.

Upd.: Меня спрашивали (в оффлайне), зачем нужен этот скрипт. Поясняю: время от времени ко мне приходят ходоки и приносят некий мутный дамп на 50 Гб с просьбой залить в тестовую базу (работа такая). Скрипт позволяет посмотреть, что там за дрянь лежит и вместе с ходоком решить, от каких таблиц можно отказаться, залив их с rows=n или вообще пропустив.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)