impdp/expdp en 19c sin password

Uno de los problemas que podemos encontrarnos en la 19c es que cuando intentamos ejecutar un expdp en modo comando en el que tenemos seteado el usuario y la contraseña (o ocmo sysdba0 , el exdp quea detenido preguntando por el password.

Aunque pueda pareceerlo, esto no es una nueva funcionalidad de seguridad de la 19c, sino que esta provocado por un bug no publicado (bug 28707931 ) que afecta a la 19c

Desgraciadamente , las soluciones que nos da oracle no son nada del otro mundo

  • Acutualiza a 20.1 cuando este disponible
  • Aplica el parche Patch: 28707931 si puedes
  • Pulsa ua tecla para pasar la fase de passowd

Como siempre, mas informacion en soporte Oracle

  • Data Pump Prompts For A Password Even Though Using External Authentication (Doc ID 2556152.1)
  • Creación de Discos y ASM con Ansible

    Siguiendo con las entradas de Aprovisionamiento de una base de datos con ansible vamos a ver la manera de automatizar la configuracion de discos de ASM mediante ansible.

    Supongamos tenemos los prerrequisitos:

    • Un servidor OEL7 con el CRS instalado y el listener en marcha tal y como explicabamos en Instalando el grid infraesturcure con Ansible
      • Dos discos para nuestro diskgroup DATA
      • un disco para nuestro diskgroup FRA
      • un disco para nuestro diskgroup REDO1
      • un disco para nuestro diskgroup REDO2

          Para la ejecucion de nuestro taller de creacion de asm usaremos los siguientes ficheros del repositorio

          Raiz
          |
          |- vars:
               |- oracle_standard.yaml      Fichero con los estandares del departamento
          |
          |- templates
          |
           |- files
           |-REQ01_asm_create_disks.yaml  Ejemplo de informacon de  provisionamiento de discos para el ASM 
          |  
          | asmlib_configure.yaml         Playbook que configura el asmlib
          | asmlib_create_disks.yaml      Playbook que configura los discos de ASM 
          | asm_create.yaml               Playbook que crea una instancia +ASM con en el GRID y con los discos previamente instalados
          

          Ficheros de variables

          Al igual que en el resto de ejecuciones del taller vamos a necesitar el fichero oracle_standard.yaml que contiene todas la estandarizacion de nuestro departamento

          Ficheros informacion

          La creacion de discos necesita de la informacion de que discos del sistema operativo van a ir dedicados a que diskgroup, esta informacion la depositaremos en el directorio files, que va a ser el unico directorio donde deberemos/podremos modificar los ficheros .

          El formato del fichero sera el de una lista en yaml en el que indicaremos el nombre del dispositivo para cada uno de los diskgroups.
          [code lang=»py»]
          DATA:
          – /dev/sda
          – /dev/sdb
          FRA:
          – /dev/sdc
          REDO1:
          – /dev/sdd
          REDO2:
          – /dev/sde
          [/code]

          El nomre del fichero sera [REQ]_asm_create_disks. Donde REQ es el valor en mayusculas de la variable req que es el identificador unico de nuestro fichero, este identificador en un entorno de produccion real podria corresponderse con el numero de peticion del sistema gestion de la compañia.

          Creacion de los discos

          Una vez tenemos claros los ficheros de fuentes y variables ejecutaremos nuestros playbooks.

          asmlib_configure.yaml

          El playbook asmlib_configure.yaml vieje a ser el equialente a la ejecucion manual de oracleasm configure -i
          Como podeis ver en el codigo que es bastante basico, ejecuta la configuracion del oracleasm para cada uno de los campos obteniendo la informacion del fichero de variables generico

          [code lang=»py»]
          # Pamplona 2019
          # Playbook which configures_asmlib
          #
          # requires
          # env: name of the server which should be in the inventory
          # vars/oracle_standard.yaml configuration file with all the deppartment values

          – hosts: "{{env}}"
          remote_user: ansible
          become: yes
          become_user: root
          tasks:
          – fail: msg="Error no server definied, please define the env variable in the job"
          when: env is not defined

          – name: "Including standard variables"
          include_vars:
          file: "vars/oracle_standard.yaml"
          – name: configirando usuario
          command: /usr/sbin/oracleasm configure -u "{{oracle_user}}"

          – name: configurando grupo
          command: /usr/sbin/oracleasm configure -g "{{oracle_group}}"

          – name: seteamos al arranque
          command: /usr/sbin/oracleasm configure -e

          – name: activamos el logical block
          command: /usr/sbin/oracleasm configure -b

          – name: arrancamos
          command: /usr/sbin/oracleasm init

          – name: estado
          command: /usr/sbin/oracleasm status
          register: oasm_status

          [/code]

          asmlib_create_disks.yaml

          El segundo paso es la creacion de los discos en el asmlib .
          Este es el playbook que va a requerir de ese fichero externo [REQ]_asm_create_disks, para cada uno de los discos fisios incluidos.

          [code lang=»py»]
          # Pamplona 2019
          # Playbook which checks if the hosts has all the requested prerequisites
          #
          # requires
          # env: name of the server which should be in the inventory
          # REQ: number of request
          # vars/oracle_standard.yaml configuration file with all the department values

          – hosts: "{{env}}"
          remote_user: ansible
          become: yes
          become_user: root
          tasks:
          – fail: msg="Error no server definied, please define the env variable or de request number in the job"
          when: env is not defined or req is not defined

          – name: "Including standard variables"
          include_vars:
          file: "vars/oracle_standard.yaml"

          – name: "Including So {{version}} requisites"
          include_vars:
          file: "files/{{req|upper}}_asm_create_disks.yaml"

          – name: creating DATA disks
          shell:
          cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_DATA0{{ansible_loop.index}} -s {{item}} -a force=yes "
          loop: "{{DATA}}"
          loop_control:
          extended: yes

          – name: Creating FRA disks
          shell:
          cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_FRA0{{ansible_loop.index}} -s {{item}} -a force=yes "
          loop: "{{FRA}}"
          loop_control:
          extended: yes

          – name: Creating REDO1 disks
          shell:
          cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_REDO1_{{ansible_loop.index}} -s {{item}} -a force=yes "
          loop: "{{REDO1}}"
          loop_control:
          extended: yes

          – name: Creating REDO2 disks
          shell:
          cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_REDO2_{{ansible_loop.index}} -s {{item}} -a force=yes "
          loop: "{{REDO2}}"
          loop_control:
          extended: yes

          – name: scanning disks
          shell:
          cmd: "/usr/sbin/oracleasm scandisks"

          [/code]
          debilidades
          -Como curiosidad podeis ver que en mi taller no sigo las normativa de oracle, llamando a los diskgroups HOSTNAME_DATA en ved de DATA y manteniendo 2 grupos de REDO en ved e uno.
          -Este playbook solamente puede usarse para provisionamiento y no para añadir nuevos discos a un diskgroup ya exsistente ya que numerara los discos empezando desde cero. (uso del fact ansible_loop.index)

          Creacion del asm

          Llegados a este punto, tenemos el grid corriendo, el listener arriba y los dispositivos creados , por lo que solamente nos queda el crear el ASM
          El siguiente playbook simplemente va a llevar a cabo una creacion del ASM en modo command line silent y añadirle los discos a sus respectivos diskgroups

          [code lang=»py»]
          # Pamplona 2020
          # Playbook which creates a database
          #
          # requires
          # env: name of the server which should be in the inventory
          # vars/oracle_standard.yaml standard values for Oracle
          #

          – hosts: "{{env}}"
          vars:
          type: asm
          remote_user: ansible
          tasks:

          # checking prerequisites
          – fail:
          msg: "Error no server defined, please define the env variable in the job"
          when: env is not defined

          # Loading env
          – name: Including Standard_values
          include_vars:
          file: "vars/oracle_standard.yaml"

          – name: checking oratab
          shell:
          cmd: "cat /etc/oratab|grep +ASM |sed -e ‘s/# line added by Agent/ /g’ -e ‘s/:/ /g’|awk ‘{ print $1}’ "
          register: count

          – fail:
          msg: "ERROR: The chain {{item}} exists at {{env}} /etc/oratab file "
          when: item == "+ASM"
          with_items:
          – "{{count.stdout_lines}}"

          – set_fact:
          oracle_home: "{{oracle_home_directory.asm}}"
          when: type == ‘asm’

          – name: Creating syslog file
          copy:
          dest: /etc/rsyslog.d/30-oracle.conf
          content: |
          "local0.info {{oracle_home}}/rdbms/audit/asmaudit.log
          &~"
          force: yes
          become: yes
          become_user: root

          – name: Creating logrotate file
          copy:
          dest: /etc/logrotate.d/30-oracle_logs
          content: |
          "{{oracle_home}}/rdbms/audit/asmaudit.log {
          weekly
          rotate 4
          compress
          copytruncate
          delaycompress
          notifyempty
          }"
          force: yes
          become: yes
          become_user: root

          – name: create ASM
          become: yes
          become_user: "{{oracle_user}}"
          shell:
          cmd: "{{ oracle_home }}/bin/asmca -silent
          -configureASM
          -sysAsmPassword {{sysasm_passd}}
          -asmsnmpPassword {{asmdbsnmp_passwd}}
          -diskString \"/dev/oracleasm/disks/*\"
          -diskGroupName {{oracle_hostname|upper}}_DATA
          -disk \"/dev/oracleasm/disks/{{oracle_hostname|upper}}_DATA*\"
          -param ASM_POWER_LIMIT=1
          -param DIAGNOSTIC_DEST={{oracle_base}}
          -param AUDIT_SYSLOG_LEVEL=’local0.info’
          -param AUDIT_SYS_OPERATIONS=TRUE
          -redundancy EXTERNAL"

          – name: Create FRA, REDO1 and REDO2
          become: yes
          become_user: "{{oracle_user}}"
          shell:
          cmd: "{{ oracle_home }}/bin/asmca -silent
          -createDiskGroup
          -sysAsmPassword {{sysasm_passd}}
          -diskString \"/dev/oracleasm/disks/*\"
          -diskGroupName {{oracle_hostname|upper}}_{{item}}
          -disk \"/dev/oracleasm/disks/{{oracle_hostname|upper}}_{{item}}*\"
          -redundancy EXTERNAL "
          with_items:
          – FRA
          – REDO1
          – REDO2
          [/code]

    Donde obtenemos la variable ORACLE_BASE

    Vamos con una versión rápida de las entradas recuperadas

    Todos sabemos que cuando cargamos el entorno con el binario oraenv oracle obtiene la variable $ORACLE_HOME del fichero /etc/oratab, pero ,

    ¿de donde obtiene la variable ORACLE_BASE?

    La respuesta es muy sencilla, pero menos conocida que la anterior, existe un fichero llamado
    $ORACLE_HOME/install/orabasetab, este fichero tiene el formato

    ORACLE_HOME:ORACLE_BASE:[Y|N]