среда, 24 декабря 2008 г.

Копирование структуры директории в *nix

Заходим в нужную директорию и генерируем команды создания директорий:

find . -type d -exec echo mkdir -p {} \;

или сразу выполняем команду создания:

find . -type d -exec mkdir -p <место копирования>{} \;

пятница, 19 декабря 2008 г.

Как идентифицировать горячие блоки при cache buffer chains латчах :

note 163424.1

SQL> select CHILD# "cCHILD"
, ADDR "sADDR"
, GETS "sGETS"
, MISSES "sMISSES"
, SLEEPS "sSLEEPS"
from v$latch_children
where name = 'cache buffers chains'
order by 5, 1, 2, 3;

Run the above query a few times to to establish the id(ADDR) that has the most
consistent amount of sleeps. Once the id(ADDR) with the highest sleep count is found
then this latch address can be used to get more details about the blocks
currently in the buffer cache protected by this latch.
The query below should be run just after determining the ADDR with
the highest sleep count.


column segment_name format a35
select /*+ RULE */
e.owner ||'.'|| e.segment_name segment_name,
e.extent_id extent#,
x.dbablk - e.block_id + 1 block#,
x.tch,
l.child#
from
sys.v$latch_children l,
sys.x$bh x,
sys.dba_extents e
where
x.hladdr = '&ADDR' and
e.file_id = x.file# and
x.hladdr = l.addr and
x.dbablk between e.block_id and e.block_id + e.blocks -1
order by x.tch desc ;

Example of the output :
SEGMENT_NAME EXTENT# BLOCK# TCH CHILD#
-------------------------------- ------------ ------------ ------ ----------
SCOTT.EMP_PK 5 474 17 7,668
SCOTT.EMP 1 449 2 7,668

И не большой солюшн:

Depending on the TCH column (The number of times the block is hit by a SQL
statement), you can identify a hotblock. The higher the value of the TCH column,
the more frequent the block is accessed by SQL statements.

In order to reduce contention for this object the following mechanisms can be put in place:

1) Examine the application to see if the execution of certain DML and SELECT statements
can be reorganized to eliminate contention on the object.

2) Decrease the buffer cache -although this may only help in a small amount of cases.

3) DBWR throughput may have a factor in this as well.
If using multiple DBWR's then increase the number of DBWR's.

4) Increase the PCTFREE for the table storage parameters via ALTER TABLE
or rebuild. This will result in less rows per block.

5) Consider implementing reverse key indexes
(if range scans aren't commonly used against the segment)

Скрипт для отправки почты через заданный smtp сервер :


#!/usr/bin/perl
use Net::SMTP;
my $ServerName = "smtp.mail.com"; # адрес smtp
my $RealNameFrom = "Oramain Server";
my $MailFrom = "sender\@domain.com";
my $RealNameTo = "Klim Samgin";
my $MailTo = "vpupkin\@microsoft.com";
#my $MailSubject = "Sudbject";
my $MailSubject = $ARGV[0];

$smtp = Net::SMTP->new($ServerName);
die "Couldn't connect to server" unless $smtp;
print $ARGV[1];
$smtp->mail( $MailFrom );
$smtp->to( $MailTo );
$smtp->data();
$smtp->datasend("To: $RealNameTo <$MailTo>\n");
$smtp->datasend("From: $RealNameFrom <$MailFrom>\n");
$smtp->datasend("Subject: $MailSubject\n\n");
while (defined($line = )) {
$smtp->datasend("$line");
}
$smtp->dataend();
$smtp->quit();

Автоматический запуск экземпляра :


#cat >> /etc/init.d/oracle
#!/sbin/sh
ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
case $1 in
start)
su - oracle -c $ORACLE_HOME/bin/dbstart
su - oracle -c "$ORACLE_HOME/bin/lsnrctl start"

exit 0
;;

stop)
su - oracle -c "$ORACLE_HOME/bin/lsnrctl stop"
su - oracle -c $ORACLE_HOME/bin/dbshut
;;
esac
ctrl^d


#for solaris:

#ln -s ../init.d/oracle /etc/rc3.d/S95oracle
#ln -s ../init.d/oracle /etc/rc0.d/K15oracle
#chmod 0755 /etc/init.d/oracle

Для версии 10 g нет необходимости в строках с lsnrctl, т.к. dbshut\dbstart
сам запускает\останавливает прослушиватель. Но есть Bug 4509652, по которому надо делать так:
dbstart $ORACLE_HOME

Срезы statspack через заданный промежуток времени :

Если не запущен job spauto.sql но нужно собрать часовую статистику statspack, рекомендуется следующий скрипт, после запуска запросит значение elapsed в секундах:

#!/bin/ksh

# First, we must set the environment . . . .
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
####for solaris#####
#ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH

echo "Please enter the number of seconds between snapshots."
read elapsed


$ORACLE_HOME/bin/sqlplus perfstat/perfstat<10);
exit
EOF

sleep $elapsed

$ORACLE_HOME/bin/sqlplus perfstat/perfstat<10);

select
name,
snap_id,
to_char(snap_time,' dd Mon YYYY HH24:mi:ss')
from
stats\$snapshot,
v\$database
where
snap_id > (select max(snap_id)-2 from stats\$snapshot)
;

Удаление файлов определенной даты :

for i in `ls -la | awk '{if ($6=="Nov" && $7=="11") print $9}'`; do rm -rf $i; done

Используйте осторожно! Рекомендуется сначала просмотреть:
ls -la | awk '{if ($6=="Nov" && $7=="11") print "rm -f " $9}'

Чтобы проще найти трейс файл :

alter session set tracefile_identifier='my_trace_id';
Включаем трассировку в этой сессии.
Имя трейс файла будет содержать my_trace_id .

Запуск базы с горячей копии при отсутствии архивлогов :)

Nikolaps'у дали такое вот задание (Oracle 8.1.7). Решили следующим образом: включили параметр _allow_resetlogs_corruption=TRUE, попытались открыть, получили отлуп:
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [4000], [2], [], [], [], [], [], []

o_O

В металинке узнали (Note:47456.1), что база ругается на наш второй сегмент отката (см. второй аргумент), добавили параметр _offline_rollback_segments=(rbs2). После этого база открылась:)

Блокирующая сессия при library cache pin


SELECT /*+ ORDERED */
W1 .SID WAITING_SESSION,
H1.SID HOLDING_SESSION,
W.KGLLKTYPE LOCK_OR_PIN,
W.KGLLKHDL ADDRESS,
DECODE (H.KGLLKMOD,
0, 'NONE',
1, 'NULL',
2, 'SHARE',
3, 'EXCLUSIVE',
'UNKNOWN')
MODE_HELD,
DECODE (W.KGLLKREQ,
0, 'NONE',
1, 'NULL',
2, 'SHARE',
3, 'EXCLUSIVE',
'UNKNOWN')
MODE_REQUESTED
FROM DBA_KGLLOCK W,
DBA_KGLLOCK H,
V$SESSION W1,
V$SESSION H1
WHERE ( ( (H.KGLLKMOD != 0)
AND (H.KGLLKMOD != 1)
AND ( (H.KGLLKREQ = 0) OR (H.KGLLKREQ = 1)))
AND ( ( (W.KGLLKMOD = 0) OR (W.KGLLKMOD = 1))
AND ( (W.KGLLKREQ != 0) AND (W.KGLLKREQ != 1))))
AND W.KGLLKTYPE = H.KGLLKTYPE
AND W.KGLLKHDL = H.KGLLKHDL
AND W.KGLLKUSE = W1.SADDR
AND H.KGLLKUSE = H1.SADDR;