{"id":50,"date":"2020-01-03T01:00:30","date_gmt":"2020-01-03T01:00:30","guid":{"rendered":"http:\/\/168.138.249.13\/?p=50"},"modified":"2020-08-06T03:31:45","modified_gmt":"2020-08-06T03:31:45","slug":"criando-um-standby-manual-no-oracle","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2020\/01\/03\/criando-um-standby-manual-no-oracle\/","title":{"rendered":"Criando um Standby manual no Oracle"},"content":{"rendered":"\n<p>As vezes precisamos realizar a replica\u00e7\u00e3o de um banco de dados muito grande para outro servidor, nesse tipo de cen\u00e1rio uma das melhores ferramentas seria o uso do Data Guard mas como pode ser visto, essa op\u00e7\u00e3o n\u00e3o contempla a vers\u00e3o Standard:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/oM9FyCM.png\" alt=\"enter image description here\"\/><\/figure>\n\n\n\n<p>Uma op\u00e7\u00e3o seria realizar um backup e de forma manual realizar o recover de tempos em tempos para manter os ambientes sincronizados, esse script que compartilho agora serve para facilitar um pouco esse trabalho.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Nota: Nesse artigo n\u00e3o vou cobrir a cria\u00e7\u00e3o e restaura\u00e7\u00e3o do backup, vamos supor que isso j\u00e1 tenha sido realizado.<\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prepara\u00e7\u00e3o-do-ambiente\">Prepara\u00e7\u00e3o do ambiente<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pacotes\">Pacotes<\/h3>\n\n\n\n<p>Voc\u00ea vai precisar instalar em ambos os servidores o programa rsync caso ele n\u00e3o esteja instalado, nas distribui\u00e7\u00f5es baseadas em Red Hat (CentOS, Oracle Linux..) voc\u00ea pode usar o seguinte comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yum install rsync -y\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"estabelecer-confian\u00e7a-entre-as-m\u00e1quinas\">Estabelecer confian\u00e7a entre as m\u00e1quinas<\/h3>\n\n\n\n<p>O ideal \u00e9 que a rela\u00e7\u00e3o de confian\u00e7a ssh entre as m\u00e1quina seja configurada para que voc\u00ea n\u00e3o precise digitar a senha do usu\u00e1rio do sistema operacional toda vez que o script executar.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"na-m\u00e1quina-de-destino-executar-os-seguintes-comandos\">Na m\u00e1quina de destino executar os seguintes comandos<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Caso voc\u00ea j\u00e1 possua uma chave publica criada, n\u00e3o execute esse comando pois ele vai sobrescrever a que voc\u00ea j\u00e1 possui<\/p><\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t rsa   \n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/6AgOT0r.png\" alt=\"enter image description here\"\/><\/figure>\n\n\n\n<p>Copiar a chave para o servidor de origem:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-copy-id oracle@ip-producao  A partir desse momento voc\u00ea pode se conectar do servidor de destino para o de origem sem precisar de senha.\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tnsnamesora\">tnsnames.ora<\/h3>\n\n\n\n<p>Ap\u00f3s isso, devemos configurar duas entradas no tnsnames.ora para que seja poss\u00edvel verificar se os ambientes est\u00e3o sincronizados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DB_PRD =\n (DESCRIPTION = \n    (ADDRESS_LIST =\n         (ADDRESS = (PROTOCOL = TCP)(HOST = db-orig)(PORT = 1521))\n\t    )\n\t     (CONNECT_DATA =\n\t        (SERVICE_NAME = dborcl)\n\t\t )\n\t\t )\n\t\t \nDB_STBY =\n  (DESCRIPTION = \n     (ADDRESS_LIST =\n          (ADDRESS = (PROTOCOL = TCP)(HOST = db-dest)(PORT = 1521))\n\t     )\n\t      (CONNECT_DATA =\n\t         (SERVICE_NAME = dborcl)\n\t\t  )\n\t\t  )\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"vari\u00e1veis-de-ambiente\">Vari\u00e1veis de ambiente<\/h3>\n\n\n\n<p>Voc\u00ea precisa criar um arquivo com as seguintes vari\u00e1veis de ambiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export DIR_PRD=\/backup\/oracle\/archive #Diret\u00f3rio de origem\nexport DIR_STD=\/backup\/oracle\/archive #Diret\u00f3rio de destino\nexport CLIENTE=\"XXXX\"\nexport IP_PRD=192.168.10.180  #IP do servidor de origem\nexport IP_STD=192.168.10.183  #IP do servidor de destino\nexport DATA=$(date +\"%Y%m%d\")\nexport HORA=$(date +\"%T\")\nexport LOG_DIR=\/home\/oracle\/$CLIENTE\/logs\nexport LOG_FILE=standby-$ORACLE_SID-$DATA\nexport SYS_PASSWD=SENHA_DO_USUARIO_SYS\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Recomendo que ele seja criado no diret\u00f3rio \/home\/oracle\/scripts\/ com o nome env$ORACLE_SID, caso crie em outro diret\u00f3rio voc\u00ea precisa ajustar a linha 51 do script.<\/p><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"execu\u00e7\u00e3o-do-script\">Execu\u00e7\u00e3o do script<\/h3>\n\n\n\n<p>O script deve ser executado na m\u00e1quina de destino passando o $ORACLE_SID do banco que voc\u00ea deseja sincronizar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"o-script\">O Script<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash<br><br>#####################################<br>#Manual Standby<br>#First setup ssh trust between the two hosts<br>#You will need rsync installed on both servers<br>#Create an file on \/home\/oracle\/scripts\/ with the name env$ORACLE_SID.sh with enviroinment variables (ORACLE_HOME, ORACLE_SID,PATH)<br>#Create two tnsnames.ora entry:<br><br>#DB_PRD =<br># (DESCRIPTION = <br># &nbsp; &nbsp;(ADDRESS_LIST =<br># &nbsp; &nbsp; &nbsp; &nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = db-orig)(PORT = 1521))<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(CONNECT_DATA =<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (SERVICE_NAME = dborcl)<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)<br><br><br>#DB_STBY =<br># &nbsp;(DESCRIPTION = <br># &nbsp; &nbsp; (ADDRESS_LIST =<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(ADDRESS = (PROTOCOL = TCP)(HOST = db-dest)(PORT = 1521))<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (CONNECT_DATA =<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(SERVICE_NAME = dborcl)<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br><br><br><br><br>#After that, fill the variaveis() function with the correct information for your enviroinment<br>#Give execute permission: chmod +x standby.sh<br>#How to run the script: standby.sh ORACLE_SID <br>#Created by Adriano Tanaka 12\/15\/2019 adriano.tanakaa@gmail.com<br><br><br>script_name=$(basename -- \"$0\")<br><br>if pidof -x \"$script_name\" -o $$ &gt;\/dev\/null;then<br>&nbsp; &nbsp;echo \"An another instance of this script is already running!\"<br>&nbsp; &nbsp;exit 1<br>fi<br><br><br>export ORACLE_SID=$1<br>variaveis(){<br><br>&nbsp; &nbsp; &nbsp; &nbsp; . \/home\/oracle\/accerte\/env$ORACLE_SID.sh<br><br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### Variaveis carregadas: \"<br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### SID: \" $ORACLE_SID<br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### ORIGEM: \" $DIR_PRD<br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### DESTINO: \" $DIR_STD<br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### IP PRD: \" $IP_PRD<br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### IP STD: \" $IP_STD<br>&nbsp; &nbsp; &nbsp; &nbsp; echo \"### RETENCAO: \" $RETENCAO<br>}<br><br>rsync_prd(){<br><br>&nbsp; &nbsp; &nbsp; &nbsp; rsync &nbsp;-azvh $IP_PRD:$DIR_PRD\/ $DIR_STD\/ --partial-dir=$DIR_STD\/partial\/ --progress --ignore-existing &nbsp;<br><br>}<br><br>cataloga() {<br><br>rman target=\/ &lt;&lt; EOF<br>RUN {<br>&nbsp; catalog start with '\\$DIR_STD' noprompt;<br>}<br>EXIT;<br>EOF<br><br><br>}<br><br><br>recupera_se(){<br><br>rman target=\/ &lt;&lt; EOF<br>RUN {<br>&nbsp; recover database;<br>&nbsp; }<br>EXIT;<br>EOF<br>}<br><br><br>recupera_ee(){<br><br>rman target=\/ &lt;&lt; EOF<br>RUN {<br>&nbsp; allocate CHANNEL c1 DEVICE TYPE DISK;<br>&nbsp; allocate CHANNEL c2 DEVICE TYPE DISK;<br>&nbsp; allocate CHANNEL c3 DEVICE TYPE DISK;<br>&nbsp; allocate CHANNEL c4 DEVICE TYPE DISK;<br>&nbsp; recover database;<br>&nbsp; }<br>EXIT;<br>EOF<br>}<br><br>runsql () {<br>sqlplus -S \/nolog &lt;&lt; EOF<br>CONNECT $1 as sysdba;<br>whenever sqlerror exit sql.sqlcode;<br>SET &nbsp; &nbsp; &nbsp;pagesize 0<br>SET &nbsp; &nbsp; &nbsp;heading OFF<br>SET &nbsp; &nbsp; &nbsp;feedback OFF<br>SET &nbsp; &nbsp; &nbsp;verify OFF<br>set &nbsp; &nbsp; echo off<br>$2<br>exit;<br>EOF<br>}<br><br><br>compara () {<br>ULT_STBY=$(runsql sys\/$SYS_PASSWD@DB_STBY &nbsp;\"select max (sequence#) from v\\$archived_log where APPLIED='YES' ;\")<br>ULT_PRD=$(runsql sys\/$SYS_PASSWD@DB_PRD &nbsp;\"select max (sequence#) from v\\$log_history;\")<br><br>diferenca=$(($ULT_PRD-$ULT_STBY))<br>echo $diferenca<br><br><br>}<br><br><br>variaveis<br><br>echo ----------------------------------------------------------------<br>echo \"### Iniciando recuperacao do do banco \" $ORACLE_SID \" \" $DATA $HORA<br>echo \"### Iniciando recuperacao do do banco \" $ORACLE_SID \" \" $DATA $HORA &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo ----------------------------------------------------------------<br>echo \"### Copiando archives de \" $IP_PRD:$DIR_PRD \" \" &nbsp;$DATA $HORA<br>echo \"### Copiando archives de \" $IP_PRD:$DIR_PRD \" \" &nbsp;$DATA $HORA &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>rsync_prd &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo ----------------------------------------------------------------<br>echo \"### Catalogando archives copiados\" \" \" &nbsp;$DATA $HORA<br>echo \"### Catalogando archives copiados\" \" \" &nbsp;$DATA $HORA &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo ----------------------------------------------------------------<br>cataloga &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo \"### Aplicando archives \" \" \" &nbsp;$DATA $HORA<br>echo \"### Aplicando archives \" \" \" &nbsp;$DATA $HORA &nbsp;&gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo ----------------------------------------------------------------<br>recupera_se &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>#recupera_ee &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo \"### Archives aplicados \" \" \" &nbsp;$DATA $HORA<br>echo \"### Archives aplicados \" \" \" &nbsp;$DATA $HORA &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo ----------------------------------------------------------------<br>echo \"### Diferenca \" $compara &nbsp;\" \" &nbsp;$DATA $HORA &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo \"### Diferenca \" $compara &nbsp;#\" -- \" &nbsp;$DATA $HORA &gt;&gt; $LOG_DIR\/$LOG_FILE.log<br>echo ----------------------------------------------------------------<br>compara &gt;&gt; &nbsp;$LOG_DIR\/$LOG_FILE.log<br>compara<br>echo ----------------------------------------------------------------<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>As vezes precisamos realizar a replica\u00e7\u00e3o de um banco de dados muito grande para outro servidor, nesse tipo de cen\u00e1rio uma das melhores ferramentas seria o uso do Data Guard mas como pode ser visto, essa op\u00e7\u00e3o n\u00e3o contempla a vers\u00e3o Standard: Uma op\u00e7\u00e3o seria realizar um backup e de forma manual realizar o recover [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[6,1],"tags":[5,4,3],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-oracle","category-uncategorized","tag-banco-de-dados","tag-database","tag-oracle"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":1,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"predecessor-version":[{"id":51,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/50\/revisions\/51"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}