В каких dbspace размещены таблицы.
SELECT s2.name,s1.tabname, s3.tabtype
FROM sysmaster:systabnames s1,sysmaster:sysdbspaces s2, systables s3
WHERE s2.dbsnum=TRUNC(s1.partnum/1048576)
AND s3.tabname=s1.tabname
AND s3.tabid>=100
ORDER by name,tabname
Размеры индексов относительно размера таблиц, для которых созданы.
SELECT a.tabname, SUM(b.size*2) size
FROM sysmaster:sysextents b, systables a
WHERE a.tabname=b.tabname
GROUP BY 1 INTO TEMP idx_size_check_tmp;
SELECT b.idxname, c.tabname, ROUND(SUM(a.size)*2) idx_size, g.size tab_size, ROUND(2*SUM(a.size)/g.size,2)
FROM sysmaster:sysextents a, sysindexes b, systables c, idx_size_check_tmp g
WHERE a.tabname=b.idxname AND b.tabid>100 AND b.tabid=c.tabid AND g.tabname=c.tabname
GROUP BY 1,2,4 HAVING ROUND(SUM(a.size))>512 AND ROUND(2*SUM(a.size)/g.size,2)>0.5 ORDER BY 3 DESC;
DROP TABLE idx_size_check_tmp;
Реальные размеры таблиц и количество использованных экстентов.
SET ISOLATION DIRTY READ;
SELECT a.tabname, ROUND(SUM(a.size)*2) size_gb, COUNT(a.size) extents
FROM sysmaster:sysextents a, systables b
WHERE a.tabname=b.tabname AND tabid>=100
GROUP BY 1 ORDER BY 2 DESC,3 DESC,1;
Блокировки. Кто, что.
SET ISOLATION DIRTY READ;
SELECT count(owner) count, owner, tabname, type, username, hostname
FROM sysmaster:syslocks, sysmaster:syssessions
WHERE sid=owner
GROUP BY 2,3,4,5,6
-- HAVING COUNT(owner)>4
ORDER BY 4 DESC;
Совет:
Прежде чем “экономить” блокировки меняя lock mode с row на page – желательно убедиться, что row<page.
Количество свободных экстентов, которые можно выделить таблицам
DATABASE sysmaster;
SELECT {+ ORDERED, INDEX(A, SYSPAGHDRIDX) }
c.dbsname db
,c.tabname table
,ROUND(SUM(pe_size)/524288,2)||' GB' size
,TRUNC(a.pg_frcnt/8) free_fragments
FROM sysdbspaces b, syspaghdr a, systabnames c, sysptnext d
WHERE a.pg_partnum = PARTADDR(b.dbsnum, 1)
AND BITVAL(a.pg_flags, 2) = 1
AND a.pg_nslots = 5
AND c.partnum = PARTADDR(b.dbsnum, a.pg_pagenum)
AND c.partnum = d.pe_partnum
AND TRUNC(a.pg_frcnt/8)<30
GROUP BY 1,2,4
UNION
SELECT {+ ORDERED, INDEX(A, SYSPAGHDRIDX) }
c.dbsname db
,c.tabname table
,ROUND(SUM(pe_size)/524288,2)||' GB' size
,TRUNC(a.pg_frcnt/8) free_fragments
FROM sysdbspaces b, syspaghdr a, systabnames c, sysptnext d
WHERE a.pg_partnum = PARTADDR(b.dbsnum, 1)
AND BITVAL(a.pg_flags, 2) = 1
AND a.pg_nslots = 5
AND c.partnum = PARTADDR(b.dbsnum, a.pg_pagenum)
AND c.partnum = d.pe_partnum
GROUP BY 1,2,4
ORDER BY 4
--HAVING ROUND(SUM(pe_size)/524288,2) > 25;
Всё нижеследующее под HP-UX, но должно работать под любой *nix
Свободное место в dbspace(тут №9), в страницах
onstat -d|awk '$3~/^9$/ {s+=$6}END{print s}'
Сколько занимает БД в страницах.
onstat -d | awk '/P.+-/ {sum+=$5-$6} END {print sum}'
Если страница 2Кб, то в гигах так:
onstat -d | awk '/P.+-/ {sum+=$5-$6} END {print sum/524288}'
Список используемых сервером чанков. (ну мало-ли зачем)
onstat -d | awk '$7~"P.+-" {print $8};$8~"P..-" {print $9}' | sort -u
БД упала, при запуске получаем такую ошибку
19:34:51 shmget: [EEXIST][17]: key 52ba4801: shared memory already exists
19:34:51 mt_shm_init: can't create resident segment
Ищем "залипший" сегмент
# ipcs -m
IPC status from /dev/kmem as of Mon Nov 8 15:32:05 2010
T ID KEY MODE OWNER GROUP
Shared Memory:
............
m 45187614 0x52ba4801 --rw-rw---- informix informix
............
Убиваем
Проверка целостности БД перед миграцией на 11.5 (HP-UX)
Запускать из под пользователя informix предварительно выставив необходимое окружение. Соответственно на время проверки(долго) БД будет недоступна.
#!/sbin/sh
PATH=$PATH:/usr/sbin
onmode -m
LOG=./migrate_chk_dbs.log
#kcusage nfile > kernel.log
#kcusage shmseg >> kernel.log
#kcusage semmni >> kernel.log
#kcusage semmns >> kernel.log
#kcusage semmnu >> kernel.log
#kcusage shmmni >> kernel.log
#kcusage shmmax >> kernel.log
#exit 1
>$LOG
onstat -l|awk '/:/ {sum+=$6} END {print "Logical log pages available "sum" (need minimum 3000)"}' >> $LOG
onstat -d | awk '$3 == 1 {(sum+=$5) (free+=$6)} END {print "Root dbs "sum". Free space "free" ~"free*100/sum"% (need minimum 10%)"}' >> $LOG
dbaccess sysmaster <<! >> $LOG 2>/dev/null
SELECT partdbsnum(sd.partnum) dbspace_num,
ss.name,
trunc(count(sd.partnum) * 2000) free_space_req,
sum(sc.nfree) free_space_avail
FROM sysdatabases sd, syschunks sc, sysdbspaces ss
WHERE partdbsnum(sd.partnum)=sc.dbsnum and ss.dbsnum=sc.dbsnum
GROUP BY 1,2
ORDER BY 1;
!
DBS=`echo "select name from sysdatabases" | dbaccess sysmaster 2>&1 | awk '/name/ {print $2}'`
#onmode -l
onmode -ky
oninit -s
oncheck -cr > oncheck-cr.log
oncheck -ce > oncheck-ce.log
for I in $DBS
do
echo $I
oncheck -cc -q $I > oncheck-cc.$I.log
oncheck -cD -q $I > oncheck-cD.$I.log
oncheck -cIx -q $I > oncheck-cI.$I.log
done
Процент забэкапленых(включая текущий) журналов
ENVIROMENT=путь к скрипту переменных окружения для конкретного инстанса
su - informix -c ". $ENVIROMENT;onstat -l"|awk '$3~/^U-/ {i+=1} $3~/^U-B/ {j+=1} END {print (j+1)/i*100}'
Собственно идея проста и далеко не нова.
Если есть необходимость произвести массовый delete/insert/update/alter с таблицей большого размера и есть возможность организовать небольшой downtime, то есть смысл временно перевести БД в режим "no log", произвести работы и вернуть всё обратно(если режим логирования ANSI, то способ работать не будет).
0. Глушим все пользовательские сессии
1. Делаем backup
2. Создаем симлинк для /dev/null
ln -s /dev/null /dev/fakermt
3. Меняем параметр TAPEDEV в onconfig (ontape "не любит" работать с /dev/null)
4. Меняем режим логирования базы
5. Делаем свое чёрное дело
6. Меняем режим логирования обратно(в моем случае buffered log)
7. Меняем обратно параметр TAPEDEV
8. PROFIT!!!