Formatear el prompt del SQLplus

Hoy vamos a ver una entrada muuy sencilla de como formatear el prompt de SQLPLUS
Bajo nuestro oracle home tenemos un fichero llamado glogin.sql donde podemos definir las variables del sqlplus, entre ellas el prompt.
Supongaamos que queremos saber cual es el usuario con el que nos conectamos, seria tan sencillo como aniadir la linea

dbserver01:vi /u01/app/oracle/product/19c/dbhome_1/sqlplus/admin/glogin.sql
--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
--
-- DESCRIPTION
--   SQL*Plus global login "site profile" file
--
--   Add any SQL*Plus commands here that are to be executed when a
--   user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
--   This script is automatically run
--
def _editor=vi
set timing on
set feedback on
set sqlprompt "_user  _connect_identifier > "

Ms informacion, en:

  • https://www.youtube.com/watch?v=Ax4s39KfcZ8
  • https://www.oreilly.com/library/view/oracle-sqlplus-the/0596007469/re95.html

ORA-600 en la ejecucion de DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

Hoy vamos a ver una sencilla entrada sobre un paso basico en un upgrade de base de datos.

Antes de llevar a cabo un proceso de migracion debemos de asegurarnos que todas las estadisticas de la base de datos estan recientemente recopiladas ( menos de fos dias),

Puede darse el caso de que ejecutando el paquete de obtencion de las estadisticas de los Fixed Objects recibamos el error

 sqlplus "/as sysdba"
execute DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
BEGIN DBMS_STATS.GATHER_FIXED_OBJECTS_STATS; END;
*
ERROR at line 1:
ORA-20011: Approximate NDV failed: ORA-00600: internal error code, arguments:
[1350], [3], [23], [60], [AMERICAN], [0], [], [], [], [], [], []
ORA-06512: at "SYS.DBMS_STATS", line 37237
ORA-06512: at line 1

Esto puede darse cuando tenemos la obtencion de estadisticas en auto_sample.
Para solucionarlo, nada mas facil que mover el porcentaje de estimacion a NULL


exec dbms_stats.set_global_prefs(pname=>’ESTIMATE_PERCENT’,pvalue=>’NULL’);


SQL>  select dbms_stats.get_prefs('ESTIMATE_PERCENT') from dual;
DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT')
--------------------------------------------------------------------------------
DBMS_STATS.AUTO_SAMPLE_SIZE

SQL> exec dbms_stats.set_global_prefs(pname=>'ESTIMATE_PERCENT',pvalue=>'NULL');
PL/SQL procedure successfully completed.
SQL> select dbms_stats.get_prefs('estimate_percent') from dual;
DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT')
--------------------------------------------------------------------------------
NULL

Con este sencillo paso podremos ejecutar nuestro paquete de obtencion de estadisticas en los objetos fijos sin eosos errores ORA

Correlar discos de ASM con sistema

Hoy vamos a ver un pequenio y sendillo script para correlar los discos del sistema operativo y el ASM

#!/bin/bash
for i in `ls /dev/oracleasm/disks/ `; do
ASMDEVICE=/dev/oracleasm/disks/$i
#echo "Looking for $ASMDEVICE"
MINOR=`ls -l ${ASMDEVICE} |awk '{ print $5}'`
MAYOR=`ls -l ${ASMDEVICE} |awk '{ print $6}'`
DISKDEV=`ls -l /dev |grep -w $MAYOR | grep -w $MINOR|awk '{ print $10}'`
echo " The ASM device $ASMDEVICE is $DISKDEV"
#echo "The device $ASMDEVICE has a mayor=$MAYOR and minor=$MINOR"
#ls -l /dev/$DISKDEV
#ls -l ${ASMDEVICE}
#echo "====================================="
done

Como crear un asm sin tener discos

Hoy vamos a ver como hacerle trampas a Oracle para levatar una instancia de ASM sin tener discos en el servidor.

Supongamos que el ORACLE_HOME del grid lo tenemos en /u01/app/oracle/product/19c/grid, los pasos a seguir serian


-- == Fake disk 
sudo dd if=/dev/zero of= /u01/app/oracle/product/19c/grid/ASMFAKE.img bs=1M count=5000
sudo losetup /dev/loop1  /u01/app/oracle/product/19c/grid/ASMFAKE.img
 

  
sudo /usr/sbin/asmtool -C -l /dev/oracleasm -n FAKE1  -s /dev/loop1 -a force=yes
sudo /usr/sbin/oracleasm scandisks
sudo /usr/sbin/oracleasm listdisks

Con esto, cuando ejecutemos el asmca vermos que hay un disco llamado FAKE1 que no es otra cosa que el disc ASMFAKE que hemos creado.

Uso de variables de entorno en script sde rman

Hoy vamos a ver una entrada muy rapida para dummies.

Muchas veces queremos hacer que el log de rman tenga una variable de entorno ( usualmente a fecha),haciendo algo similar a

#!/bin/bash
HORA=`date +%Y%m%d_%H:%M:%S`
rman  cmdfile restore_${ORACLE_SID}.cmd  log logs/${HORA}_restore_${ORACLE_SID}.log

Pero cuando vamos al subdirecorio de logs nos encontramos con que nos ha creado un fichero llamado ${HORA}_restore_${ORACLE_SID}.log

Como solucionamos esto?

La solucion no pasa por jugar con las comillas sino con el uso del parametro MSGLOG
Simplemente tendremos que cambiar nuestro script por

#!/bin/bash
HORA=`date +%Y%m%d_%H:%M:%S`
rman  cmdfile restore_${ORACLE_SID}.cmd  MSGLOG logs/${HORA}_restore_${ORACLE_SID}.log

Y funcionara tal y como queremos