Sempre defendi a idéia de que não se deve fazer gambiarras, “gambi”, etc. Por isso, passei a utilizar apenas “workarounds” ou também as “adaptações técnicas”. Sabe como é… Tem solução para tudo nesta vida!
Bom, você tem um Oracle Real Application Cluster (RAC) funcionando, já no patch 10.2.0.4, e precisa adicionar um nó neste cluster. Seguindo a documentação da Oracle, após você clonar, registrar, configurar o clusterware, você precisa fazer o mesmo com o Oracle Database Software. Neste momento, é necessário executar o seguinte comando como o usuário oracle em um dos nós já existentes (e que será a base da clonagem) no cluster:
$ORACLE_HOME/oui/bin/addNode.sh -silent CLUSTER_NEW_NODES={tenerife}
Em um dado momento, acontece:
Copying to remote nodes (Wednesday, February 10, 2010 2:13:06 PM BRT)
……………………………………………………………..WARNING:Error while copying directory /u01/db/oracle/product/10.2.0/db_1 with exclude file list ‘/tmp/OraInstall2010-02-10_02-12-40PM/installExcludeFile.lst’ to nodes ‘tenerife’. [PRKC-1002 : All the submitted commands did not execute successfully]
———————————————————————————-
tenerife:
/bin/tar: ./network/log/listener_burela.log: file changed as we read it
———————————————————————————-
Refer to ‘/u01/db/oracle/oraInventory/logs/addNodeActions2010-02-10_02-12-40PM.log’ for details. You may fix the errors on the required remote nodes. Refer to the install guide for error recovery. Click ‘Yes’ if you want to proceed. Click ‘No’ to exit the install. Do you want to continue?
72% Done.
Home copied to new nodes
……………………The Cluster Node Addition of /u01/db/oracle/product/10.2.0/db_1 was unsuccessful.
Please check ‘/tmp/silentInstall.log’ for more details.
E, não tem esse que consiga fazer passar desse estágio.
Bom, dando uma futucada, vi que ele utiliza o tar para enviar os arquivos ao outro nó (com o ps já dá para ver isso). Nesta mensagem, percebe-se que ele utiliza uma exclude list na hora de fazer esta operação.
O que ocorre é que na documentação da Oracle (http://download.oracle.com/docs/cd/B19306_01/em.102/b16227/oui7_cloning.htm#CEGBFJCE), tem informando:
“When archiving the home, also ensure that you skip the *.log, *.dbf, listerner.ora, sqlnet.ora, and tnsnames.ora from archiving.”
Porém, por algum motivo (bug?) estes arquivos não estão na exclude list gerada pelo Oracle Universal Installer! O maior problema, é que esta lista é gerada dinamicamente, com um path que depende da hora de execução do OUI! Ou seja, você não pode alterar na mão. E, o que fazer?
Bom… Existem mil maneiras de preparar neston, e como não achei nenhuma outra forma por aí (se acharem, me avisem), eu inventei a minha. Sigam a minha “adaptação técnica”, ou Workaround, como preferirem (GAMBI NÃO!)
Só explanando o processo, vamos substituir o binário original do tar por um script que vai gravar os parâmetros passados em um arquivo e sai com um exitcode que significa que deu erro e a instalação do node não vai continuar. O objetivo neste momento é capturar a posição em que está o parâmetro que referencia a exclude list.
[oracle@burela bin]$ su -
Password:
[root@burela ~]# cd /bin
[root@burela bin]# mv tar tar.old
[root@burela bin]# cat > tar
#!/bin/bash
echo $* > /tmp/parameters.txt
exit 1
Ctrl-D
[root@burela bin]# chmod a+x tar
[root@burela bin]# su – oracle
[oracle@burela ~]$ cd $ORACLE_HOME/oui/bin
[oracle@burela bin]$ ./addNode.sh -silent CLUSTER_NEW_NODES={tenerife}
Como o exitcode do script que fizemos vai ser diferente de zero, ele vai dar erro. Mas é isso mesmo, pois já pegamos o dado que precisávamos.
[root@burela bin]# cat /tmp/parameters.txt
cf – -X /tmp/installExcludeFile.lst9347tmp ./assistants ./bin ./ccr ./cdata ./cfgtoollogs ./clone ./config ./crs ./css ./ctx ./dbs ./demo ./diagnostics ./has ./hs ./install ./install.platform ./inventory ./javavm ./jdbc ./jdk ./jlib ./jre ./ldap ./lib ./lib32 ./log ./md ./mesg ./network ./nls ./oc4j ./odbc ./olap ./OPatch ./opmn ./oracore ./oraInst.loc ./ord ./oui ./owm ./perl ./plsql ./precomp ./racg ./rdbms ./relnotes ./root.sh ./root.sh.old ./root.sh.old.1 ./shutdown.log ./slax ./sqlj ./sqlplus ./srvm ./startup.log ./sysman ./tg4ifmx ./tg4ingr ./tg4sybs ./tg4tera ./uix ./wwg ./xdk
Note que o path da exclude list é o quarto parâmetro passado para o tar! Usaremos esta informação para alterá-la no momento em que a nova versão do script rodar.
Neste momento, iremos recriar a exclude list antes do tar ser rodado, utilizando a mesma técnica anterior, mas desta vez executando o binário original do tar com os mesmos parâmetros passados pelo script addNode.sh:
[oracle@burela bin] logout
[root@burela bin]# cat > tar
#!/bin/bash
find . -name “*.log” >> $4
find . -name “*.dbf” >> $4
find . -name “listener.ora” >> $4
find . -name “sqlnet.ora” >> $4
find . -name “tnsnames.ora” >> $4
/bin/tar.old $*
exit $?
Ctrl-D
[root@burela bin]# su – oracle
[oracle@burela ~]$ cd $ORACLE_HOME/oui/bin
[oracle@burela bin]$ ./addNode.sh -silent CLUSTER_NEW_NODES={tenerife}
Neste momento, o script deve rodar numa boa e você já poderá continuar a seguir o procedimento oficial da Oracle. Mas, não vamos esquecer de voltar o tar para seu “estado original”.
[root@burela bin]# mv /bin/tar.old /bin/tar
E assim fez-se o mundo!