This post is also available in: English
Durante 3 meses, tive problemas constantes de nós de uma instalação Oracle RAC caindo constantemente. O sistema era o seguinte:
- S.O: Red Hat Enterprise Linux Server release 5.8 (Tikanga) - x86_64
- Kernel: 2.6.18-308.16.1.el5
- VMWare: VMware ESXi 5.0
- Oracle 11.2.0.3 PSU 6
- Oracle homes individuais e discos compartilhados para o RAC via VMFS
Era aleatório, o nó caia e voltava. As vezes a máquina reiniciava pelos processos do Oracle.
Mesmo após reinstação e atualização do Oracle para a última versão e aplicação do último PSU, o problema continuava.
Os logs do alerta e trace do oracle apresentavam o seguinte erro:
ORA-27072: File I/O error Linux-x86_64 Error: 5: Input/output error Additional information: 4 Additional information: 657408 Additional information: -1 WARNING: Read Failed. group:1 disk:0 AU:321 offset:0 size:4096 path:/dev/oracleasm/disks/DATA01 incarnation:0xe968aff8 synchronous result:'I/O error' subsys:System iop:0x7fb195be9000 bufp:0x7fb196117000 osderr:0x0 osderr1:0x0 ERROR: failed to read ACD block gn=1 blk=10752 ORA-15080: synchronous I/O operation to a disk failed WARNING: LGWR failed to read ACDC for diskgroup 1 thread 2 WARNING: disk offlining resulting in I/O error WARNING: Write Failed. group:1 disk:0 AU:321 offset:0 size:4096 path:/dev/oracleasm/disks/DATA01 incarnation:0xe968aff8 asynchronous result:'I/O error' subsys:System iop:0x7fb195be9000 bufp:0x647fd000 osderr:0x534b4950 osderr1:0x0
Pesquisando mais a fundo, encontrei o seguinte erro no log do Redhat /var/log/messages:
Jul 6 19:45:58 oraclesrv01 kernel: sd 1:0:0:0: reservation conflict Jul 6 19:45:58 oraclesrv01 kernel: sd 1:0:0:0: Unhandled error code Jul 6 19:45:58 oraclesrv01 kernel: sd 1:0:0:0: SCSI error: return code = 0x00110018 Jul 6 19:45:58 oraclesrv01 kernel: Result: hostbyte=invalid driverbyte=DRIVER_OK,SUGGEST_OK
Como solução, tentei:
- Montar discos novos, mas o problema se mantém.
- Separar os dados 1 disco DATA e a configuração do cluster e votefiles em 3 discos OCRVOTE.
Nada resolveu. Depois de pesquisar bastante, finalmente descobri a causa do erro.
O VMFS é um sistema de arquivos de cluster que desativa (por padrão) que múltiplas máquinas virtuais abrem e leiam o mesmo disco virtual (arquivo .vmdk). Isso previne que mais de uma máquina virtua acesse inadvertidamente o mesmo arquivo .vmdk.
A opção "multi-writer" permite que os discos VMFS sejam compartilhados por múltiplas máquinas virtuais. Essa opção é usada para permitir "fault tolerance" no VMWare, em casos que os discos precisam ser lidos e escritos simultaneamente.
O artigo do link abaixo ensina o passo a passo para ativar esta opção:
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1034165
Disabling simultaneous write protection provided by VMFS using the multi-writer flag (1034165)
Resumidamente, o que precisa ser feito é editar o arquivo ".vmx" que define as configurações da máquina virtual e adicionar para cada disco a ser compartilhado a seguinte entrada:
scsiX:Y.sharing = "multi-writer"
Se forem 4 discos, as entradas seriam as seguintes:
scsi1:0.sharing = "multi-writer"
scsi1:1.sharing = "multi-writer"
scsi1:2.sharing = "multi-writer"
scsi1:3.sharing = "multi-writer"
Pronto! Agora o seu oracle irá parar de dar error inexplicáveis.
Gostou? Não deixe de comentar ou deixar um 👍!