Conde Bond Post

Sólo existe un tipo de conocimiento, aquel que se transmite.

Automate your Administration Tasks ~ Basic Shellscripting for DBAs

We start a serie of posts related to basic shellscripting for DBA’s, this skill is very important, since many operations your specific work environments that you do manually, you can automate significantly reduce the time you spend on this, even lead these tasks with less skills or different areas coworkers.

If you build scripts with a uniform structure, you provide a resource for others to be complete or improve your work easily. This series of posts is not intended as a guide for application development, but rather to assist you decide which is the best method to accomplish this task if you are not accustomed to using shell.

This series of posts is not intended as a guide for application development, but rather to assist you decide which is the best method for you to accomplish this task.

RECOVER ENVIRONMENT

First Approach

Our starting point is the preparation of a Recovery Plan, which we intend to create automatic backups recovery processes that we run on a scheduled via crontab , scheduler or other solution stored in an RMAN catalog. Similarly we use packages to store compactly procedures and functions in the database, in this case we will use “libraries” of shell functions to build our own shell programs… Thus, we get simplify development, organize your code in an efficient way and reuse functionalities.

In our first approach initially we use three libraries:

  • one related to managing files, directories, etc in the file system .
  • one for RMAN functionalities.
  • last one for reconfiguration of the recovered target database.

As we have said before we have to build our code uniformly for easy understanding and maintenance.

Development Guide

A simple method to begin the development of functionalities is to create the structure that we are going to develop. We divide the code into sections :

Header

Here, we include the name of the function or main program, a brief description and history of changes.Header : Here, we include the name of the function or main program, a brief description and history of changes introduced.

#!/bin/bash
# ########################################################################### #
# File : getValidBck # Author : XPA Wavecorpuscle.com #
# Description : This program queries the Recovery Catalog Database looking #
# for a Valid Backup of the Database Provided by parameter #
# from the Number of Days provided also by parameter. #
# If no days provided the function uses Sysdate -2 default #
# value.
# ########################################################################### #
# Version : 1.0 # 2014-09-10 # First Release #
# ########################################################################### #

Global variables

For example where it is located within the filesystem where temporary files or registry if needed or generated by the program are stored. When we develop the libraries will be a unique section at the begin.

. $HOME/.bash_profile
PRG=$(basename $0)
SYSTM=$(date +%Y%m%d%H%M%S)

Usage Function

Experience has shown me that every program needs a little help or user guide, do this while you develop is very useful for creating documentation “on the fly” then latter it will be very necessary.

# ########################################################################### #
function getValidBckUsage {
fnt=“getValidBckUsage”
echo


getValidBck


USAGE:


getValidBckUsage <Db Name> <Days>


Where :


<Db Name> Is the mandatory Backed up Database Name


<Days> Is the optional number of days we sustract to Sysdate.


This function retrieves from the Repository Database the Last Valid
Backup of the <Db Name> provided from Sysdate minus <Days> provided.


The function returns the string needed for RMAN functions that uses the
UNTIL DATE clause if valid backup found.


If no <Days> Provided the function uses the default 2 value.


This function uses the Applcation Global Variables


RCVUSR As Recovery Catalog Database User


RCVPWD As Recovery Catalog Database User Password


RCVSID As Recovery Catalog Database SID.


NOTE: You need to set this Variables via export before call the function
from shell if you don’t use the library version



# Check if the Usage function is properly executed.
if [ $? -ne 0 ] ; then echo “$fnt ERROR : Wrong Execution” ; fi
}

Validation

We check if it helps to use the program call is requested and if you have provided all the parameters and this has been done correctly.

# ########################################################################### #
function getValidBck {
fnt=”getValidBck”
retval=0
PRINTOUT=””
ORADBSOURCE=””
DAYS=””
# Checking if Asked for Help
if [[ $(echo $1 | tr ‘[:lower:]‘ ‘[:upper:]‘ | grep -E “\-H|HELP|\/\?|USAGE” | wc -l ) -gt 0 ]] ; then
getValidBckUsage ; exit 0
fi

# Parameters Validation
if [[ -z $1 ]] ; then
PRINTOUT=“$fnt ERROR : No Database Provided”
getValidBckUsage ; exit 10
else
ORADBSOURCE=$1
fi
DAYS=$2
DBDAYS=${DAYS:-2} # Default Value is Sysdate -2 Days
# Is number validation for DAYS Parameter
if [[ -z $(echo $DBDAYS | tr -d “[0-9]“) ]] ; then

 

Body

In this section will include the code that executes our program

DBQUERY=$(echo “‘”$ORADBSOURCE”‘”)
PRINTOUT=“$fnt INFO : Looking for $DBQUERY SYSDATE – $DBDAYS Valid Backups”
untilDate=$($ORACLE_HOME/bin/sqlplus -S $RCVUSR/$RCVPWD@RCVSID << EOS
SET VERIFY OFF HEADING OFF ECHO OFF
SET TRIMSPOOL ON FEEDBACK OFF
SET LINES 30 PAGES 0
SELECT ””||SUBSTR(MAX(AB.STARTTIME),1,14)||’00:00”’ AS DTIME
FROM (
select DECODE(A.STATUS,’COMPLETED’,’OK’,’ERROR’) AS STATUS,
A.DB_NAME as “Database”,
TO_CHAR(A.END_TIME,’DAY’) AS “Day”,
TO_CHAR(A.START_TIME,’DD/MM/YYYY HH24:MI:SS’) AS STARTTIME,
A.INPUT_TYPE AS “Input”,
A.OUTPUT_DEVICE_TYPE AS “Output”,
A.INPUT_BYTES_DISPLAY AS “DatabaseSize”,
A.OUTPUT_BYTES_DISPLAY
from RC_RMAN_BACKUP_JOB_DETAILS A,
(SELECT DB_NAME,INPUT_TYPE, OUTPUT_DEVICE_TYPE, MAX(START_TIME) AS START_TIME
FROM RC_RMAN_BACKUP_JOB_DETAILS
WHERE START_TIME > SYSDATE -${DBDAYS}
AND DB_NAME=${DBQUERY}
GROUP BY DB_NAME,INPUT_TYPE, OUTPUT_DEVICE_TYPE
) B
where A.DB_NAME = B.DB_NAME and A.INPUT_TYPE = B.INPUT_TYPE
and A.OUTPUT_DEVICE_TYPE= B.OUTPUT_DEVICE_TYPE and A.START_TIME = B.START_TIME
) AB
WHERE AB.Status = ‘OK’
;
EXIT;
EOS
)

if [[ $? -eq 0 ]] ; then
if [[ -z $untilDate ]] || [[ $(echo $untilDate | grep -E "TNS-|ORA-|SP2-" | wc -l) -gt 0 ]] ; then
PRINTOUT=“$fnt ERROR : $untilDate accessing to the Repository Database or No Data Found”
retval=600
else
PRINTOUT=“UNTIL DATE = $untilDate”
fi
else

PRINTOUT=“$fnt ERROR : $untilDate accessing to the Repository Database”
retval=600
fi
else

PRINTOUT=“$fnt ERROR : Parameter Days is Not a Number”
retval=10
fi
}

Finally In our case scenario, we establish a criterion for all functions return a code, and an error/log/value message.

# ########################################################################### #
getValidBck $1 $2
echo “$PRG returns $retval”
echo “$PRINTOUT”

This is a good practice to integrate them later in our program and establish control of errors in the execution flow.

Mapping (Virtual) SCSI Devices with ASM Content

Recently, we had to change the storage of a vm host in which we had an Oracle database server (single instance) with ASM.
This simple script allows to know which virtual SCSI devices contain ASM disks and also displays the linux volume.

for isd in $(find /sys/bus/scsi/devices/  | sort)
  do
    if [ -n $isd ] ; then
      if [[ $isd != "/sys/bus/scsi/devices/" ]] ; then 
        ppidv=$(echo $isd | cut -d"/" -f6 | awk -F":" '{print "SCSI ("$1":"$2") Hardk disk "$3}') # Pretty Print
        idv=$(ls -l /dev/$(ls -d $(echo $isd | sed -e "s/\:/\\\:/g")/block* 2>/dev/null | awk -F":" '{print $5}' )[0-9] | awk '{print $10}' 2>/dev/null)
        if [[ -n  $idv ]] ; then
          tmpV=$(/usr/sbin/oracleasm querydisk $idv 2>/dev/null | grep " with the label");
          if [[ $(echo "$tmpV" | grep "is not marked as an ASM disk" | wc -l ) -eq 0 ]] ; then
            if [[ ! -z $tmpV ]] ; then
              tmpStr1=$(fdisk -l | grep "Disk $(echo "$tmpV" | awk '{print $2}' | tr -d "[0-9]" | tr -d '"')" | awk '{print $3" "$4}' | tr -d ",")
              tmpStr2=$(echo "ASM Device Found : "$(echo "$tmpV" | awk '{print $2"       "$11}') | tr -d '"')
              if [[ $(echo $ppidv | grep "SCSI (0:0)" | wc -l ) -eq 0 ]]; then
                TAB="$(printf '\t')"
                echo "$ppidv $TAB $tmpStr1 $TAB $tmpStr2 " 
              fi
            fi
          fi
        fi
      fi
      idv="";        pdv="";       tmpV="";
      tmpStr1="";    tmpStr2=""
    fi
done

The output looks like this…

SCSI (1:0) Hardk disk 0     109.4 GB    ASM Device Found : /dev/sdd1 ASM_DB_DAT00
SCSI (1:0) Hardk disk 1     109.4 GB    ASM Device Found : /dev/sde1 ASM_DB_DAT01
SCSI (1:0) Hardk disk 10    109.4 GB    ASM Device Found : /dev/sdm1 ASM_DB_DAT09
SCSI (1:0) Hardk disk 11    109.4 GB    ASM Device Found : /dev/sdn1 ASM_DB_DAT10
SCSI (1:0) Hardk disk 12    109.4 GB    ASM Device Found : /dev/sdo1 ASM_DB_DAT11
SCSI (1:0) Hardk disk 13    109.4 GB    ASM Device Found : /dev/sdp1 ASM_DB_DAT12
SCSI (1:0) Hardk disk 14    109.4 GB    ASM Device Found : /dev/sdq1 ASM_DB_DAT13
SCSI (1:0) Hardk disk 15    109.4 GB    ASM Device Found : /dev/sdr1 ASM_DB_DAT14
SCSI (1:0) Hardk disk 2     109.4 GB    ASM Device Found : /dev/sdf1 ASM_DB_DAT02
SCSI (1:0) Hardk disk 3     109.4 GB    ASM Device Found : /dev/sdg1 ASM_DB_DAT03
SCSI (1:0) Hardk disk 4     109.4 GB    ASM Device Found : /dev/sdh1 ASM_DB_DAT04
SCSI (1:0) Hardk disk 5     109.4 GB    ASM Device Found : /dev/sdi1 ASM_DB_DAT05
SCSI (1:0) Hardk disk 6     109.4 GB    ASM Device Found : /dev/sdj1 ASM_DB_DAT06
SCSI (1:0) Hardk disk 8     109.4 GB    ASM Device Found : /dev/sdk1 ASM_DB_DAT07
SCSI (1:0) Hardk disk 9     109.4 GB    ASM Device Found : /dev/sdl1 ASM_DB_DAT08
SCSI (2:0) Hardk disk 0     38.3 GB     ASM Device Found : /dev/sds1 ASM_DB_TMP001
SCSI (2:0) Hardk disk 1     109.4 GB    ASM Device Found : /dev/sdt1 ASM_DB_YTS00
SCSI (2:0) Hardk disk 10    109.4 GB    ASM Device Found : /dev/sdab1 ASM_DB_YTS08
SCSI (2:0) Hardk disk 11    109.4 GB    ASM Device Found : /dev/sdac1 ASM_DB_YTS09
SCSI (2:0) Hardk disk 12    10.7 GB     ASM Device Found : /dev/sdad1 ASM_DB_LOG02
SCSI (2:0) Hardk disk 13    12.8 GB     ASM Device Found : /dev/sdae1 ASM_DB_LOG03
SCSI (2:0) Hardk disk 14    109.4 GB    ASM Device Found : /dev/sdaf1 ASM_DB_FSH00
SCSI (2:0) Hardk disk 15    109.4 GB    ASM Device Found : /dev/sdag1 ASM_DB_FSH01
SCSI (2:0) Hardk disk 2     109.4 GB    ASM Device Found : /dev/sdu1 ASM_DB_YOT01
SCSI (2:0) Hardk disk 3     109.4 GB    ASM Device Found : /dev/sdv1 ASM_DB_YOT02
SCSI (2:0) Hardk disk 4     109.4 GB    ASM Device Found : /dev/sdw1 ASM_DB_YOT03
SCSI (2:0) Hardk disk 5     109.4 GB    ASM Device Found : /dev/sdx1 ASM_DB_Y0T04
SCSI (2:0) Hardk disk 6     109.4 GB    ASM Device Found : /dev/sdy1 ASM_DB_YOT05
SCSI (2:0) Hardk disk 8     109.4 GB    ASM Device Found : /dev/sdz1 ASM_DB_YOT06
SCSI (2:0) Hardk disk 9     109.4 GB    ASM Device Found : /dev/sdaa1 ASM_DB_YOT07
SCSI (3:0) Hardk disk 1     12.8 GB     ASM Device Found : /dev/sdai1 ASM_DB_CTL01
SCSI (3:0) Hardk disk 10    109.4 GB    ASM Device Found : /dev/sdaq1 ASM_DB_DAT18
SCSI (3:0) Hardk disk 11    109.4 GB    ASM Device Found : /dev/sdar1 ASM_DB_DAT17
SCSI (3:0) Hardk disk 12    109.4 GB    ASM Device Found : /dev/sdas1 ASM_DB_DAT16
SCSI (3:0) Hardk disk 14    96.4 GB     ASM Device Found : /dev/sdau1 ASM_DB_DAT15
SCSI (3:0) Hardk disk 2     12.8 GB     ASM Device Found : /dev/sdaj1 ASM_DB_CTL02
SCSI (3:0) Hardk disk 3     12.8 GB     ASM Device Found : /dev/sdak1 ASM_DB_LOG00
SCSI (3:0) Hardk disk 4     12.8 GB     ASM Device Found : /dev/sdal1 ASM_DB_LOG01
SCSI (3:0) Hardk disk 5     12.8 GB     ASM Device Found : /dev/sdam1 ASM_DB_LOG02
SCSI (3:0) Hardk disk 6     12.8 GB     ASM Device Found : /dev/sdan1 ASM_DB_LOG03
SCSI (3:0) Hardk disk 8     12.8 GB     ASM Device Found : /dev/sdao1 ASM_DB_LOG00
SCSI (3:0) Hardk disk 9     12.8 GB     ASM Device Found : /dev/sdap1 ASM_DB_LOG01

I hope it’s helpful.

MySQL 5.6 Testing Optimization InnoDB Tables

After reading an experiment published about optimizing InnoDB, I tried to check the result during the MySQL Administration Training at Oracle I attendthis week…

We create the table a in order to test the trick for InnoDB tables optimizatio provided by Peter in this post (1) .

CREATE TABLE `a` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c` char(64) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `c` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=12582913 DEFAULT CHARSET=latin1

At mysqlprompt we create a function for generate random string (2)

DROP function if exists genstring;
delimiter $$
CREATE FUNCTION genstring(in_strlen int) RETURNS VARCHAR(500) DETERMINISTIC
BEGIN
set @var:='';
while(in_strlen>0) do
set @var:=concat(@var,ELT(1+FLOOR(RAND() * 26),

'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'));
set in_strlen:=in_strlen-1;
end while;
RETURN @var;
END $$

we create a procedure to populate the table a

DROP PROCEDURE IF EXISTs InsertTableA;
DELIMITER $$
CREATE PROCEDURE InsertTableA ( IN pRecs INT)
BEGIN
SET @count=1; SET @max=pRecs;
WHILE  @count < @max  DO
SELECT genstring(ROUND((RAND() * 63)+1)) INTO @cins;
INSERT INTO a (C) VALUES (@cins);
SET @count = @count +1;
END WHILE;
END;
$$

and next we put some records to the table

CALL InsertTableA (60067);

First, we execute the direct optimization of the a InnoDB Table…

mysql> SELECT COUNT(*) FROM a;
+----------+
| COUNT(*) |
+----------+
|    60067 |
+----------+
1 row in set (0.03 sec)
mysql>  optimize table a;
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (2.34 sec)

And the other optimization approach as shown:

mysql> alter table a drop key c;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>  optimize table a;
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.96 sec)

mysql> alter table a add key(c);
Query OK, 0 rows affected (0.70 sec)
Records: 0  Duplicates: 0  Warnings: 0

The second optimization runs faster than the previous one, no doubt. And you see how changes the table files as shown:

[root@EDLVC2R10P5 test]# ls -tlar a.*
-rw-rw---- 1 mysql mysql     8580 Jul 24 15:06 a.frm
-rw-rw---- 1 mysql mysql 22020096 Jul 24 16:44 a.ibd

[root@EDLVC2R10P5 test]# ls -tlar a.*
-rw-rw---- 1 mysql mysql     8580 Jul 24 16:52 a.frm
-rw-rw---- 1 mysql mysql 14680064 Jul 24 16:53 a.ibd

We load more data in the table in order to reproduce one more realistic test scenario:

mysql> CALL InsertTableA (100230);
Query OK, 0 rows affected (8 min 38.92 sec)

mysql> SELECT COUNT(*) FROM a;
+----------+
| COUNT(*) |
+----------+
|   160296 |
+----------+
mysql> optimize table a;
1 row in set (0.07 sec)
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (5.05 sec)

And no change in the file size in ther first optimization execution:

[root@EDLVC2R10P5 test]# ls -ltar a.*
-rw-rw---- 1 mysql mysql     8580 Jul 24 16:52 a.frm
-rw-rw---- 1 mysql mysql 46137344 Jul 24 17:10 a.ibd

The second optimization approach:

alter table a drop key c;
mysql> alter table a drop key c;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> optimize table a;
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (2.23 sec)

mysql> alter table a add key(c);
Query OK, 0 rows affected (4.18 sec)
Records: 0  Duplicates: 0  Warnings: 0

And the size is half more or less prior the new optimization execution:

[root@EDLVC2R10P5 test]# ls -ltar a.*
-rw-rw---- 1 mysql mysql     8580 Jul 24 17:15 a.frm
-rw-rw---- 1 mysql mysql 28311552 Jul 24 17:15 a.ibd

In this new scenario we see that time execution of both optimizations are very similar.

We carry on loading more data on the table:

mysql> CALL InsertTableA (426793);
Query OK, 0 rows affected (38 min 25.12 sec)

After the data load we review the file size:

[root@EDLVC2R10P5 test]# ls -ltar a.*
-rw-rw---- 1 mysql mysql      8580 Jul 24 17:15 a.frm
-rw-rw---- 1 mysql mysql 134217728 Jul 24 17:57 a.ibd

And now we repeat both optimizations processes

mysql> SELECT COUNT(*) FROM a;
+----------+
| COUNT(*) |
+----------+
|   587088 |
+----------+
1 row in set (0.28 sec)
mysql> optimize table a;
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (15.36 sec)

Note that the file size is increased after the optimization execution…

[root@EDLVC2R10P5 test]# ls -ltar a.*
-rw-rw---- 1 mysql mysql      8580 Jul 25 07:32 a.frm
-rw-rw---- 1 mysql mysql 142606336 Jul 25 07:32 a.ibd

And now, we execute the second optimization approach:

mysql> alter table a drop key c;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> optimize table a;
+--------+----------+----------+-------------------------------------------------------------------+
| Table  | Op       | Msg_type | Msg_text                                                          |
+--------+----------+----------+-------------------------------------------------------------------+
| test.a | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.a | optimize | status   | OK                                                                |
+--------+----------+----------+-------------------------------------------------------------------+
2 rows in set (7.17 sec)

mysql> alter table a add key(c);
Query OK, 0 rows affected (11.59 sec)
Records: 0  Duplicates: 0  Warnings: 0

After review the file size wee see that no changes occurs, respect the original file size, prior the optimization execution.

[root@EDLVC2R10P5 test]# ls -ltar a.*
-rw-rw---- 1 mysql mysql      8580 Jul 25 07:35 a.frm
-rw-rw---- 1 mysql mysql 104857600 Jul 25 07:35 a.ibd

What really happens? I will continue writing about this…

NOTES:
Thinking about running OPTIMIZE on your Innodb Table ? Stop!
http://www.mysqlperformanceblog.com/2010/12/09/thinking-about-running-optimize-on-your-innodb-table-stop/

MySQL Generate Random String, Email Address, URL
http://ready2gosoft.com/php/mysql-generate-random-string.html

Monitoring Oracle Database for no DBAs

Here one shoddy bash script for basic basic monitoring and detect oracle databse errors:

#!/bin/bash
shopt -s extglob
oracle_unqname=$(echo $ORACLE_UNQNAME | tr '[:upper:]' '[:lower:]')
#echo "ORACLE_UNQNAME : $oracle_unqname # ORACLE_SID : $ORACLE_SID"
PINDATETIME=$(date +%Y%m%d_%H%M%S)
ORAERRORLOG="/scripts/logs/"$PINDATETIME"_ora_errors_track.log"
ERRORMSG=""
NAGIOSRET=0
SEARCHPATH=$ORACLE_BASE"/diag/rdbms/"$oracle_unqname"/"$ORACLE_SID"/trace/"$ORACLE_SID"*_ora*.trc"
case $# in
  0 ) # We find in all trace files
      for oras in $(ls -ltar $SEARCHPATH | awk '{print $9}' 2>/dev/null)
      do
      # echo "File : $oras " ;
      if [ $(cat $oras |grep "ORA-" | wc -l) -gt 0 ] ; then
        echo "" >> $ORAERRORLOG
        echo "ORA Errors Found in File $oras" >> $ORAERRORLOG
        cat $oras | grep "ORA-" -B7 -A2 >> $ORAERRORLOG
        if [ $(echo "$ERRORMSG" | wc -l ) -gt 0 ] ; then
          NEWMSG="ORA Errors Found in File $oras"
          ERRORMSG="$ERRORMSG"$'\n'"$NEWMSG"
          #echo "ERRORMSG : $ERRORMSG"
        fi
        echo "------------------------------------------------------------------" >> $ORAERRORLOG
      fi
      done
  ;;
  * ) # We find in the past n days files
      case $1 in
     # if [[ $1 = *[:digit:]]* ]]; then
        ( +([0-9]) ) # If is nummber
        dateCompute=$(echo "$1 days ago")
        echo "$dateCompute"
        dateSearch=$(echo $(date -d "$dateCompute") | awk '{print $2" "$3}')
        echo "$dateSearch"
        for oras in $(ls -ltar $SEARCHPATH | grep "$dateSearch" |awk '{print $9}' 2>/dev/null)
          do
        # echo "File : $oras " ;
          if [ $(cat $oras |grep "ORA-" | wc -l) -gt 0 ] ; then
            echo "" >> $ORAERRORLOG
            echo "ORA Errors Found in File $oras" >> $ORAERRORLOG
            cat $oras | grep "ORA-" -B7 -A2 >> $ORAERRORLOG
            if [ $(echo "$ERRORMSG" | wc -l ) -gt 0 ] ; then
              NEWMSG="ORA Errors Found in File $oras"
              ERRORMSG="$ERRORMSG"$'\n'"$NEWMSG"
            #echo "ERRORMSG : $ERRORMSG"
            fi
            echo "------------------------------------------------------------------" >> $ORAERRORLOG
          fi
        done
        ;;
        * ) # Not a Number
      #else
        ERRORMSG="ERROR : Invalid Parameter"
        NAGIOSRET=4
      #fi
        ;;
      esac
  ;;
esac

if [ -z "$ERRORMSG" ] ; then
  ERRORMSG="No ORA Errors Found in Trace Files"
  NAGIOSRET=0
else
  if [ $NAGIOSRET -gt 0 ]; then
     echo "$ERRORMSG"
  else
    NAGIOSRET=3
  fi
fi
#echo " "
exit $NAGIOSRET

I promise to update the script tha.., tha, that’s all folks!

;)

EM12c ConfigStateMgr:798 errors (storage_reporting_data) ~ Resolució d’Incidents

The Metalink Oracle Support associate these error messages [EM12c ConfigStateMgr:798 errors (storage_reporting_data) ] to bug 13547855 which in most cases are related to Oracle Cloud Control agents deployment into targets. Applying the procedure described in the Oracle Support document referenced can be set. However, not always like this.
You can download the english version of this post here: EM12c ConfigStateMgr798errors_storage_reporting_data – Troubleshooting

En l’entrada del bloc http://www.snapdba.com/2013/02/em12c-configstatemgr-798-errors-storage_reporting_data/ s’associa aquets missatges d’error al bug 13547855 que en la majoria dels casos estan relacionats amb el deslligament d’agents Oracle Cloud Control en un entorn. Aplicant el procediment descrit en el document de Suport d’Oracle al que fa referència es poden fixar.

De tota manera, no sempre és així, i malgrat seguir les instruccions per fixar-lo, la consola segueix reportant insistentment els missatges d’error. Si revisem el fitxer de registre on es notifica l’errada veiem:

# cat /u01/app/12cagent/agent_inst/sysman/log/gcagent_errors.log | grep "2013-09-09" 2013-09-09 13:53:19,563 [201607:GC.Executor.75083 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_keys)] ERROR - null 2013-09-09 13:53:19,564 [201607:GC.Executor.75083 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_keys)] ERROR - host:srva0d1:host_storage:storage_reporting_keys 2013-09-09 13:53:19,564 [201607:GC.Executor.75083 (host:srva0d1:host_storage)] ERROR - Critical error: 2013-09-09 13:53:19,701 [201607:GC.Executor.75083 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_alias)] ERROR - null 2013-09-09 13:53:19,702 [201607:GC.Executor.75083 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_alias)] ERROR - host:srva0d1:host_storage:storage_reporting_alias 2013-09-09 13:53:19,702 [201607:GC.Executor.75083 (host:srva0d1:host_storage)] ERROR - Critical error: 2013-09-09 13:53:20,346 [201731:oracle.dfw.impl.incident.DiagnosticsDataExtractorImpl - Incident Dump Executor (created: Mon Sep 09 13:53:19 CEST 2013)] ERROR - Result set exceeded max flood control level 2013-09-09 13:53:20,567 [201731:oracle.dfw.impl.incident.DiagnosticsDataExtractorImpl - Incident Dump Executor (created: Mon Sep 09 13:53:19 CEST 2013)] ERROR - Result set exceeded max flood control level

Darrera del vessament que provoca el resultat obtingut per la funció del programa que executa la consulta (que en una altra entrada de bloc us explicaré com fixar modificant el codi del programa perl responsable de l’incident) pot haver-hi altres errades. Per tant, seguirem el procediment descrit i comprovarem el contingut del fitxer de registre amb les errades de l’agent relacionades amb l’emmagatzematge de dades:

# cat $AGENT_HOME/agent_inst/sysman/log/gcagent_errors.log | grep storage_reporting_data 2013-09-04 13:53:19,368 [101557:GC.Executor.39108 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - null 2013-09-04 13:53:19,373 [101557:GC.Executor.39108 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - host:srva0d1:host_storage:storage_reporting_data 2013-09-05 13:53:19,554 [121731:GC.Executor.46652 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - null 2013-09-05 13:53:19,559 [121731:GC.Executor.46652 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - host:srva0d1:host_storage:storage_reporting_data 2013-09-07 13:53:19,332 [161745:GC.Executor.60863 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - null 2013-09-07 13:53:19,337 [161745:GC.Executor.60863 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - host:srva0d1:host_storage:storage_reporting_data

Si analitzem la naturalesa del missatge podem deduïr que l’agent Oracle Cloud Control no està obtenint dades d’un destí definit en la seva configuració de l’emmagatzematge:

2013-09-09 13:53:19,408 [201607:GC.Executor.75083 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - null 2013-09-09 13:53:19,412 [201607:GC.Executor.75083 (host:srva0d1:host_storage) (host:srva0d1:host_storage:storage_reporting_data)] ERROR - host:srva0d1:host_storage:storage_reporting_data

En el nostre cas, recentment s’havia fet un canvi en la configuració dels discs del servidor causant de l’incident, consultant el contingut del fitxer que es mostra tot seguit:

# cat $AGENT_HOME/agent_inst/sysman/emd/state/configstate/host/$(hostname –s)/ storage_reporting_issues.xml <DC CN="" TS="2013-09-05T13:53:20.008+02:00" TI="TARGET_GUID=D5215C2D28F0768DE043428814AC10B0" TN="srva0d1" TT="host"> RS TS="2013-09-05T13:53:20.005+02:00" MN="storage_reporting_issues"> RH> <CI NM="type">ERROR</CI> <CI NM="message_counter">10</CI> <CI NM="message_id">ERROR_INST_MAPPING</CI> <CI NM="message_params">Filesystem /dev/mapper/vg00-LV04_var</CI> <CI NM="action_id">ACTION_INST_RESOLV_ISSUE</CI> <CI NM="action_params"/> </RH>

Confirmem de que es tracta d’una errada de lectura o en l’accés a un volum, el /dev/sdd. Ho comprovem des del sistema d’arxius amb l’usuari root:

# fdisk /dev/sdd Unable to read /dev/sdd # /opt/mpp/lsvdev | grep sdd # pvscan /dev/sdd: read failed after 0 of 4096 at 0: Input/output error /dev/sdd: read failed after 0 of 4096 at 107374116864: Input/output error dev/sdd: read failed after 0 of 4096 at 107374174208: Input/output error /dev/sdd: read failed after 0 of 4096 at 4096: Input/output error PV /dev/sdb VG vg01 lvm2 [1.82 TB / 837.71 GB free] PV /dev/sda2 VG vg00 lvm2 [135.84 GB / 30.84 GB free] Total: 2 [1.95 TB] / in use: 2 [1.95 TB] / in no VG: 0 [0 ]

I efectivament, nosaltres no tenim accés al volum /sdd/ . Nosaltres hem de fixar aquest problema en la configuració del sistema operatiu o bé substituint el disc si està en mal estat.

login as: root root@ srva0d1 password: Last login: Thu Sep 12 07:50:14 2013 from 172.24.24.164 [root@ srva0d1 ~]# pvscan PV /dev/sdb VG vg01 lvm2 [1.82 TB / 837.71 GB free] PV /dev/sda2 VG vg00 lvm2 [135.84 GB / 30.84 GB free] Total: 2 [1.95 TB] / in use: 2 [1.95 TB] / in no VG: 0 [0 ]

Una vegada fet això, i seguint el procediment descrit en el document de Suport Oracle els missatges desapareixeran de la consola em12c .

Pots descarregar aquesta entrada aquí: EM12c ConfigStateMgr798errors_storage_reporting_data – resolucio incidents

Un cop de mà en matemàtiques a pares i mares de primer d’eso (I)

Encara que s’aparta un xic del que acostumo a escriure, aquesta entrada tracta de donar un cop de mà en matemàtiques a aquells p/mares que de sobte, es troben amb la necessitat d’explicar allò que fa molts anys varen estudiar (i que possiblement han oblidat) als seus fills/es que comencen l’eso. I es troben amb el problema de resoldre i explicar un problema…

El problema en qüestió ens diu que: la Carla i la Mercè viuen a la mateixa casa i van a la mateixa escola caminant. La Carla triga 40 minuts i la Mercè en triga 60. Si la Mercè surt 10 minuts abans que la Carla, quan es trobaran les dues?

Per resoldre un problema hem d’entendre l’enunciat i què ens estan demanant que resolguem.

Sovint, no acabem de veure, què és el que ens estan demanant… Així que no ens estressem i fem servir el que a algun/es de nosaltres ens deien quan érem petits/tes, el conte de la vella…

Què diu realmente l’enunciat?

Si la Carla triga 40 minuts en arribar al escola, i la Mercè 60 minuts, és que la Carla camina més de pressa. Vol dir que es desplaça a més velocitat.

Nota: La velocitat s’expressa com l’espai recorregut en un temps donat, això en termes d’equacions s’escriu així (velocitat = espai dividit pel temps):

v= e / t

on v és la velocitat, e l’espai i t el temps.

Analitzant el nostre problema, deduïm que les nostres tres variables són:

  • La velocitat de la Carla és més gran que la de la Mercè.

  • Si les dues es troben, és que ambdues han recorregut el mateix espai.

  • Quan es trobin, la Carla haurà trigat 10 minuts menys que la Mercè.

Parem compte que el problema no ens dona cap valor de l’espai que hi ha de casa a l’escola, i que ens demanen “quan” es trobaran… Temps al temps!

És a dir, quan de temps trigaran en trobar-se, no a on, ni com, ni per què… :P

Si ens fixem en l’enunciat veiem que ens donen un patró de temps: 10 minuts.

Anem a pams, i comptem amb els dits si cal… ;)

Resolució per deducció, el conte de la vella

Resolem-ho amb el conte de la vella, il·lustrant l’espai recorregut per cadascuna d’elles mentre van a escola en una unitat de temps determinada (el patró):

Per anar a l’escola la Mercè necessita 6 unitats de 10 minuts (6 x 10 = 60).

imatge_01

Per anar a l’escola la Carla necessita 4 unitats de 10 minuts (4 x 10 = 40).imatge_02

Vejam quin espai recorre cadascuna, cada 10 minuts… En els primers 10 minuts la Mercè ha recorregut aquesta distància, la Carla és a casa…imatge_03

En els segons 10 minuts, la Mercè i la Carla han recorregut aquestes distàncies…imatge_04

En els tercers 10 minuts, la Mercè i la Carla han recorregut aquestes distàncies…

imatge_05

És a dir, que la Carla enxampa la Mercè als 30 minuts de que la Mercè hagi sortit de casa… I curiosament, va per una mare en concret, és efectivament a mig camí… :D

Com ho traduïm en una equació?

Es tracta de plantejar la solució del problema amb una equació de primer grau (primer d’eso), amb una única incògnita: o el temps de la Carla; o el temps de la Mercè.

L’espai no el sabem, i de fet, l’únic que ens interessa és que serà el mateix per a les dues, com hem vist abans. Sino fos així no es trobarien… Oooooi?

La velocitat tampoc la sabem, però sí que podem expressar-la en funció d’una d’elles en termes relatius, és a dir quantes vegades l’una és més ràpida que l’altra…

Resolem-ho en funció del temps que trigarà la Mercè… Per tant, la velocitat de la Carla, l’expresarem en funció de la velocitat de la Mercè.

1. Deduïm la velocitat relativa de la Carla, respecte a la de la Mercè.

Velocitat de la Carla = espai fins l’escola / 40 minuts

Vc = e/40

Velocitat de la Mercè = espai fins l’escola / 60 minuts

Vm = e/60

L’espai que hi ha de casa a l’escola e, no el sabem, però és el mateix per a les dues…

Per aïllar-lo, passem el que divideix a la dreta de l’equació, multiplicant a l’esquerra:

40 Vc = e

60 Vm = e

Igualem les dues equacions, car l’espai és el mateix:

40 Vc = 60 Vm

Aïllem la velocitat de la Carla passant el 40 que multiplica a l’esquerra, dividint a la dreta:

Vc = 60 / 40 Vm

Dividim per 10 a dalt i abaix a la dreta de l’equació (treiem un zero, o els que hagi…), d’això en diem simplificar:

Vc = 6/4 Vm

I encara, podem dividir per 2 a dalt i abaix (simplificar) a la dreta de l’equació:

Vc = 3/2 Vm

Nota: Tenim doncs, que la velocitat de la Carla és una vegada i mitja (3/2) més gran que la de la Mercè. Repasseu les fraccions, és un consell d’amic.

2. Expressem l’espai recorregut per les dues (que és el mateix) en una sola equació, a l’esquerra la Carla i a la dreta la Mercè, recordant que l’espai és la velocitat multiplicada pel temps (el que divideix, passa multiplicant a l’altre cantó de l’equació):

e= v t

L’espai que haurà recorregut la Carla (trigarà 10 minuts menys ), en funció de la Mercè serà:

e = 3/2 Vm (Tm - 10)

L’espai que haurà recorregut la Mercè:

e = Vm Tm

Nota: Vm és la velocitat de la Mercè i Tm és el temps que triga la Mercè.

Igualem els espais… i ja tenim la nostra equació de primer grau… encara que no ho sembli ;)

3/2 Vm (Tm - 10) = Vm Tm

Resolem l’equació de primer grau…

Aïllem el Tm de la dreta, el Vm que multiplica passa a l’esquerra dividint…

3/2 Vm (Tm - 10) / Vm = Tm

Si dividim i multipliquemem per Vm, ho podem eliminar… (si multipliquem per 2 i dividim per 2 una quantitat, la que sigui, obtenim la mateixa quantitat, si ho fem pel logaritme neperià de mil dos cent vint-i-set també, això va a missa que diria l’avi que ere de lletres “pures”…):

3/2 (Tm – 10) = Tm

Resolem el parèntesi de l’esquerra, multiplicant a dalt per 3 i dividint abaix per 2 (ho poso entre parèntesi per no fer servir més d’una línia, aneu-vos acostumant…):

(3Tm – 30) / 2 = Tm

Passem el 2 que deivideix a l’esquerra, multiplicant a la dreta:

3Tm – 30 = 2Tm

 

Aïllem tots els Tm a l’esquerra de l’equació: el que suma passa a l’altre cantó restant; i el que resta, passa sumant a l’altre cantó…

3Tm – 2Tm = 30

Finalment tenim que (3Tm–2Tm=Tm), 3 pomes menys 2 pomes = poma, no barregeu “pomes i peres” ;) :

Tm = 30

És a dir, que 30 minuts després de que hagi surtit de casa la Mercè, es troba amb la Carla…

El problema que us plantejo ara, és el següent: quant de temps ha de sortir abans la Mercè per a que ambdues arribin al mateix temps a escola;)

Tant de bó, us hagi estat útil.

I recordeu que a Catalunya som pioners en continguts educatius penjats a internet, així que cerqueu… que ben segur que en trobareu i de ben útils… i sobretot, comenceu la recerca per xtec.cat

Aquí podeu trobar un document pdf per si us el voleu descarregar.

Recordar-vos que per elaborar tots aquests continguts faig servir programari lliure, en concret Libre Office Versió 3.6.4.3 i que tant de bó el féssiu servir per tal d’aprimar la factura que es paga per programaris ofimàtics que no s’ho valen.

Administration tips ~ Shrinking tablespaces…

I found this command that I have managed to integrate it into a sql script to resolve a question of how to shrink tablespaces in the database in case of trouble, which recently, has been raised on linkedin:

declare
  cmd       varchar2(200);
  cnt       number(5):=0;
  mdf       number(5):=5; -- Put here your minimum tbs size values
begin
  for c in ( 
            select 'alter database datafile '''||file_name||''' resize '||ceil( (nvl(hwm,1)*8192)/1024/1024 )||'m;' cmd
              from dba_data_files a,
                   ( select file_id, max(block_id+blocks-1) hwm from dba_extents group by file_id ) b
             where a.file_id = b.file_id(+)
               and (SUBSTR(a.tablespace_name,1,4)='TBS_' and ceil( (nvl(hwm,1)*8192)/1024/1024 ) > mdf ) -- filters tbs_name, minimum space
               and ceil( blocks*8192/1024/1024) -ceil( (nvl(hwm,1)*8192)/1024/1024 ) > 0                 -- and put your own tbs filter clause
  ) loop
    cnt:=cnt+1;
    cmd:=c.cmd;
    execute immediate cmd ;
--    dbms_output.put_line(cmd);   --uncomment for tracking purpose
  end loop;
  dbms_output.put_line(cnt||' datafiles shrinked....');
exception
  when others then
     dbms_output.put_line(cmd);
     dbms_output.put_line(substr(sqlerrm,1,200));
end;
/

I hope to find soon the link to add to this post.
I hope it’s useful.

BIG, BIG… HURRA (III)

Como era de esperar Héctor respondió a mi réplica sobre su interesante artículo la ballena voladora ataca de nuevo. Después de la provocación (en ningún momento tuve la intención de criticarle a nivel personal) hemos entrado por fin, en un debate sobre “el nuevo montaje mercadotécnico de moda, el Bigdata”. De no serlo, ahora no estaríamos debatiendo la cuestión.

La paciencia es la fortaleza del débil y la impaciencia la debilidad del fuerte

Quiero aclarar y con cierto humor que mi contacto más espectacular con las ballenas fue a la temprana edad de 14 años, en 1980. Aunque años atrás había visto una de varada en la playa, causándome una impresión extraordinaria. Ya por aquel entonces era un explorador infatigable, pero impaciente. Transcurrieron al menos tres años más de árdua investigación para saber que el “hallazgo arqueológico” pertenecía a una ballena y no a un extinto dinosaurio como ilusionadamente creí al principio, sólo conocía de Kant algunas referencias puntuales de mi abuelo que la juventud no me habían permitdo entender.

En un paseo familiar por un poblado talayótico alejado unos kilómetros de la villa y abandonado a su suerte por autoridades e instituciones responsables de su preservación, encontré lo que parecía un gran plástico blanco en la rocosa y antaño volcánica costa. Una gran masa blanca como la nieve, desafiante frente al mar áun embravecido tras la gregalada(1) del dia anterior. Al acercarme y procesarla, comprobé que se trataba de un hueso de unas dimensiones más que notables, con dos cortas aletas articuladas y un agujero redondo en su parte posterior. Su peso posiblemente alcanzaba la veintena de kilos ya que no lo pude levantar.

Yace como elemento decorativo en el hogar de una chimenea desde hace más de 30 años.

Las cosas no cambian, cambiamos nosotros.

Henry David Thoreau, ilustra a mi entender cuál es el verdadero problema del nuevo BigData. ¿Nos enfrentamos a un problema existente desde un enfoque distinto? ¿Nos enfrentamos al mismo problema de siempre con nuevas herramientas? ¿Qué novedad es esta? ¿Una novedad formal?

Si repasamos la corta y bién documentada historia de las tecnologías electrónicas de procesamiento y almacenamiento de datos, nos daremos cuenta que BigData siempre ha estado ahí.

Coincido en gran parte sobre la síntesis que hizo Héctor de cuatro puntos clave que atañen a este debate. Muchas de las diferencias que existen de interpretación entre ambos son meramente formales, los dos nos enfrentamos a diario a los mismos problemas y con herramientas parecidas, por no decir las mismas…

Si pudiéramos comparar las soluciones que proponemos a un mismo problema encontraríamos grandes diferencias, existe un salto generacional entre ambos.

El ingenio es quizás al talento lo que el instinto a la razón

Una gran sentencia de Jules Renard. Recuerdo mi quinta llamada al departamento de Soporte de un fabricante tecnológico  líder mundial con una claridad asombrosa y eso que ha transcurrido más de una década. Me acuerdo porque de las cuatro anteriores la única respuesta que recibí fue un tajante “sube de versión”.
- “Tengo un problema con la visualización de este tipo de elementos en el Forms cuando cambio de una pantalla a otra”
- De acuerdo, ¿versión y plataforma?
- …
- ¿Cómo? Este producto no está disponible en esta plataforma, ¿Cómo diablos has conseguido instalarlo y que funcione?
- …, incluyendo ficheros vacíos con estos nombres y extensiónes que busca vuestro programa de instalación (pero que no usa) y modificando esta librería del sistema operativo.
- Oye, envíame un email detallando cómo lo has hecho
- Ni en broma, sube de versión…

No trato de criticar una actitud acorde a una estrategia comercial de un fabricante en concreto, no es esta mi intención. Este ejemplo sirve para ilustrar que tendemos a descartar herramientas que sirven perfectamente para resolver nuestros problemas, pero que se hace desde un enfoque estrictamente comercial, de obsolescencia programada, o por pura vagueza, no con criterios técnicos…

¿Por qué tienes que venderme cada cuatro años una versión nueva que no funciona, cuando aún no funciona la que me vendiste hace cuatro años? ¿Por que voy a incorporar tu  nueva herramienta cuando no hace ni cuatro años que está en el mercado? ¿Cambio? Sí, pero tomadura de pelo… NO

Es mejor saber algunas de las preguntas que todas las respuestas

Siguiendo el tono de humor de James Thurber, expondré brevemente un caso real al que me enfrenté hace una docena de años. En una importante organización manejábamos su sistema de gestión de tesorería cuando se produjo el fichaje “estrella” de un nuevo director de operaciones… Estos fichajes suelen conllevar la incorporación de cambios, a veces necesarios, pero la mayoría de las veces sólo para satisfacer el ego personal del recién llegado y justificar así su presencia…

Jugando con la ventaja de mi experiencia profesional previa como operador y analista financiero y sobretodo, conociendo la intranscendencia operativa del dato, incluí un cambio que suponía un auténtico quebradero de cabeza para todos: el fixing del día.

Podéis imaginar lo que supone modificar un modelo de datos de una aplicación como esta… que procesa transacciones diarias por importe de cientos de millones de euros (miles de millones de las antiguas pesetas). Sin embargo, la solución pasó por modificar la pantalla afectada e incluir una lista de valores que no se guardaba en base de datos.

“Hemos incluido el fixing en la pantalla tal y como pediste, pero hay un pequeño problema: como el programa calcula las posiciones con fecha del día anterior no lo recibimos en ninguna de nuestras fuentes de datos, así que  tenéis que entrarlo a mano y sólo se guardan los últimos 30 valores…”

Su ego estaba saciado, ya podía ostentar de que su programa incorporaba el fixing(2), como las herramientas norteamericanas que él había estado usando. El problema, resuelto. Cuando llegó nuestro director de área -tras recibir la felicitación del nuevo director- preocupado por cómo había resuelto el nuevo requerimiento en menos de una semana, soltó una sonora carcajada… al oir mi respuesta.

La realidad objetiva acaba de evaporarse

Mi primer proyecto en el diseño de aplicaciones contemplaba la integración de diez sistemas distintos de información sobre los que el aplicativo construía un banco de datos dónde basar las decisiones estratégicas de una multinacional con más de 5000 empleados sólo en Europa. En 1999 a esto le llámabamos interfases…, no sólo eran datos estructurados de manera distinta, sinó que ademas eran tecnologías diferentes. Como he comentado de manera reiterada: Una vez más, estamos reinventado la rueda, desde que Heissenberg abrió la puerta de la ciencia a cualquier disciplina…

La aparición de nuevas herramientas de gestión de datos es un buen síntoma de que el sector sigue evolucionando. Proponer nuevas iniciativas, nuevas vías de exploración, son puntales de la investigación. Sin embargo, también existe la posibilidad de usar las herramientas existentes de manera distinta a las que inicialmente fueron concebidas. Creo además que esta vía está muy poco explorada y que posiblemente los intereses consumistas del capitalismo salvaje actuan como freno a la explotación de los recursos existentes y lo más grave, actúa como un lastre para la creatividad.

¿Sólo es innovador aquello que plantea nuevas herramientas?

Uno escribe a base de ser minero de si mismo

Una sabia reflexíón como tantas otras del recién fallecido José Luis Sampedro. Cuando escribí acerca del salto generacional que existe con Héctor no lo hice a la ligera. Quiero felicitarle por su temprana experiencia laboral tecnológica y la amplia perspectiva que le proporciona al abordar la cuestión.

Sin embargo, por aquellas fechas ya acumulaba diez años de andadura profesional. Aunque no fuera en el por aquél entonces incipiente sector tecnológico. Esta experiencia que bién podría definirse como Bigdata, tenía el aliciente de que la gestión de los datos no se llevaba a cabo en ningún sistema informático.

Gestionar análisis de mercados recibidos por fax o teléfono, noticias financieras en distintos soportes internacionales de prensa, radio y televisión, llamadas telefónicas con participantes del sector, clientes y proveedores y todo ello para tomar decisiones en tiempo real en cuestión de segundos… pegado a pantallas de cotización que se actualizan a un ritmo endiablado, leyendo simultáneamente cartulinas con anotaciones de contactos comerciales,… con el único soporte de un lápiz, un papel y un músculo: el cerebro… Esto es para mi BigData.

A veces, cuesta mucho más eliminar un solo defecto que adquirir cien virtudes

Mi reflexión sobre lo que propone el nuevo BigData no se centra en el aspecto tecnológico, ya que éste se encuentra en los eslabones finales de la cadena de la toma de decisiones, va más allá.

- Qué es información útil y qué no lo es.

- Qué información es necesaria almacenar, cómo y por qué.

- Cuánto tiempo debo almacenar la información procesada, qué riesgo supone el constante cambio tecnológico tanto a nivel de programario como a nivel de maquinaria para poder acceder de nuevo a ella en caso de ser necesaria años después.

Sin embargo no me preocupa en absoluto, las múltiples fuentes de información y soportes, si los entornos son distribuidos, cómo se estructura la información y si esta se define en la capa de datos y/o en la de negocio. Tampoco me preocupa en demasía la inmediatez de respuesta, cuando disponer de una infraestructura para proporcionarla no es rentable económicamente.

Creo que existe un grupo de organizaciones que lo que realmente se enfrentan no es a un problema de herramientas de gestión de datos, sino a un mal diseño, planificación y a una falta de rigor en las previsiones. No es un problema tecnológico, es estratégico.

La rueda más estropeada del carro es la que hace más ruido

Han transcurrido más de 2000 años desde que Esopo vaticinó dónde radica el problema. Soy de la humilde opinión que la inmediatez de respuesta a cualquier pregunta o “necesidad” que se formule a un sistema no es clave. ¿Tiene sentido desarrollar un sistema en tiempo real que refleje la tendencia de tópicos que se publican en una red social, cuando éstos pueden ser una gilipollez difundia por insensatos?  Desde luego, sólo a un necio se le puede ocurrir tamaña barbaridad… ¿No es más lógico procesar la información obtenida antes de entregarla?

Existen organizaciones e instituciones que se enfrentan a una gestión de información que supera la capacidad de gestión de sistemas tecnológicos rentables, suelen ser del ámbito de la investigación científica, el almcenamiento de conocimiento y contados casos más.

Pero para la inmensa mayoría el BigData es sólo un montaje mercadotécnico que no supondrá ni un valor añadido, ni tan solo una amenaza, en el  mejor de los casos: sólo una distracción.

El mundo es un absurdo animado que rueda en el vacío

… para asombro de [algunos] de sus habitantes, Gustavo Adolfo Bécquer. La definición más coherente que he leído sobre BigData es la que se refiere al manejo de un volumen de información que no se puede procesar por métodos tradicionales o convencionales. Me queda la duda, por saber a qué se refieren cuando citan métodos tradicionales y/o convencionales en un sector que aún no ha cumplido el siglo de edad.

¿Cuántas empresas que disponían de sistemás analíticos BigData fueron capaces de preveer la última y vigente crisis económica mundial? Entonces, el nuevo Bigdata muestra su auténtica naturaleza, una naturaleza volátil y efímera… como casi todo lo que construye la humanidad moderna, la que se rige por un capitalismo salvaje, de consumo voraz, de escasa maduración. Con un presente y destino insostenibles: dónde se impone lo nuevo pese a que sea mediocre y más caro que lo que le precede.

¿Será BigData uno de sus inventos… uno de sus hijos predilectos?¿Será la próxima burbuja tecnológica? O simplemente, es la continuación de la misma que nos ha sumido en la presente crisis mundial…

NOTAS:

(1) Gregalada es una licencia basada en la palabra “Gregal” que en catalán se refiere al viento del noreste y que en la  gografía concreta a la que se hace referencia, provoca los temporales marítimos.
(2) Pero ignorando que la herramienta que manejaba realizaba los cálculos cuatro veces más precisos que sus homólogas norteamericanas disponibles en el mercado, que tenían una atractiva interfaz visual pero un coste de mantenimiento diez veces mayor.

BIG, BIG… HURRA! (II)

Respondiendo a Héctor acerca las ballenas voladoras, las preguntas que les podíamos formular y las distintas cuestiones cetáceas que nos atañen, añado la segunda parte (de hecho era un todo que dividí para no cansar al posible e incauto lector) con la intención de aclarar un poco más mi opinión.

La reflexión calmada y tranquila desenreda todos los nudos.

Ni nos enfrentamos a una ballena, ni actuamos como tal, si hicieramos ésto último viviríamos en un mundo sostenible. Sugiere Héctor que la variedad de orígenes de datos está vinculado en mayor o menor medida, al surgimiento de internet de las cosas ¿? … Harold MacMillan tenía razón, frente a los grandes retos sólo cabe detenerse a pensar con calma y tranquilidad (y si te gusta, disfrutar de un buen habano).

Todo dato tiene estructura clara y concisa, así lo establece su propia definición, podrá ser  simple o compleja. Otra cuestión es que no la sepamos distinguir, o que al contrastar o relacionar un dato con otro, ambos no tengan una estructura homogénea. Para disipar dudas al respecto y con palabras sencillas, el dato más simple que podemos almacenar consta de tres atributos: un calificador, un cuantificador y un contexto. Hasta los organismos unicelulares más sencillos tiene estructura…

A pesar de que la RAE(1) define como sinónimo de dato, el documento, en el contexto de almacenamiento de los mismos en el que nos centramos, no es del todo así. Un documento es un conjunto de datos organizados con una estructura determinada. Es aquí dónde radica el problema acerca la complejidad de establecer una estructura que acertadamente cita Héctor, pero no son los datos, son los documentos, o los registros. Creo que ningún profesional sensato definiría con antelación un modelo de algo que desconoce, salvo que pretenda imponer un “nuevo orden mundial”, no nos confundamos. Es cierto que la catalogación y presentación de la información debe evolucionar en reacción a una constante pero a veces infundada necesidad de cambio, pero esta reacción no debe traducirse en una acción inmediata: un disparo precipitado no suele hacer blanco.

La gente joven está convencida de que posee la verdad.

Desgraciadamente, cuando logran imponerla ya ni son jóvenes ni es verdad. (El Perich, el mismo autor de la gran cita “el llanto del niño es la cosa más enternecedora del mundo… los primeros cinco minutos!) Entiendo que lo que trata de decirnos Héctor es que el reto de gestionar una vasta variedad de soportes de información sigue cirniéndose cual espada de Damocles sobre todos aquellos que tienen (o tenemos) por misión obtener, identificar, ponderar, describir, ordenar y presentar información(2).

Es decir, seguimos teniendo el mismo problema desde el siglo VII antes de Cristo… como poco(3). La gran diferencia que existe con nuestros antecesores, es que los “bigdateros” de antaño no se enfrentaban además a los cortes de electricidad, Talón de Aquiles de todo este castillo de naipes de las TI y las sociedades occidentales.

¿Para qué sirve la información si no se traduce en conocimiento? Sencillamente, para nada bueno… Disponer de un volumen de información, mejor dicho de datos, inimaginable no es ninguna ventaja diferencial para un negocio: no es tierra firme, son arenas movedizas, un laberinto o un espejismo. Volviendo a la RAE: Una base de datos es un conjunto de datos organizado de tal modo que permita obtener con rapidez diversos tipos de información [útil].

La eficacia de una base de datos se mide más por criterios cualitativos que por cuantitativos, acudiendo al refranero español (y a la Ley de Boyle-Mariotte): quién mucho abarca, poco aprieta…

No preguntemos si estamos plenamente de acuerdo,

sino tan sólo si marchamos por el mismo camino, Goethe estaba en lo cierto. En cuanto al término “Inteligencia de Negocio” me remito a lo que expuse en una ponencia sobre como gestionar las tecnologías de la información sin estar enchufados a la corriente eléctrica dirigida a empresarios, que provocó una sonora carcajada y una ovación:
La única Inteligencia de Negocio humana se dió cuando vivíamos en el primer agujero que encontrábamos, paseábamos desnudos con un palo y recolectábamos aquello que estaba a nuestro alcance. Hasta que tuvimos la “brillante” idea de cultivar… Ahí, todo vestigio de inteligencia se desvaneció, sólo falta revisar nuestra historia para darnos cuenta…

Como comenté en la primera parte, la clave de la investigación y del progreso también se basa en hacernos las preguntas adecuadas y Héctor a mi entender las plantea:

  • ¿Somos capaces de catalogar de manera eficiente información que tiene distintos orígenes de datos?
  • ¿Somos capaces de hacerlo de manera eficaz y a un precio razonable con las herramientas que disponemos?

A la que añadiría:

  • ¿Se ha atrofiado tanto nuestra creatividad que dependemos de las herramientas para resolver los problemas de a diario?

Haría cualquier cosa por recuperar la juventud… excepto hacer ejercicio, madrugar, o ser un miembro útil de la comunidad.
- Oscar Wilde

NOTAS

(1) dato (RAE).
(Del lat. datum, lo que se da).

  1. m. Antecedente necesario para llegar al conocimiento exacto de algo o para deducir las consecuencias legítimas de un hecho.
  2. m. Documento, testimonio, fundamento.
  3. m. Inform. Información dispuesta de manera adecuada para su tratamiento por un ordenador.

(2) Se trata de una breve enumeración del método de Pensato para elaborar un repertorio, que podéis consultar en http://condebond.wordpress.com/2010/01/20/apuntes-sobre-bibliografia-el-repertorio/

(3) Voluntariamente no he incluido el término catalogar, pues al hacer referencia a las que hasta la fecha, se consideran las primeras bibliotecas, el sistema de catalogación no existía como tal ya que la indexación por orden alfabético por ejemplo, no se introdujo hasta el siglo XVI. Recomiendo además la lectura de todo el documento:
Contienda por el control documentario: etapas pretécnica y técnica en catalogación de María Rosa Garrido Arilla, Primer Congreso Universitario de Ciencias de la Documentación [p-213]
En línea http://pendientedemigracion.ucm.es/info/multidoc/multidoc/revista/num10/paginas/pdfs/mrgarrido.pdf [Consulta realizada en abril de 2013]

Una trentena…

Sant Jordi, una trentena ha passat
que avui lluny de terra estimada,
pubilla, hereu i dolça aimada
alço mon glavi antany esmolat.

Empeny amb força idea agosarada,
neguitós escriure sonet desarmat.
Orgullós de paraula heretada
de l’avi, afronto aquest combat.

Siguin  rosa i llibre ma senyera
d’heroi que sentint falera
malgrat viure temps d’angoixa i plany

de por, conhort i tristesa, enguany
cofoi estigui dant preuat regal
al món la nostra festa nacional

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.