8 Replies Latest reply on Jan 30, 2018 12:32 AM by L. Fernigrini

    Como actualizar misma tabla en diferentes instancias en diferentes servidores?

    Jorge Contti

      Hola, hace poco tiempo que estoy cumpliendo el rol de DBA en la empresa para la cual trabajo y no tengo mucha experiencia, mi consulta es la siguiente...
      Tenemos alrededor de 20 instancias en distintos servidores y en su mayoría con distintos nombres. El otro día me paso lo siguiente:
      Tuve que agregar en una tabla llamada SITUACION_LAB un campo, ok fácil, pero ese campo lo tuve que replicar en las 19 instancias restantes, lo que hice fue entrar a través de sqldeveloper a todas y ejecutar el ALTER TABLE en cada conexión.
      Mi consulta es de que manera puedo mejorar este proceso.

       

      Espero haber sido claro, desde ya les agradezco la molestia que se toman en leer esto.

        • 1. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
          L. Fernigrini

          Dependiendo de la plataforma en la que trabajes (Windows o Unix/Linux) podrías armar un archivo de comando que te permita ejecutar un script contra distintas bases de datos.

           

          Dependiendo también de la política de seguridad (si cada DB tiene usuarios con contraseñas distintas, lo cual seria lógico) tendrías que ingresar el usuario o contraseña de cada una de las bases de datos.

           

          Como idea general:

           

          Unix/Linux

          https://easyoradba.com/2015/01/20/running-sql-script-for-multiple-databases-sqlplus-mutiple-servers-sqlplus-in-hhell-scr…

           

          Windows

          https://stackoverflow.com/questions/20546296/execute-sql-script-on-multiple-oracle-dbs

           

          En ambos casos, sacaría el usuario/contraseña, y mostraría el nombre de la instancia antes de ejecutar SQL*Plus, teniendo que ingresar el usuario y contraseña para cada instancia.

           

          Si podes compartir mas detalles (plataforma, etc.) vemos de ir mejorando los scripts :-)

          1 person found this helpful
          • 2. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
            Jorge Contti

            Hola L. Fernigrini, ante que todo quiero agradecerte por tomarte el tiempo de contestarme.

             

            Te comento un poco más para que tengas un mejor panorama, el sistema operativo de mi máquina es Windows 10, las instancias mayormente están en windows server 2008 y 2012. La versión de Oracle es 11g R2  para todos.

             

            Estuve viendo los links que me enviaste y han sido de gran utilidad, tenía la idea en mente pero no la podía terminar de cerrar.

            Podríamos decir que tendré que hacer lo siguiente:

             

            1° Crear un archivo tsnames.ora con todas las conexiones.

            digamos que con las conexiones a las siguientes intancias:

             

            sid: TEST1    - -    user: usr1     --     pass: pw1

            sid: TEST2    - -    user: usr2     --     pass: pw2

             

             

            2° Crear un script .sql que contenga la sentencia a ejecutar llamado "sentencia.sql", ejemplo:

             

            ALTER TABLE nom_table

            ADD ( nom_column   NUMBER(1)  );

             

             

            3° Crear un .bat llamado "ejecuta_sentencia.bat" el cual va a tener que conectarse a cada instancia que tenga mi tnsnames.ora y ejecutar el script realizado anteriormente llamado "sentencia.sql", esto seria algo así:

             

            sqlplus usr1/pw1@TEST1 @sentencia.sql
            sqlplus usr2/pw2@TEST2 @sentencia.sql

             

             

            En ambos casos, sacaría el usuario/contraseña, y mostraría el nombre de la instancia antes de ejecutar SQL*Plus, teniendo que ingresar el usuario y contraseña para cada instancia.

            Esto lo dices para seguir una política de seguridad y que no estén los usuarios y contraseñas escritos?

             

            • 3. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
              L. Fernigrini

              1) Si, necesitas tener todas las conexiones en un unico archivo TNSNAMES.

              2) Si, tener un unico script con todas las sentencias SQL que necesitas ejecutar, por ejemplo "Ejecutar.sql"

              3) Tendria dos archivos bat. En el primer bat, deberias tener algo asi:

               

              @echo off
              FOR %%A IN (SID1 SID2 SID3) DO ejecutar.bat %%A

               

              El segundo archivo bat (ejecutar.bat) tendria algo asi:

               

              #Limpiamos la pantalla

              cls

              #mostramos a que base de datos nos conectamos

              echo %1

              # Nos conectamos a la DB, pidiendo la contraseña en cada caso.

              # AUnque usemos el mismo usuario, no deberian tener la misma contraseña en cada instancia.

              sqlplus -S user@%1 @Ejecutar.sql

               

              %1 es el valor del primer parametro que recibe el segundo archivo bat, el cual es %%A en el primer bat, el cual no es mas que cada uno de los valores de IN (SID1, SID2, SID3...)

               

              Yo investigaria el comando FOR, tiene formas de hasta leer el contenido de un archivo, por lo que con algo de trabajo podrias hacer que automaticamente lea las entradas del TNSNAMES, sin tener que repetirlas en la cluasula "IN (SID1 SID2 SID3)"

               

              https://stackoverflow.com/questions/1355791/how-do-you-loop-in-a-windows-batch-file

              1 person found this helpful
              • 4. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
                L. Fernigrini

                Esto me esta funcionando. El contenido de cada archivo esta despues de su nombre entre corchetes

                 

                 

                [MULTIDB.BAT]

                FOR %%G IN (XE PRUEBA1 PRUEBA2) DO ejecutar.bat %%G

                 

                [EJECUTAR.BAT]

                @ECHO OFF

                CLS

                ECHO ////////////////////////////////

                ECHO Conectando a %1

                ECHO ////////////////////////////////

                SQLPLUS system@%1 @SENTENCIAS.SQL

                REM Solo para ver los efectos del script anterior, eliminar luego de probar.

                PAUSE

                 

                [SENTENCIAS.SQL]

                SELECT * FROM DUAL;

                QUIT;

                 

                Con este modelo, el script corre siempre con el mismo usuario pero pide la contraseña (porque no deberia ser la misma en cada entorno).

                 

                 

                Si se necesita tener distintos nombres de usuario/contraseña y no ingresarlos manualmente, se puede poner todo en un archivo  (con el riesgo que eso conlleva)

                 

                [MULTIDB2.BAT]

                FOR /F "tokens=1,2,3" %%G IN (DATOS.txt) DO EJECUTAR2.bat %%G %%H %%I

                 

                [EJECUTAR2.BAT]

                @ECHO OFF

                CLS

                ECHO ////////////////////////////////

                ECHO Conectando a %1

                ECHO ////////////////////////////////

                SQLPLUS %2/%3@%1 @SENTENCIAS.SQL

                REM Solo para ver los efectos del script anterior

                PAUSE

                 

                [DATOS.TXT]

                db1 usr1 pwd1

                db2 usr2 pwd2

                1 person found this helpful
                • 5. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
                  Jorge Contti

                  Lo único que tengo para decir es FANTÁSTICO, sin dudas todo lo que me has explicado ha sido increíblemente útil.
                  Tendría algunos inconvenientes en aplicarlo al 100% porque lamentablemente las personas que crearon las instancias utilizaron en la mayoría el mismo nombre de instancia, pero bueno gracias a esos errores sigo aprendiendo. Tendré que arreglar eso primero para sacarle el máximo provecho a lo que me has escrito.

                   

                  Realmente agradezco el tiempo que has dedicado para ayudarme!

                  • 6. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
                    L. Fernigrini

                    De nada!

                     

                    El nombre de la instancia ("service_name") no deberia afectarte en lo mas minimo, lo importante es como lo llamas al servicio en el archivo TNSNAMES ("net_service_name").

                     

                    Example 6-1 Basic Format of tnsnames.ora File

                    net_service_name= (DESCRIPTION= (ADDRESS=(protocol_address_information)) (CONNECT_DATA= (SERVICE_NAME=service_name))) 

                     

                    Por ejemplo, si hay tres instancias VENTAS en tres servidores distintos (desarrollo / test / produccion) tu archivo TNSNAMES deberia tener algo asi:

                     

                     

                    VENTAS.DESA =

                      (DESCRIPTION =

                        (ADDRESS = (PROTOCOL = TCP)(HOST = ServerDESA)(PORT = 1521))

                        (CONNECT_DATA =

                          (SERVER = DEDICATED)

                          (SERVICE_NAME = ventas)

                        )

                      )

                     

                    VENTAS.TEST =

                      (DESCRIPTION =

                        (ADDRESS = (PROTOCOL = TCP)(HOST = ServerTEST)(PORT = 1521))

                        (CONNECT_DATA =

                          (SERVER = DEDICATED)

                          (SERVICE_NAME = ventas)

                        )

                      )

                    VENTAS.PROD =

                      (DESCRIPTION =

                        (ADDRESS = (PROTOCOL = TCP)(HOST = ServerPROD)(PORT = 1521))

                        (CONNECT_DATA =

                          (SERVER = DEDICATED)

                          (SERVICE_NAME = ventas)

                        )

                      )

                     

                    O podes usar nombres mas cortos, como VTAPRD, VTATST, VTADES, mientras que sea un nombre valido el mismo no tiene por que ser el mismo que el de la instancia.

                     

                    Pegale una buena leida a la ayuda sobre el archivo TNSNAMES para entender como funciona.

                     

                    https://docs.oracle.com/cd/B28359_01/network.111/b28317/tnsnames.htm#NETRF007

                     

                     

                    Es mas, hasta podes tener mas de un nombre de servicio de red para el mismo servicio:

                     

                     

                    alias1,alias2, alias3 =

                     

                      (DESCRIPTION=

                         (ADDRESS=(PROTOCOL=tcp)(HOST=host1)(PORT=1521))

                         (CONNECT_DATA=

                            (SERVICE_NAME=service_name)

                         )

                      )

                     

                    https://blog.vishalgupta.com/2012/07/05/comma-separated-multiple-tnsalias-for-single-entry/

                     

                    En ese caso, usando alias1, alias2 o alias3 como nombre de servicio de red en una conexion (sqlplus user/pwd@alias1) enlos tres casos se conectan a la misma base de datos.

                    1 person found this helpful
                    • 7. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
                      Jorge Contti

                      Lisandro,

                       

                      Probé y funciono todo a la perfección. Nuevamente te agradezco por tomarte el tiempo de resolver mis dudas.

                       

                      Seguramente me surgirán muchísimas dudas más con respetos a otros temas, ojala siempre me contestes jaja

                       

                      ¡GRACIAS!

                      • 8. Re: Como actualizar misma tabla en diferentes instancias en diferentes servidores?
                        L. Fernigrini

                        Primero que todo, de nada! Es la idea de los foros, colaborar y aprender.

                         

                        En este caso en particular, me enganché con la idea de repasar algunos temas de scripts en archivos batch y me dieron ganas de probar, en otros casos a lo mejor no estoy tan inspirado, pero seguramente alguien mas de la comunidad colaborará.