вторник, 16 февраля 2016 г.

GAP

FROM primary server

. /etc/profile.d/oracle.sh
ssh STANTBY_SSH 'printf "%s\nexit" "select *  from V\$ARCHIVE_GAP;"|sqlplus / as sysdba' | grep -P "\s+\d+\s+\d+\s+\d+" | awk '{print  "restore archivelog from sequence "$2" until sequence "$3"
thread "$1";\nexit"}' | /opt/grid/bin/rman target /

четверг, 12 ноября 2015 г.

мониторинг с помощью sysstat

1)
vmstat -t 5 > /var/log/vmstat.log &
запуск данной команды позволит записывать в файл суммарные показатели с 5 секундным интервалом (можно установить любой)
пример выдачи
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 447272 1474168 170052 623788    0    0     0     3    0    0  1  0 98  1  0       2015-11-06 00:09:01 MSK
 0  0 447272 1475648 170052 623792    0    0     0    26  254  144  1  1 96  2  0       2015-11-06 00:09:06 MSK
 0  0 447272 1475904 170052 623792    0    0     0     0   71   90  0  0 100  0  0      2015-11-06 00:09:11 MSK


2) требуется установить пакет для съема статистики
apt-get install sysstat

pidstat -d -r -u -h 5 > /var/log/pidstat.log &
запуск данной команды позволит записывать в файл статисческие показатели по активным процессам с 5 секундным интервалом (можно установить любой)
пример выдачи
Linux 2.6.32-431.el6.x86_64 ()  11/06/2015      _x86_64_        (4 CPU)

#      Time       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s  Command
 1446758785      2837    0.00    0.20    0.00    0.20     3     83.70      0.00  101108    924   0.02      0.00      0.00      0.00  pidstat
 1446758785     12971    0.00    0.20    0.00    0.20     2      0.00      0.00 2950672 107984   2.75      0.00      0.00      0.00  mysqld

#      Time       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s  Command
 1446758790        21    0.00    0.20    0.00    0.20     2      0.00      0.00       0      0   0.00      0.00      0.00      0.00  events/2
 1446758790      2837    0.20    0.40    0.00    0.60     3     85.20      0.00  101108    952   0.02      0.00      0.00      0.00  pidstat
 1446758790     20174    0.20    0.00    0.00    0.20     3      0.00      0.00 1240316 218264   5.56      0.00      0.00      0.00  ruby

#      Time       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s  Command
 1446758795         9    0.00    0.20    0.00    0.20     1      0.00      0.00       0      0   0.00      0.00      0.00      0.00  ksoftirqd/1
 1446758795       980    0.00    0.00    0.00    0.00     0      0.00      0.00  249856   5136   0.13      0.00      0.80      0.00  rsyslogd
 1446758795      2837    0.20    0.40    0.00    0.60     3     83.80      0.00  101108    952   0.02      0.00      0.00      0.00  pidstat
 1446758795     12971    0.00    0.20    0.00    0.20     2      0.00      0.00 2950672 107984   2.75      0.00      0.00      0.00  mysqld

iostat -d -k -t -x  -z 5 > /var/log/iostat.log &
запуск данной команды позволит записывать в файл суммарные показатели по нагрузке на дисковую подсистему с 5 секундным интервалом (можно установить любой)
пример выдачи
Linux 2.6.32-431.el6.x86_64 ()  11/06/2015      _x86_64_        (4 CPU)

11/06/2015 12:17:53 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.03     1.58    0.02    1.23     1.00    10.40    18.31     0.07   55.78  31.92   3.98
scd0              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    1.30   1.30   0.00
dm-0              0.00     0.00    0.01    2.29     0.67     9.32     8.67     0.13   54.46  17.23   3.97
dm-1              0.00     0.00    0.04    0.04     0.14     0.16     8.00     0.04  574.35   0.66   0.00
dm-2              0.00     0.00    0.00    0.23     0.19     0.92     9.48     0.11  476.89   0.27   0.01

11/06/2015 12:17:58 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

11/06/2015 12:18:03 AM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.20     0.00     0.80     8.00     0.00   20.00  20.00   0.40
dm-0              0.00     0.00    0.00    0.20     0.00     0.80     8.00     0.00   20.00  20.00   0.40

пятница, 28 августа 2015 г.

Создание копии базы

Самый быстрый путь создания копии базы (со структорой, да и с данными тоже)
воспользоваться dbca
и создать темплейт
а потом из этого темплейта создать новую базу

среда, 13 мая 2015 г.

мониторинг бэкапов

Команды RMAN, позволяющие следить за бэкапами

report need backup - список датафайлов требующих наличия резервной копии с заданным параметром redundancy

report unrecoverable; - список файлов которые невосстановимы в случае аварии (отсутсвуют бэкапы)

restore database preview; - проверка процедуры восстановления, показывает список бэкапов в какой очердности они будут накатываться

restore database validate; - проверка валидности бэкапов, на предмет битых блоков.

также проверки на валидность других  файлов необходимых для восстановления
  • RESTORE ARCHIVELOG FROM sequence xx UNTIL SEQUENCE yy THREAD nn VALIDATE;
  • RESTORE CONTROLFILE VALIDATE;
  • RESTORE SPFILE VALIDATE;

Восстановление с инкрементальными копиями

rman> restore database;
rman> recover database NOREDO;

среда, 18 февраля 2015 г.

Скрипт для бэкапа

#!/usr/bin/perl -w
$ENV{"ORACLE_BASE"}='/opt/oracle';
$ENV{"ORACLE_HOME"}='/opt/oracle/product/11.2';
$ENV{"PATH"}="$ENV{ORACLE_HOME}/bin:$ENV{ORACLE_HOME}/lib:$ENV{ORACLE_HOME}/lib32:$ENV{PATH}:.";
$ENV{"LD_LIBRARY_PATH"}="$ENV{'LD_LIBRARY_PATH'}:$ENV{ORACLE_HOME}/lib:$ENV{ORACLE_HOME}/lib32:/lib:/usr/lib";
$ENV{"CLASSPATH"}="$ENV{ORACLE_HOME}/JRE:$ENV{ORACLE_HOME}/jlib:$ENV{ORACLE_HOME}/rdbms/jlib";
my $RMANCMD='rman target /';
my $ARCH_RMAN = <<'EOF';
backup  archivelog all delete all input;
exit;
EOF

my $INCR0_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 0 database;
backup  archivelog all delete all input;
crosscheck archivelog all;
crosscheck backup;
delete noprompt obsolete ;
exit
EOF
my $INCR1_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 1 database;
backup  archivelog all delete all input;
exit
EOF
my $CUM_RMAN = <<'EOF';
sql 'alter system archive log current';
backup incremental level 1 CUMULATIVE database;
backup  archivelog all delete all input;
exit
EOF
my @SID=`lsnrctl status | grep Instance | awk '{print \$2}' | sort | uniq`;
my $sql_rman=q(select 'CNT='||count(1) from V\$RMAN_STATUS WHERE STATUS like 'RUNNING%';);
my $sql_db=q(select 'NAME='||name from V\$DATABASE;);
my $sql_incr0=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 0  AND completion_time>=TRUNC(SYSDATE, 'month'););
my $sql_incr00=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 0 AND completion_time>=TRUNC(CURRENT_DATE););
my $sql_incr1=q(SELECT 'CNT='||COUNT(1)  FROM V\$BACKUP_SET WHERE INCREMENTAL_LEVEL = 1 AND completion_time>=TRUNC(CURRENT_DATE););
foreach my $sid (@SID)
{
    next if ($sid=~/ASM/);
    chomp($sid);
    $sid=~s/\"|\"|,//g;
    print $sid,"\n";
    ### check db name
    $ENV{ORACLE_SID}=$sid;
    `echo "$sql_db" | sqlplus / as sysdba`=~/NAME=(\w.+)/;
    print $1,"\n";
   
    ####check current backup job
    `echo "$sql_rman" | sqlplus / as sysdba`=~/CNT=(\d+)/;
    if ($1 > 0 ) {
exit;
    }
    ####check increment 0 backup exists
    `echo "$sql_incr0" | sqlplus / as sysdba`=~/CNT=(\d+)/;
    ### if incr0 is absent
    if ($1 == 0) {
       rman_job($INCR0_RMAN);
next;
    }
   
    ####check scheduler
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    ###every sunday
    if ($wday == 0 && $hour>4 && $mday<=7) {
    ####check increment 0 backup today exists
    `echo "$sql_incr00" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($INCR0_RMAN);
   next;  
}
    }
    elsif ($wday == 0 && $hour>4){
    `echo "$sql_incr1" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($CUM_RMAN);
   next;  
}
    }
    elsif ($wday>0  && $hour>4 ){
    `echo "$sql_incr1" | sqlplus / as sysdba`=~/CNT=(\d+)/;
if ($1 == 0 ) {
       #increment 0
       rman_job($INCR1_RMAN);
   next;  
}
    }
   
    if ( ( $hour % 3 ) == 0){
rman_job($ARCH_RMAN);
    }
   
}
sub rman_job {
my $scr=shift;
   open(CMD,"| $RMANCMD");
   print CMD $scr;
   close CMD;
}