Автор Тема: Informix. Полезное.  (Прочитано 4482 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 424
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Informix. Полезное.
« : 08 Ноября 2010, 12:16:18 »
В каких 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;
« Последнее редактирование: 08 Ноября 2010, 15:05:12 от rjhdby »
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 424
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Informix. Полезное.
« Ответ #1 : 08 Ноября 2010, 14:09:23 »
Совет:
Цитата
Прежде чем “экономить” блокировки меняя 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;
« Последнее редактирование: 08 Ноября 2010, 16:07:34 от rjhdby »
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 424
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Informix. Полезное.
« Ответ #2 : 08 Ноября 2010, 14:38:47 »
Всё нижеследующее под 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
............
Убиваем
# ipcrm -m 52ba4801
« Последнее редактирование: 09 Ноября 2010, 09:49:16 от rjhdby »
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 424
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Informix. Полезное.
« Ответ #3 : 10 Декабря 2010, 09:21:50 »
Проверка целостности БД перед миграцией на 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
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 424
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Informix. Полезное.
« Ответ #4 : 27 Декабря 2010, 14:51:37 »
Процент забэкапленых(включая текущий) журналов
ENVIROMENT=путь к скрипту переменных окружения для конкретного инстанса
su - informix -c ". $ENVIROMENT;onstat -l"|awk '$3~/^U-/ {i+=1} $3~/^U-B/ {j+=1} END {print (j+1)/i*100}'
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 424
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Re: Informix. Полезное.
« Ответ #5 : 16 Мая 2011, 10:23:56 »
Собственно идея проста и далеко не нова.
Если есть необходимость произвести массовый 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)
TAPEDEV /dev/fakermt
4. Меняем режим логирования базы
ontape -s -N dbname
5. Делаем свое чёрное дело
6. Меняем режим логирования обратно(в моем случае buffered log)
ontape -s -B dbname
7. Меняем обратно параметр TAPEDEV
8. PROFIT!!!
А вот тут можно посмотреть картины моей супруги http://sevil.pro