quinta-feira, 9 de junho de 2016

Logins

Com quase dois milhões de logins registrados no meu log, resolvi verificar em quais horários as pessoas estão mais alertas e erram menos suas senhas.

Os resultados foram surpreendentes.

Hora Erros/Sucessos Total de tentativas
00 10,48 7270
01 36,94 7551
02 97,12 7163
03 104,19 6522
04 440,07 6175
05 73,77 6281
06 8,46 6928
07 0,52 45142
08 0,42 169947
09 0,47 209327
10 0,47 223268
11 0,47 175897
12 0,47 79421
13 0,42 163371
14 0,45 200312
15 0,44 187376
16 0,43 164907
17 0,51 75282
18 0,83 27162
19 1,61 14589
20 2,12 12932
21 2,52 12246
22 2,77 11047
23 4,24 8708

As primeiras horas da manhã não são as melhores horas para trabalhar. Eu não faria testes numa usina nuclear nestas horas. Os 440 erros para cada sucesso às 4h da manhã são deveras surpreendentes. Imagino que as pessoas tentem uma vez ou outra e simplesmente desistam, resolvendo esperar o sol aparecer.

Excluindo os IPs suspeitos (e devidamente bloqueados), a situação melhora um tanto.

Hora Erros/Sucessos Total de tentativas
00 6,11 4504
01 23,01 4779
02 58,9 4373
03 59,19 3732
04 244,64 3439
05 41,07 3534
06 4,7 4173
07 0,43 42420
08 0,4 167186
09 0,45 206585
10 0,45 220532
11 0,44 173169
12 0,42 76697
13 0,4 160585
14 0,43 197555
15 0,42 184612
16 0,4 162143
17 0,45 72495
18 0,65 24442
19 1,13 11882
20 1,46 10194
21 1,73 9517
22 1,82 8274
23 2,56 5919

As melhores horas foram 8h, quando presumo que as pessoas estejam começando a jornada, e 13h, quando presumo que estejam voltando do almoço.

Visando encontrar algum sentido nos números da madrugada, excluí todas as linhas relativas a tentativas vindas de IPs dos quais nunca houve um login com sucesso.

Hora Erros/Sucessos Total de tentativas
00 0,81 1155
01 4,54 1108
02 6,23 528
03 0,72 107
04 2,64 51
05 1,07 174
06 0,26 929
07 0,32 39324
08 0,37 164102
09 0,42 203523
10 0,42 216503
11 0,41 169326
12 0,35 73287
13 0,35 156826
14 0,39 193020
15 0,38 180017
16 0,36 157655
17 0,37 68708
18 0,41 20924
19 0,49 8317
20 0,57 6521
21 0,54 5365
22 0,49 4368
23 0,45 2426

Com isto, os números da madrugada revelam que há muitos engraçadinhos tentando entrar onde não deviam.

quarta-feira, 1 de junho de 2016

Ajustando tablespaces com facilidade

Uma tarefa recorrente na manutenção de um banco de dados Oracle é o de colocar objetos nos tablespaces corretos. Para facilitar o trabalho, recorri ao metadados. A rotina abaixo procura todas as tabelas, todos os índices e todos os LOBs de um schema e verifica se estão nos tablespaces indicados.

create or replace procedure 
  ajustar_tablespaces(p_schema varchar2, 
                      p_table_ts varchar2, 
                      p_index_ts varchar2, 
                      p_lob_ts varchar2) is
begin

  --Indices
  for r in 
   (select 'alter index '||p_schema||'.'|| index_name 
         ||' rebuild tablespace '||p_index_ts cmd 
    from all_indexes
    where owner=upper(p_schema) 
      and tablespace_name<>upper(p_index_ts))
  loop
    dbms_output.put_line(r.cmd);
    execute immediate r.cmd;
  end loop;

  --Tabelas
  for r in 
   (select 'alter table '||p_schema||'.'||table_name
         ||' move tablespace '||p_table_ts cmd 
    from all_tables 
    where owner=upper(p_schema) 
      and tablespace_name<>upper(p_table_ts))
  loop
    dbms_output.put_line(r.cmd);
    execute immediate r.cmd;
  end loop;

  --LOBs
  for r in 
   (select 'alter table '||p_schema||'.'||table_name
         ||' move lob('||column_name||') store as (TABLESPACE '||p_lob_ts||')' cmd 
    from all_lobs 
    where owner=upper(p_schema) 
      and tablespace_name<>upper(p_lob_ts))
  loop
    dbms_output.put_line(r.cmd);
    execute immediate r.cmd;
  end loop;
  
  --Reconstroi os indices
  for r in 
   (select 'alter index '||p_schema||'.'||index_name
         ||' rebuild' cmd  
    from all_indexes 
    where owner=p_schema 
      and status='UNUSABLE') 
  loop
    dbms_output.put_line(r.cmd);
    execute immediate r.cmd;
  end loop;

end;
Então, para corrigir os tablespaces dos objetos de um schema, eu poderia fazer uma chamada como esta:

  exec ajustar_tablespaces('INFO', 'ts_data01', 'ts_index02', 'ts_lobs');

Os comandos são sendo impressos para que se possa acompanhar o andamento do trabalho, principalmente se os objetos forem grandes.