Mi lista de blogs

martes, 20 de octubre de 2015

Realización de una Copia de Seguridad - Oracle 11

Realización de una Copia de Seguridad del
1) Configure el entorno para la base de datos ORCL.
$ . oraenv
ORACLE_SID = [rcat] ? orcl
2) Vuelva a conectarse a RMAN, como en el paso anterior.
$ rman target sys@rcat
target database Password: oracle_4U <<< not displayed
connected to target database: RCAT (DBID= 464959795)
RMAN>
3) Realice copias de seguridad de la base de datos del catálogo de recuperación. En
esta ocasión, la operación se debe realizar correctamente.
RMAN> backup database;
Starting backup at 21-JUL-09
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=40 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=+DATA/rcat/system01.dbf
input datafile file number=00002 name=+DATA/rcat/sysaux01.dbf
input datafile file number=00003 name=+DATA/rcat/undotbs01.dbf
input datafile file number=00005 name=+DATA/rcat01.dbf
input datafile file number=00004 name=+DATA/rcat/users01.dbf
channel ORA_DISK_1: starting piece 1 at 21-JUL-09
channel ORA_DISK_1: finished piece 1 at 21-JUL-09
piece
handle=+FRA/rcat/backupset/2009_07_21/nnndf0_tag20090721t15532
5_0.263.692812405 tag=TAG20090721T155325 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time:
00:02:37
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 21-JUL-09
channel ORA_DISK_1: finished piece 1 at 21-JUL-09
piece
handle=+FRA/rcat/backupset/2009_07_21/ncsnf0_tag20090721t15532
5_0.264.692812569 tag=TAG20090721T155325 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time:
00:00:03
Finished backup at 21-JUL-09
RMAN> exit
4) Ejecute el script disable_asynch_io.sh para desactivar la entrada/salida
(E/S) asíncrona. Después de modificar el sistema, se reinicia la base de datos. De
esta forma, se mejora el rendimiento en los siguientes ejercicios prácticos:
$ ~/labs/disable_asynch_io.sh
Setting up ORCL environment.
ORACLE_SID = [orcl] ? The Oracle base for
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 is
/u01/app/oracle
SQL*Plus: Release 11.2.0.1.0 Production on Tue Jul 21 15:58:51
2009
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 -
Production
With the Partitioning, Automatic Storage Management, OLAP,
Data Mining
and Real Application Testing options
SQL>
System altered.
SQL>
System altered.
SQL> Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> ORACLE instance started.
Total System Global Area 481259520 bytes
Fixed Size 1337324 bytes
Variable Size 360712212 bytes
Database Buffers 113246208 bytes
Redo Buffers 5963776 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 11g Enterprise Edition
Release 11.2.0.1.0 - Production
With the Partitioning, Automatic Storage Management, OLAP,
Data Mining
and Real Application Testing options
Práctica 4-1: Definición del Formato de Fecha y Hora de RMAN
En esta práctica, definirá el formato de fecha/hora que utiliza RMAN para mostrar los
registros de hora.
1) Defina las variables NLS_LANG y NLS_DATE_FORMAT de forma que RMAN
incluya la información de hora en cualquier valor de registro de hora. Agregue las dos
líneas siguientes al archivo ~oracle/.bashrc. A continuación, salga de todas las
ventanas de terminal. De esta forma se garantiza que, cuando cree otras nuevas, esta
configuración sea efectiva.
export NLS_LANG=american_america.al32utf8
export NLS_DATE_FORMAT="yyyy-mm-dd:hh24:mi:ss"
2) Inicie una nueva ventana de terminal y verifique la configuración iniciando RMAN y
enumerando las copias de seguridad de la base de datos del catálogo de recuperación.
a) Configure el entorno para la base de datos ORCL.
$ . oraenv
ORACLE_SID = [orcl] ? orcl
b) Conéctese a RMAN.
$ rman target sys@rcat
target database Password: oracle_4U <<< not displayed
connected to target database: RCAT (DBID= 464959795)
c) Enumere las copias de seguridad y observe el formato del registro de hora.
RMAN> list backup;
using target database control file instead of recovery catalog
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion
Time
------- ---- -- ---------- ----------- ------------ ----------
---------
1 Full 9.36M DISK 00:00:06 2009-07-
21:15:42:05
BP Key: 1 Status: AVAILABLE Compressed: NO Tag:
TAG20090721T154159
Piece Name:
+FRA/rcat/backupset/2009_07_21/ncsnf0_tag20090721t154159_0.262
.692811721
SPFILE Included: Modification time: 2009-07-21:15:32:47

Creación de un Catálogo de Recuperación - Oracle 11

Creación de un Catálogo de Recuperación

1) Utilice DBCA para iniciar el proceso de creación de una base de datos del catálogo de
recuperación.
$ dbca
2) En la página Welcome, haga clic en Next.
3) En la página Operations, seleccione la opción Create a Database y haga clic en Next.
4) En la página Database Templates, deje el valor por defecto para General Purpose o
Transaction Processing y, a continuación, haga clic en Next.
5) En la página Database Identification, introduzca el nombre de la base de datos del
catálogo de recuperación. Utilice rcat.example.com en el valor Global Database
Name. A continuación, haga clic en Next.
6) En la página Management Options, anule la selección de la opción Configure
Enterprise Manager y, a continuación, haga clic en el separador Automatic
Maintenance Tasks.
7) En la página Automatic Maintenance Tasks, anule la selección de “Enable automatic
maintenance tasks” y, a continuación, haga clic en Next.
Práctica 3-1: Creación de un Catálogo de Recuperación
(continuación)
Oracle Database 11g: Taller de Administración II A-17
8) En la página Database Credentials, seleccione la opción Use the Same Administrative
Password for All Accounts. A continuación, introduzca oracle_4U en los campos
de contraseña y haga clic en Next.
9) En la página Database File Locations, seleccione Automatic Storage Management
(ASM) como valor para Storage Type. Haga clic en Use Common Location for All
Database Files y, a continuación, utilice el botón Browse para seleccionar el grupo de
discos +DATA y haga clic en OK.
10) A continuación, haga clic en Next.
11) En la página Recovery Configuration, seleccione Specify Flash Recovery Area,
utilice el botón Browse para seleccionar el grupo de discos +FRA (haga clic en OK)
y asegúrese de que el valor de Flash Recovery Area Size sea 4062 M Bytes. A
continuación, haga clic en Next.
12) En la página Database Content, confirme que la opción Sample Schemas no está
seleccionada y, a continuación, haga clic en Next.
13) En la página Initialization Parameter, defina el tamaño de memoria en 303 MB, haga
clic en Use Automatic Memory Management y, a continuación, haga clic en el
separador Character Sets.
14) Haga clic en Use Unicode (AL32UTF8) y, a continuación, haga clic en Next.
15) Si aparece la página Security Settings, mantenga los valores por defecto y, a
continuación, haga clic en Next.
16) En la página Database Storage, revise la configuración y, a continuación, haga clic en
Next.
17) En la página Creation Options, asegúrese de que Create Database sea la única opción
seleccionada y, a continuación, haga clic en Finish.
18) Revise la página Confirmation y, a continuación, haga clic en OK para iniciar el
proceso de creación de la base de datos.
19) El asistente de creación de bases de datos ahora crea la base de datos.
20) Cuando termine de ejecutarse el asistente de configuración de bases de datos,
consulte la página final y, a continuación, haga clic en Exit.
En esta práctica, configurará la base de datos del catálogo de recuperación con un ID de
usuario y los privilegios adecuados, además de registrar una base de datos.
1) Utilice SQL*Plus para configurar la base de datos del catálogo de recuperación.
Conéctese a él como SYS a la base de datos RCAT.
$ sqlplus sys as sysdba
Enter password: oracle_4U@rcat <<<not displayed
SQL>
2) Cree un tablespace denominado RCAT para que contenga los datos del repositorio.
Asígnele un tamaño de 15 MB.
SQL> CREATE TABLESPACE rcat DATAFILE '+DATA/rcat01.dbf' SIZE
15M;
Tablespace created.
SQL>
3) Cree un usuario que será el propietario de los datos del catálogo de recuperación.
Asigne al usuario el nombre RCATOWNER. El tablespace por defecto debe ser el
tablespace RCAT y el usuario debe tener una cuota ilimitada en dicho tablespace.
SQL> CREATE USER rcatowner IDENTIFIED BY "oracle_4U"
2 DEFAULT TABLESPACE rcat QUOTA unlimited on rcat;
User created.
SQL>
4) Otorgue el rol RECOVERY_CATALOG_OWNER al usuario RCATOWNER .
SQL> GRANT recovery_catalog_owner to rcatowner;
Grant succeeded.
SQL> exit
En esta práctica, creará el catálogo de recuperación dentro de la base de datos del
catálogo de recuperación que ha preparado.
1) Conéctese a la base de datos del catálogo de recuperación mediante RMAN.
Conéctese como propietario del catálogo de recuperación que acaba de crear.
$ rman catalog rcatowner@rcat
Recovery Manager: Release 11.2.0.1.0 - Production on Fri Jul
10 19:54:04 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All
rights reserved.
recovery catalog database Password:oracle_4U <<<not displayed
connected to recovery catalog database
RMAN>
2) Cree el catálogo de recuperación. Este comando puede tardar varios minutos en
terminar.
RMAN> create catalog;
recovery catalog created
RMAN> exit

martes, 13 de octubre de 2015

Ver limites de conexión

Consultas en Oracle, para ver el limite de conexión de los usuarios:


select * from USER_RESOURCE_LIMITS;

Hay cuatro que pueden ser su problema:
LOGICAL_READS_PER_SESSION: Bloques totales de lectura en una sesión
LOGICAL_READS_PER_CALL: Bloques totales de lectura en una llamada.
COMPOSITE_LIMIT: Costo de recursos total para una sesión.
CONNECT_TIME: Tiempo total de conexión para un usuario.


select * from USER_SYS_PRIVS;

martes, 29 de septiembre de 2015

Programación en PHP - WEB - Agrega a tu web comentarios y mensajes privados

Actualmente en las paginas web es muy frecuente querer agregar comentarios o mensajes privados. Como me lo han solicitado a mi correo, voy a postear el código.
Espero que les sea útil y de lo comprendan y sino me consultan.

Primero, vamos a crear las tablas en nuestra Base de Datos mysql. En el post anterior explique como crear las tablas y como crear una base. Con el código que les dejo solo deben ejecutarlas y ya tendrán las tablas. Luego les dejare los php para armar el procedimiento.

Paso 1

-- phpMyAdmin SQL Dump
-- --------------------------------------------------------
-- Estructura de tabla para la tabla `comentarios`
--

CREATE TABLE IF NOT EXISTS `comentarios` (
  `idcomentario` INT(11) NOT NULL AUTO_INCREMENT,
  `idnombre` INT(11) NOT NULL,
  `nombre` VARCHAR(11) NOT NULL,
  `idperfil` INT(11) NOT NULL,
  `fecha` DATE NOT NULL,
  `comentario` longtext NOT NULL,
  PRIMARY KEY  (`idcomentario`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=33 ;

--
-- Aplicar en la base de datos para la tabla `comentarios`
--

INSERT INTO `comentarios` (`idcomentario`, `idnombre`, `nombre`, `idperfil`, `fecha`, `comentario`) VALUES
(32, 1, 'Felipe', 2, '0000-00-00', 'Te deje muchos mensajes '),
(31, 3, 'Maria', 2, '0000-00-00', 'si recien me conecto'),
(30, 3, 'Maria', 1, '0000-00-00', 'estas?'),
(29, 2, 'Felipe', 3, '0000-00-00', 'si claro'),
(28, 2, 'Felipe', 1, '0000-00-00', 'Holaaa'),
(27, 1, 'Felipe', 3, '0000-00-00', 'hola, estas ahi?'),
(26, 1, 'Felipe', 2, '0000-00-00', 'Holaaa');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `mensajes`
--

CREATE TABLE IF NOT EXISTS `mensajes` (
  `idmensaje` INT(11) NOT NULL AUTO_INCREMENT,
  `nombre` longtext NOT NULL,
  `mensaje` longtext NOT NULL,
  `asunto` longtext NOT NULL,
  `idnombre` INT(11) NOT NULL,
  `receptor` longtext NOT NULL,
  `idreceptor` INT(11) NOT NULL,
  PRIMARY KEY  (`idmensaje`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

--
-- Aplicar en la base de datos para la tabla `mensajes`
--

INSERT INTO `mensajes` (`idmensaje`, `nombre`, `mensaje`, `asunto`, `idnombre`, `receptor`, `idreceptor`) VALUES
(11, 'Felipe', 'hola', 'Hola', 1, 'Felipe', 2),
(10, 'Felipe', 'lalalala', 'estas', 2, 'Felipe', 1),
(6, 'maria', 'creo que si', 'Hola', 3, 'Felipe', 2),
(7, 'Felipe', 'sdfasdfasdfasdf', 'Holasdkàsdf', 1, 'Felipe', 2),
(8, 'Felipe', 'afdsfsdfasdfasdfasdf', '131234', 1, 'Felipe', 2),
(9, 'Felipe', 'dasdfsdfsdf', 'juuuujujujujujuj', 1, 'Felirpe', 2);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `pruebas`
--

CREATE TABLE IF NOT EXISTS `pruebas` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `nick` VARCHAR(20) NOT NULL,
  `pass` VARCHAR(32) NOT NULL,
  `mail` VARCHAR(40) NOT NULL,
  `codigo` VARCHAR(20) NOT NULL,
  `estado` INT(1) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `nick` (`nick`,`pass`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Aplicar en la base de datos para la tabla `pruebas`
--

INSERT INTO `pruebas` (`id`, `nick`, `pass`, `mail`, `codigo`, `estado`) VALUES
(1, 'Felipe', 'e10adc3949ba59abbe56e057f20f883e', 'felipe_gonza@hotmail.com', '4ea2ffdde8b28', 1),
(2, 'Felipe', 'e10adc3949ba59abbe56e057f20f883e', 'asd@asd.asd', '4ea4c6f353ecb', 1),
(3, 'maria', 'e10adc3949ba59abbe56e057f20f883e', 'maria@hotmail.com', '4ea598a2632ed', 1);

Paso 2

perfil.php

<?php
include("conexion.php");
if($_SESSION['logeado'] == true){
    $id = $_GET['id'];
    if(isset($id)){//compruebo si id tiene valor
    $resultado = mysql_query("SELECT nick, mail FROM pruebas WHERE (id = '$id')");
    $fila = mysql_fetch_array($resultado);
    if($_SESSION['nick'] == $fila['nick']){/* perfil de usuario logeado cuando id tiene valor, y si la sesion en que estoy logeado coincide con la de los datos trtaidos por la id, estoy en mi perfil*/
        echo "Este es su perfil ".$_SESSION['nick'];
        ?>
        </br></br>
        <a href="<?php $_SERVER['PHP_SELF']?>?desconectar=1">Salir</a>
        </br>
        </br>
        <a href="<?php $_SERVER['PHP_SELF']?>?borrar=1">Eliminar cuenta</a>
        </br>
        </br>
        <a href="<?php $_SERVER['PHP_SELF']?>?cambiar=1">Cambiar contrasea</a>
        </br>
        </br>
        <a href="leermensaje.php">Leer mensajes privados</a>
        <?php
        $idperfil = $_GET['id'];
        $resultado = mysql_query("SELECT nombre, fecha, comentario, idnombre FROM comentarios WHERE (idperfil = '$idperfil')");
        while($fila = mysql_fetch_array($resultado)){
            echo "<br/>";
            echo "<br/>";
            echo "Nombre: <a href='perfil.php?id=".$fila['idnombre']."'>".$fila['nombre']."</a>";
            echo "<br/>";
            echo "----";
            echo "<br/>";
            echo "Comentario: ".$fila['comentario'];
            echo "<br/>";
            echo "---------------------------------------";
            echo "<br/>";
          }
        }
    else{/*perfil de otro usuario, porque el nick, no coincide con el de la persona logeada*/
        echo "Este es el perfil de ".$fila['nick'].", y su mail es ".$fila['mail'];
        ?>
        </br>
        </br>
        <a href="enviarmensaje.php">Enviar mensaje privado</a>
        </br>
        <?php
        $_SESSION['idreceptor'] = $_GET['id'];
        if(isset($_POST['mandar'])){
            if(isset($_POST['comentario'])){
                $comentario = $_POST['comentario'];
                $nombre = $_SESSION['nick'];
                $fecha = time();
                $datofecha = date("d-m-Y" , $fecha);
                $idperfil = $_GET['id'];
                $idnombre = $_SESSION['id'];
                if(mysql_query("INSERT INTO comentarios (comentario,nombre,fecha,idperfil,idnombre) VALUES ('$comentario','$nombre','$datofecha','$idperfil','$idnombre')")){
                    echo "<br/>";
                    echo "<br/>";
                    echo " Comentario subido con exito";
                }
                else{
                    echo "Hubo un fallo al poner el comentario, por favor vuelva a intentarlo";
                }
            }
            else{
                echo "Debe introducir un comentario";
            }
        }
        ?>
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Perfil</title>
        </head>
        <body>
        <br/>
        Deja tu comentario!
        <form method="post" action="perfil.php?id=<?php echo $_GET['id']; ?>">
        <textarea name="comentario"></textarea>
        <input type="submit" name="mandar">
        </form>
        </body>
        </html>
    <?php
        $idperfil = $_GET['id'];
        $resultado = mysql_query("SELECT nombre, fecha, comentario, idnombre FROM comentarios WHERE (idperfil = '$idperfil')");
        while($fila = mysql_fetch_array($resultado)){
            echo "<br/>";
            echo "<br/>";
            echo "Nombre: <a href='perfil.php?id=".$fila['idnombre']."'>".$fila['nombre']."</a>";
            echo "<br/>";
            echo "----";
            echo "<br/>";
            echo "Comentario: ".$fila['comentario'];
            echo "<br/>";
            echo "---------------------------------------";
            echo "<br/>";
          }
    }
  }
  else{//perfil de usuario logeado cuando id no tiene valor
        echo "Este es su perfil ".$_SESSION['nick'];
        ?>
        </br></br>
        <a href="<?php $_SERVER['PHP_SELF']?>?desconectar=1">Salir</a>
        </br>
        </br>
        <a href="<?php $_SERVER['PHP_SELF']?>?borrar=1">Eliminar cuenta</a>
        </br>
        </br>
        <a href="<?php $_SERVER['PHP_SELF']?>?cambiar=1">Cambiar contrasea</a>
        </br>
        </br>
        <a href="leermensaje.php">Leer mensajes privados</a>      
        <?php
        $nick = $_SESSION['nick'];
        $resultado = mysql_query("SELECT id FROM pruebas WHERE (nick = '$nick')");
        $fila = mysql_fetch_array($resultado);
        $idperfil = $fila['id'];
        $resultado = mysql_query("SELECT nombre, fecha, comentario, idnombre FROM comentarios WHERE (idperfil = '$idperfil')");
        while($fila = mysql_fetch_array($resultado)){
            echo "<br/>";
            echo "<br/>";
            echo "Nombre: <a href='perfil.php?id=".$fila['idnombre']."'>".$fila['nombre']."</a>";
            echo "<br/>";
            echo "----";
            echo "<br/>";
            echo "Comentario: ".$fila['comentario'];
            echo "<br/>";
            echo "---------------------------------------";
            echo "<br/>";
        }
  }
}
else{
    echo "Tienes que estar logeado para estar aqui";
}
?>

PASO 3 

login.php

<?php
include("conexion.php");
if(isset($_POST['enviar']))
{
    $nick = $_POST['nick'];
    $pass = $_POST['pass'];
    if(isset($nick) && isset($pass))
    {
        $resultado = mysql_query("SELECT nick, pass ,estado, id FROM pruebas WHERE (nick = '$nick') AND (pass = md5('$pass'))");
        if(mysql_num_rows($resultado) > 0)
        {
            $fila = mysql_fetch_array($resultado);
            if($fila['estado'] == 1){
                $_SESSION['nick'] = $nick;
                $_SESSION['logeado'] = true;
                $_SESSION['id'] = $fila['id'];
            }
            else{
                echo "Su cuenta no a sido activada";
            }
        }
        else{
        echo "Usuario o contraseña incorrectos.";
        }
    }
    else{
    echo "Usuario o contraseña incorrectos.";
    }
}
?>
<?php
if($_SESSION['logeado'] == true){//abre logeo
echo "Usted ".$_SESSION['nick']." esta logeado";
?>
</br></br>
<a href="<?php $_SERVER['PHP_SELF']?>?desconectar=1">Salir</a>
</br>
</br>
<a href="<?php $_SERVER['PHP_SELF']?>?borrar=1">Eliminar cuenta</a>
</br>
</br>
<a href="<?php $_SERVER['PHP_SELF']?>?cambiar=1">Cambiar contraseña</a>
</br>
</br>
<a href="leermensaje.php">Leer mensajes privados</a>
<?php
    $nick = $_SESSION['nick'];
    $resultado = mysql_query("SELECT id FROM pruebas WHERE (nick = '$nick')");
    $fila = mysql_fetch_array($resultado);
    $idperfil = $fila['id'];
    $resultado = mysql_query("SELECT nombre, fecha, comentario, idnombre FROM comentarios WHERE (idperfil = '$idperfil')");
    while($fila = mysql_fetch_array($resultado)){
    echo "<br/>";
    echo "<br/>";
    echo "Nombre: <a href='perfil.php?id=".$fila['idnombre']."'>".$fila['nombre']."</a>";
    echo "<br/>";
    echo "----";
    echo "<br/>";
    echo "Comentario: ".$fila['comentario'];
    echo "<br/>";
    echo "---------------------------------------";
    echo "<br/>";
    }
}//if donde termina el logeo
else{
?>
<html>
<head>
<title>Login</title>
</head>
<body>
<form method="post" action="login.php">
Nick:<input type="text" name="nick">
Password:<input type="password" name="pass">
<input type="submit" name="enviar">
</form>
<a href="<?php $_SESSION['PHP_SELF']?>?recordar=1">Recordar contraseña</a>
</body>
</html>
<?php
}
?>

PASO 4

leermensaje.php

<?php
include("conexion.php");
if($_SESSION['logeado'] == true){
    if(empty($_GET['idmensaje'])){
        $id = $_SESSION['id'];
        $nick = $_SESSION['nick'];
        $resultado = mysql_query("SELECT * FROM mensajes WHERE (idreceptor = '$id')");
        echo "<table width='737' height='31' border='1'>";
        echo "<tr>";
        echo "<td width='109'>De:</td>";
        echo "<td width='265'>Asunto:</td>";
        echo "<td width='400'>Mensaje:</td>";
        echo "</tr>";
        echo "</table>";
        while($fila = mysql_fetch_array($resultado)){
        echo "<table width='737' height='31' border='1'>";
        echo "<tr>";
        echo "<td width='109'><a href='leermensaje.php?idmensaje=".$fila['idmensaje']."'>".$fila['nombre']."</a></td>";
        echo "<td width='265'>".$fila['asunto']."</td>";
        echo "<td width='400'>".$fila['mensaje']."</td>";
        echo "</tr>";
        echo "</table>";
        }
    }
    else{
        $idmensaje = $_GET['idmensaje'];
        $resultado = mysql_query("SELECT nombre, mensaje, asunto FROM mensajes WHERE (idmensaje = '$idmensaje')");
        $fila = mysql_fetch_array($resultado);
        echo "De: ".$fila['nombre'];
        echo "<br />";
        echo "--------------------------------------------------------------------------------";
        echo "<br />";
        echo "Asunto: ".$fila['asunto'];
        echo "<br />";
        echo "--------------------------------------------------------------------------------";
        echo "<br />";
        echo "Mensaje: ".$fila['mensaje'];
    }
}
else{
    echo "Debe estar logeado para estar aqui";
}
?>

PASO 5

registro.php

<?php
include("conexion.php");
if(isset($_POST['registro']))
{
  if(($_POST['nick'] != '') && ($_POST['pass'] != '') && ($_POST['mail'] != ''))
  {
   if($_POST['pass'] == $_POST['confpass'])
    {
     $nick = $_POST['nick'];
     $pass = md5($_POST['pass']);
     $mail = $_POST['mail'];
      $resultado = mysql_query("SELECT nick, mail FROM pruebas WHERE (nick = '$nick') OR (mail = '$mail')");
      $fila = mysql_fetch_array($resultado);
      if($fila['nick'] == $nick)
      {
      echo "El nick esta en uso";
      }
      elseif($fila['mail'] == $mail)
      {
      echo "El mail esta en uso";
      }
      else
      {
      if(eregi("@" , $mail)){
      $codigo= uniqid();
      mysql_query("insert into pruebas(nick,pass,mail,codigo,estado) values                                         ('$nick','$pass','$mail','$codigo',0)");
      echo 'Los datos han sido enviados correctamente';
      }
      else
      echo "Mail no valido";
      }
    }
    else
    {
    echo 'Las contraseñas no coinciden';
    }
  }
    else
    {
    echo 'Debera completar todos los campos';
    }
}
if($_SESSION['logeado'] == true){
echo "Usted esta logeado";
}
else{
?>
<html>
<head>
<title>Registro</title>
</head>
<body>
<form method="post" action="registro.php">
nick
<input type="text" name="nick" value="<?php echo $_POST['nick'];?>">
pass
<input type="password" name="pass">
confirmar contraseña
<input type="password" name="confpass">
mail
<input type="text" name="mail" value="<?php echo $_POST['mail'];?>">
<input type="submit" value="enviar" name="registro">
</form>
</body>
</html>
<?php
}
?>

PASO 6

enviarmensaje.php

<?php
include("conexion.php");
if($_SESSION['logeado'] == true){
    if(isset($_POST['mandar'])){
        if(isset($_POST['asunto']) && isset($_POST['mensaje'])){
            $id = $_SESSION['idreceptor'];
            $resultado = mysql_query("SELECT nick, id FROM pruebas WHERE (id = '$id')");
            $fila = mysql_fetch_array($resultado);
                $idreceptor = $fila['id'];
                $receptor = $fila['nick'];
                $idnombre = $_SESSION['id'];
                $nombre = $_SESSION['nick'];
                $asunto = $_POST['asunto'];
                $mensaje = $_POST['mensaje'];
                if(mysql_query("INSERT INTO mensajes (nombre,mensaje,asunto,idnombre,receptor,idreceptor) VALUES ('$nombre', '$mensaje', '$asunto', '$idnombre', '$receptor', '$idreceptor')")){
                    echo "Mensaje enviado con exito";
                }
                else{
                    echo "Error al enviar el mensaje, por favor vuelva a intentarlo";
                }
        }
        else{
            echo "Debe rellenar todos los campos para enviar un mensaje privado";
        }
    }
    ?>
    <html>
    <head>
    <title>Enviar mensaje</title>
    </head>
    <body>
    <form method="post" action="enviarmensaje.php">
    Asunto<input type="text" name="asunto" />
    Mensaje<textarea name="mensaje"></textarea>
    <input type="submit" name="mandar" />
    </form>
    </body>
    </html>
    <?php
}
else{
    echo "Para enviar un mensaje debe estar logeado";
}
?>

PASO 7

confirmar.php

<?php
include("conexion.php");
$codigo = $_GET['codigo'];
$resultado = mysql_query("SELECT estado FROM pruebas WHERE (codigo = '$codigo')");
$fila = mysql_fetch_array($resultado);
if($fila['estado'] == 0){
    $estado = 1;
    if(mysql_query("UPDATE pruebas SET estado = '$estado' WHERE (codigo = '$codigo')")){
        echo "Su cuenta a sido activada";
    }
    else{
    echo "Se a producido un error, por favor vuelva a cargar la pagina";
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Confirmar cuenta</title>
</head>
<body>
</body>
</html>

Codigo para hacer un carrito en PHP - Para tu pagina web

Voy a dejar un código con la instrucción para probar en la web como hacer un carrito.
Claro que el código deben de modificarlo para adaptarlo a la web de ustedes.

Esto es muy necesario para las paginas que presentan la carga de productos que luego deben ser seleccionados por el usuario.

Este ejemplo, es bien sencillo y adaptable


CATALOGO.PHP

<?php
ob_start("ob_gzhandler");
//error_reporting(E_ALL);
//@ini_set('display_errors', '1');
//Las funciones ob_start y ob_end_flush te permiten escojer en qué momento enviar el resultado
// de un script al navegador. Si no las utilizamos estamos
//obligados a que nuestra primera línea de código sea session_start() u obtendremos un error
session_start();
//conectamos a la base de datos
mysql_connect("localhost","root","");
mysql_select_db("carro");
//rescatamos los valores guardados en la variable de sesión (si es que hay alguno, cosa que
//comprobamos con isset) y los asignamos a $carro. Si no existen valores, ponemos a false el
//valor de $carro
if(isset($_SESSION['carro']))
$carro=$_SESSION['carro'];else $carro=false;
//y hacemos la consulta
$qry=mysql_query("select * from catalogo order by producto asc");
?>
<html>
<head>
<title>CAT&Aacute;LOGO</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.catalogo {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 9px;
color: #333333;
}
-->
</style>
</head>
<body>
<table width="272" align="center" cellpadding="0" cellspacing="0" style="border: 1px solid #000000;">
  <tr valign="middle" bordercolor="#FFFFFF" bgcolor="#DFDFDF" class="catalogo">
    <td width="170"><strong>Producto</strong></td>
    <td width="77"><strong>Precio</strong></td>
    <td width="25" align="right"><a href="vercarrito.php?<?php echo SID ?>" title="Ver el contenido del carrito"><img src="vercarrito.gif" width="25" height="21" border="0"></a></td>
  </tr>
  <?php
  //mostramos todos nuestros artículos, viendo si han sido agregados o no a nuestro carro de compra
  while($row=mysql_fetch_assoc($qry)){
  ?>
  <tr valign="middle" class="catalogo">
    <td><?php echo $row['producto'] ?></td>
    <td><?php echo $row['precio'] ?></td>
    <td align="center"><?php
if(!$carro || !isset($carro[md5($row['id'])]['identificador']) || $carro[md5($row['id'])]['identificador']!=md5($row['id'])){
//si el producto no ha sido agregado, mostramos la imagen de no agregado, linkeada
// a nuestra página de agregar producto y transmitíéndole a dicha
//página el id del artículo y el identificador de la sesión
?><a href="agregacar.php?<?php echo SID ?>&id=<?php echo $row['id']; ?>"><img src="productonoagregado.gif" border="0" title="Agregar al Carrito"></a><?php }
else
//en caso contrario mostramos la otra imagen linkeada., a la página que sirve para borrar el artículo del carro.
{?><a href="borracar.php?<?php echo SID ?>&id=<?php echo $row['id']; ?>"><img src="productoagregado.gif" border="0" title="Quitar del Carrito"></a><?php } ?></td>
  </tr><?php } ?>
</table>
</body>
</html>
<?php
ob_end_flush();
?>




borracar.php

<?php
session_start();
//error_reporting(E_ALL);
//@ini_set('display_errors', '1');
//con session_start() creamos la sesión si no existe o la retomamos si ya ha sido creada
extract($_GET);
//Como antes, usamos extract() por comodidad, pero podemos no hacerlo tranquilamente
$carro=$_SESSION['carro'];
//Asignamos a la variable $carro los valores guardados en la sessión
unset($carro[md5($id)]);
//la función unset borra el elemento de un array que le pasemos por parámetro. En este
//caso la usamos para borrar el elemento cuyo id le pasemos a la página por la url
$_SESSION['carro']=$carro;
//Finalmente, actualizamos la sessión, como hicimos cuando agregamos un producto y volvemos al catálogo
header("Location:catalogo.php?".SID);
?>


agregacar.php

<?php
session_start();
//error_reporting(E_ALL);
//@ini_set('display_errors', '1');
//con session_start() creamos la sesión si no existe o la retomamos si ya ha sido creada
extract($_REQUEST);
//la función extract toma las claves de una matriz asoiativa y las convierte en nombres de variable,
//asignándoles a esas variables valores iguales a los que tenía asociados en la matriz. Es decir, convierte a $_GET['id'] en $id,
//sin que tengamos que tomarnos el trabajo de escribir $id=$_GET['ID'];
mysql_connect("localhost","root","");
mysql_select_db("carro");
//incluímos la conexión a nuestra base de datos
if(!isset($cantidad)){$cantidad=1;}
//Como también vamos a usar este archivo para actualizar las cantidades,
//hacemos que cuando la misma no esté indicada sea igual a 1
$qry=mysql_query("select * from catalogo where id='".$id."'");
$row=mysql_fetch_array($qry);
//Si ya hemos introducido algún producto en el carro lo tendremos guardado temporalmente
//en el array superglobal $_SESSION['carro'], de manera que rescatamos los valores de dicho array
//y se los asignamos a la variable $carro, previa comprobación con isset de que $_SESSION['carro']
//ya haya sido definida
if(isset($_SESSION['carro']))
$carro=$_SESSION['carro'];
//Ahora introducimos el nuevo producto en la matriz $carro, utilizando como índice el id del producto
//en cuestión, encriptado con md5. Utilizamos md5 porque genera un valor alfanumérico que luego,
//cuando busquemos un producto en particular dentro de la matriz, no podrá ser confundido con la posición
//que ocupa dentro de dicha matriz, como podría ocurrir si fuera sólo numérico.
//Cabe aclarar que si el producto ya había sido agregado antes, los nuevos valores que le asignemos reemplazarán
//a los viejos.
//Al mismo tiempo, y no porque sea estrictamente necesario sino a modo de ejemplo, guardamos más de un valor
//en la variable $carro, valiéndonos de nuevo de la herramienta array.
$carro[md5($id)]=array('identificador'=>md5($id),'cantidad'=>$cantidad,'producto'=>$row['producto'],'precio'=>$row['precio'],'id'=>$id);
//Ahora dentro de la sesión ($_SESSION['carro']) tenemos sólo los valores que teníamos (si es que teníamos alguno) antes de ingresar
//a esta página y en la variable $carro tenemos esos mismos valores más el que acabamos de sumar. De manera que
//tenemos que actualizar (reemplazar) la variable de sesión por la variable $carro.
$_SESSION['carro']=$carro;
//Y volvemos a nuestro catálogo de artículos. La cadena SID representa al identificador de la sesión, que, dependiendo
//de la configuración del servidor y de si el usuario tiene o no activadas las cookies puede no ser necesario pasarla por la url.
//Pero para que nuestro carro funcione, independientemente de esos factores, conviene escribirla siempre.
header("Location:catalogo.php?".SID);

?>








viernes, 25 de septiembre de 2015

Entorno para crear tu pagina web en PHP and MYSQL- wampserver

Vamos a comenzar a generar una prueba de pagina web conectada a una base de datos.
Ahora bien, para realizar esto primero debemos tener un ambiente que no sea el productivo. Pero como creamos ese ambiente?, donde y como generamos una base?.

1. Tener el wampserver, sino lo tenemos lo descargamos. En este programa vamos a encontrar como dejar activa la base y que sea utilizada previa a nuestra puesta  en producción :

Para abrir phpMyAdmin, haz clic en la opción phpMyAdmin del menú de WampServer que se obtienen al hacer clic sobre su icono. O accede a la dirección http://localhost/phpmyadmin/.

2. Puedes seleccionar un juego de caracteres en el desplegable Cotejamiento, si lo dejas en blanco se tomará el valor por defecto que variará según la configuración de cada servidor.

3. Es recomendable que escojas la opción utf-8_spanish_ci para maximizar la compatibilidad con todos los caracteres especiales del alfabeto en castellano y para que la salida en cualquier navegador sea correcta.


Una vez que ingresamos a la base, vamos a creer una Base de datos


Y ya, una vez que le damos CREAR, ya tenemos nuestra base de datos y podemos comenzar a generar nuestras tablas, procesos,etc.

Próximamente subire como hacer un login, en PHP-

miércoles, 23 de septiembre de 2015

Hace tu web vos mismo, en pocos pasos

Bueno, si bien este es un ejemplo, pero luego cada uno lo puede adaptar o consultar para modificarlo. Haremos una pequeña prueba, y para ello es necesario que me sigas. 

A empezar a diseñar

1-Bajar dreamweaver, entorno de desarrollo donde haremos la pagina. 
2-Ingresamos a dreamweaver.
3-Vamos a CREAR NUEVO HTML
4-En titulo ponemos el nombre que queremos que figure en el navegador, yo puse "Mi web".
5-Luego vamos a Insertar, Tabla y dentro de la misma escribimos lo que querramos o bien vamos a la solapa codigo e insertamos :
<table>
<tr>
 <td>Estamos trabajando en la web...</td></tr>
<tr>
 <td>Un cambio, una imagen, vos, tu propia pagina</td></tr>
<tr>
 <td>&nbsp;</td></tr>
<tr>
 <td style="font-size: 8pt">dba-mg.blogspot.com.ar</td></tr>
</table>
<br><br>
6- Damos f12 y nos mostrara un mensaje para que la guardemos con un nombre. Siempre a la pagina principal, referencial o home, le colocaremos index.html









¿Como crear una tabla en una base de datos en Mysql php para mi pagina Web?

Bueno, si nos encontramos con el diseño de una pagina web, en la cual es necesario que tengamos una conexión con una base de datos, para realizar por ejemplo el LOGIN, Es importante que contemos, primero con la creación de las tablas en donde iremos a guardar los datos. Como ser, la plantilla de datos de un usuario que se esta resgistrando en nuestra pagina. Haremos entonces la creación de la tabla, luego mostrare como conectar esta base con mi web.

1- Me conecto a la base de datos en la cual, voy a crear la tabla. En este caso a mi tabla la llame Usuarios y los campos que utilice son específicos para el tipo de pagina, ya que la web que diseñe es casi para una interacción de web social y se refiere al trueque, es por ello que contiene tantos campos de localidad. Dichos campos, estan pensados para que los usuarios tengan opciones para juntarse a concretar la operación.

Pero bien, el punto central aqui es que al ingresar a la base, le demos NUEVA para crear la tabla, Alli nos aparecera un campo en blanco que dice NOMBRE DE TABLA y el colocaremos el nombre al cual  haremos referencia, cada vez que lo necesitemos.

Luego completaremos los campos, con NOMBRE, nombre del campo como ser "apellido:", en tipo, colocaremos el tipo de dato a ingresar y así iremos completando todos los campos. Los mas importantes, ademas de los mencionados son: si queremos permitir NULOS es decir NULL, que el usuario pueda dejar vació ese campo, luego el del indice, indicar para esa tabla cual sera el campo id indice. Por ultimo, si queremos que sea incremental.

Una vez hecho esto, hacemos click en guardar y listo, tabla creada.

Les quedara algo así:




Problemas al compilar, herramientas de compilación, errores y formas de solucionar este problema -

Hace poco, sucedió en una complementación que realizo el área de producción, de hacer un cambio sobre algunas tablas. Estos cambios, realizaban insert y update de registros. Por lo tanto, adoptaron la teoría de que no habría ningún problema, pues en el ambiente de test no lo hubo y todo salio exitosamente. Cuando fueron a realizar la compilación de los objetos, se encontraron con algunos errores en la salida. Estos errores claramente mostraban que algunos insert los había realizado y otros no, lo mismo paso con los updates.

¿Que sucedió y porque?
Aquí es donde intervino mi gestión y se comunicaron conmigo. ¿Que paso? al compilar los objetos encontro lineas donde existian caracteres raros, es por ello que algunos registros ingresaron y otros no.
¿Porque sucede esto? en verdad por que paso en el pasaje a producción y no en testing, es por que en testing lo compilaron con una herramienta que difiere a la que utilizaron para aplicarlo en el ambiente productivo. Esto es SUMAMENTE importante que siempre los archivos sean compilados en la misma herramienta. Yo recomiendo que sea en SQLPLUS,

Los dba estamos acostumbrados a utilizar muchas herramientas, en mi caso uso mucho ademas del sqlplus, el toad y el sqldeveloper. Por eso es importante que al momento de compilar un cambio en producción se hagan con sqlplus.

Por otro lado, es fundamental que antes de hacer un cambio se haga un backup de los objetos, en este caso hacer un EXPORT de las tablas era la solución, pero los chicos de producción no lo hicieron :(

Paso que utilice:

Yo tenia un ambiente para probar, en un unix. Entonces lo que hice fue transferirme el backup full de la noche anterior. Yo en mi caso, hago backups full todas las noches luego de la corrida de los procesos batch. En el día, cada 30 minutos hago archive log.
¿Como lo solucione? restaure el backup full, aplique mis archive log previos a este cambio, y realice un export/import de las tablas afectadas. Esta claro, que me hubiese ahorrado todo esto si tenia un export de las tablas previo al cambio, como lo mencione anteriormente.

Entonces, es importante que antes de cualquier cambio:
1- Se tome BACKUP así sea EXPORT, de tablas, esquemas, store procedures, etc, pero tener un resguardo de los cambios sobre los componentes que se modificaran.
2 - Se utilice la misma herramienta de compilación para todos los ambientes.
3 - En caso de incidentes, con el punto 1, restaurar a tiempo los objetos corruptos.

martes, 22 de septiembre de 2015

A tener en cuenta - Puntos claves para la administración de base de datos

Algunos puntos a tener en cuenta para una administración de base de datos:
Es importante, controlar todos los procesos que se ejecutan en nuestra base, si bien por algunos en particular nos suelen llamar y decirnos "el sistema esta lento" y en ese momento hacemos un monitorio sobre la base. Es muy importante, como ejercicio hacer frecuente los controles sobre por ejemplo: cuanto me consumen los query en mi servidor, cuantas conexiones inactivas tengo, ya que esto es un gran problema, o algún bloqueo que se produce en determinados momentos. Tambien las full scan son un gran dolor de cabeza. Esto es frecuente en nuestros sistemas.
Algunas consideraciones a tener en cuenta son:

  • Tener habilitado el informe AWR
  • Colocar alarmas o hacer verificaciones sobre el tamaño de tu tablespace.
  • Validar el uso de recursos de tus procesos dentro del UNIX o de tu servidor.
  • Tener una buena metodología de backup. 
  • Analizar las query que  tienen mayor demora en devolver una salida.
  • Verificar la recreación de indices, como una tarea periódica. 
  • Realizar el calculo de estadísticas periódicamente.




Almacenamiento - Cuotas de tablespace

Las Tablespace ses un lugar de almacenamiento donde los datos reales que subyacen a la base de datos de objetos se pueden cumplir. Proporciona una capa de abstracción entre los datos físicos y lógicos. 
Cuando instalamos la base de datos, se instalan junto a todo el paquete las tablespace por default, pero nosotros como administradores podemos crear las tablespace que consideremos necesarias para la buena administración de nuestra base de datos.
A su vez, es importante tener en cuenta el tamaño que le asignaremos a cada una de ellas. 
Una tablespace, puede tener varios data files, de una buena administración depende tener nuestros datafiles correspondientes de modo UNLIMITED. 
Aquí les dejo el código para verificar los tablespace de sus bases, sus tamaños y espacio ocupado.

Luego, el código lo pueden ir modificando, yo sugiero que este el modo de incremento, es decir el crecimiento que va tendiendo mis tablespace por porcentaje.


Tablespace de mi base y sus características:

  select tablespace_name "Tablespace_Name",
                                      username "Username",
                                      bytes/1024/1024 "Megabytes",
                                      (case when max_bytes = -1 then null
                                            else max_bytes/1024/1024 end) "Max_Megabytes",
                                      (case when max_bytes = -1 then 'UNLIMITED'
                                            else null end) "Quota"
                                 from sys.dba_ts_quotas
                                where (:TABLESPACE_NAME is null or
                                       instr(lower(tablespace_name),lower(:TABLESPACE_NAME)) > 0)
                                order by tablespace_name, username  


Agrego el incremento en %

SELECT T.TABLESPACE_NAME "TABLESPACE", T.STATUS "ESTADO",
ROUND(MAX(D.BYTES)/1024/1024,2) "MB TAMAÑO", ROUND((MAX(D.BYTES)/1024/1024) -
(SUM(DECODE(F.BYTES, NULL,0, F.BYTES))/1024/1024),2) "MB USADOS",
ROUND(SUM(DECODE(F.BYTES, NULL,0, F.BYTES))/1024/1024,2) "MB LIBRES",
 ROUND((100* ROUND((MAX(D.BYTES)/1024/1024) -
(SUM(DECODE(F.BYTES, NULL,0, F.BYTES))/1024/1024),2))/ROUND(MAX(D.BYTES)/1024/1024,2))"% INCREMENTO", SUBSTR(D.FILE_NAME,1,80) "FICHERO DE DATOS" FROM DBA_FREE_SPACE F,
DBA_DATA_FILES D, DBA_TABLESPACES T WHERE T.TABLESPACE_NAME = D.TABLESPACE_NAME
AND F.TABLESPACE_NAME(+) = D.TABLESPACE_NAME AND F.FILE_ID(+) = D.FILE_ID GROUP BY
T.TABLESPACE_NAME, D.FILE_NAME, T.PCT_INCREASE, T.STATUS ORDER BY 1,3 DESC;

lunes, 21 de septiembre de 2015

Permisos y Privilegios

Visualizar permisos y privilegios en ORACLE 

Consideraciones al momento de crear un usuario o cuenta en Oracle, y los privilegios y roles que le podemos asignar.
  • El nombre de usuario no debe superar 30 caracteres.
  • Un método de autentificación. El mas común es una clave o password, pero Oracle 10g soporta otros métodos (como biometric, certificado y autentificación por medio de token).
  • Un Tablespace default, el cual es donde el usuario va a poder crear sus objetos por defecto, sin embargo, esto no significa que pueda crear objetos, o que tenga una cuota de espacio. Estos permisos se asignan de forma separada, salvo si utiliza el privilegio RESOURCE el que asigna una quota unlimited, incluso en el Tablespace SYSTEM! Sin embargo si esto ocurre, ud. puede posteriormente mover los objetos creados en el SYSTEM a otro Tablespace.
  • Un Tablespace temporal, donde el usuario crea sus objetos temporales y hace los sort u ordenamientos.
  • Un perfil o profile de usuario, que son las restricciones que puede tener su cuenta.

Permisos de Objetos:

select grantor            "Grantor",
                                      grantee            "Grantee",
                                      table_name         "Table_Name",
                                      privilege          "Privilege",
                                      initcap(grantable) "Grantable"
                                 from sys.all_tab_privs
                                where grantor = user
                                   or grantee = user
                                order by grantor, grantee, table_name

Privilegios de Columnas:

 select grantor            "Grantor",
                                      grantee            "Grantee",
                                      table_name         "Table_Name",
                                      column_name        "Column_Name",
                                      privilege          "Privilege",
                                      initcap(grantable) "Grantable"
                                 from sys.all_col_privs
                                where grantor = user
                                   or grantee = user
                                order by grantor, grantee, table_name, column_name

Privilegios de Rol:

select username              "User",
                                      granted_role          "Granted_Role",
                                      initcap(admin_option) "Admin_Option",
                                      initcap(default_role) "Default_Role"
                                 from user_role_privs
                                order by username, granted_role

Privilegios del sistema:

select privilege             "Privilege",
                                      initcap(admin_option) "Admin_Option"
                                 from user_sys_privs
                                order by privilege

Seguridad - Políticas de Auditoria

Políticas de seguridad:

Es sumamente importante tener en nuestra base de datos las políticas de seguridad, donde podamos encontrar entre otras cosas, las funciones/procesos/usuarios, que acceden a nuestra base. Como así también tener un control sobre la misma.
Aquí veremos algunas sentencias donde podemos registrar donde guardar esta información que es de gran importancia.

Hay varias opciones, nosotros consultaremos una. Cada negocio lo puede guarda en otra tabla o crear vistas para que estas vayan acumulando y registrando la información.

Políticas de auditoria:

 select OBJECT_SCHEMA,
                                      OBJECT_NAME,
                                      POLICY_NAME,
                                      POLICY_TEXT,
                                      POLICY_COLUMN,
                                      PF_SCHEMA,
                                      PF_PACKAGE,
                                      PF_FUNCTION,
                                      ENABLED
                                 from sys.all_audit_policies
                                order by 1,2,3


  select OBJECT_SCHEMA,
                                      OBJECT_NAME,
                                      POLICY_NAME,
                                      POLICY_TEXT,
                                      POLICY_COLUMN,
                                      PF_SCHEMA,
                                      PF_PACKAGE,
                                      PF_FUNCTION,
                                      ENABLED,
                                      SEL,
                                      INS,
                                      UPD,
                                      DEL,
                                      AUDIT_TRAIL,
                                      POLICY_COLUMN_OPTIONS
                                 from sys.all_audit_policies
                                order by 1,2,3  

Políticas:

select object_owner   "Object_Owner",
                                      object_name    "Object_Name",
                                      policy_group   "Policy_Group",
                                      policy_name    "Policy_Name",
                                      pf_owner       "Policy_Function_Owner",
                                      package        "Package",
                                      function       "Policy_Function",
                                      sel            "Sel",
                                      ins            "Ins",
                                      upd            "Upd",
                                      del            "Del",
                                      chk_option     "Chk_Option",
                                      enable         "Enable",
                                      static_policy  "Static_Policy"
                                 from sys.all_policies    
                                where object_owner = user
                                   or pf_owner = user
                                order by object_owner, object_name, policy_group  

                      select object_owner   "Object_Owner",
                                      object_name    "Object_Name",
                                      policy_group   "Policy_Group",
                                      policy_name    "Policy_Name",
                                      pf_owner       "Policy_Function_Owner",
                                      package        "Package",
                                      function       "Policy_Function",
                                      sel            "Sel",
                                      ins            "Ins",
                                      upd            "Upd",
                                      del            "Del",
                                      idx            "Idx",
                                      chk_option     "Chk_Option",
                                      enable         "Enable",
                                      static_policy  "Static_Policy",
                                      policy_type    "Policy_Type"
                                 from sys.all_policies    
                                where object_owner = user
                                   or pf_owner = user

                                order by object_owner, object_name, policy_group

martes, 15 de septiembre de 2015

Informa AWR - AWR en Oracle Database 10g

El informe AWR nos permite extraer informes del estado de nuestra base de datos para poder relizar tareas de Tuning:





declare
dbid number;
instance_id number;
start_id number;
end_id number;
begin
dbms_output.enable(1000000);
select max(snap_id)-1,max(snap_id) into start_id,end_id from dba_hist_snapshot;
select dbid into dbid from v$database;
select instance_number into instance_id from v$instance;

dbms_output.put_line('<PRE>');
for rc in ( select output from
   table(dbms_workload_repository.awr_report_text(dbid,instance_id,start_id,end_id))
           ) loop
  -- dbms_output.put_line('<BR>');
   dbms_output.put_line(rc.output);
end loop;
dbms_output.put_line('</PRE>');
end;

viernes, 11 de septiembre de 2015

VERIFICAR BLOQUEOS POR USUARIO

Verificar bloqueos por usuario en la base de datos ORACLE.

Esto nos va a servir para poder identificar los bloqueos que cada usuario esta produciendo en el online de la base operativa.


select /*+ ORDERED */
   blocker.sid blocker_sid
,  waiting.sid waiting_sid
,  TRUNC(waiting.ctime/60) min_waiting
,  waiting.request
from (select *
      from v$lock
      where block != 0
      and type = 'TX') blocker
,    v$lock            waiting
where waiting.type='TX'
and waiting.block = 0
and waiting.id1 = blocker.id1

COMO VERIFICAR LAS ESTADISTICAS !!!!


Con este select podremos visualizar las estadísticas de nuestra base de datos.

                         select owner         "Owner",
                                         table_name    "Table_Name",
                                         last_analyzed "Last_Analyzed",
                                         num_rows      "Rows",
                                         avg_row_len   "Average_Row_Length",
                                         decode(iot_type,'YES','IOT','HEAP')||
                                                decode(temporary,'N',null,'-Temporary')||
                                                decode(trim(cache),'N',null,'-Cached')||
                                                decode(partitioned,'NO',null,'-Partitioned')||
                                                decode(compression,'DISABLED',null,'-Compressed') "Table_Type",
                                         owner       sdev_link_owner,
                                         table_name  sdev_link_name,
                                         'TABLE'     sdev_link_type
                                    from sys.dba_tables
                                   where (:OWNER is null or instr(owner,upper(:OWNER)) > 0)
                                     and substr(table_name,1,4) != 'BIN$'
                                     and substr(table_name,1,3) != 'DR$'
                                     and (:TABLE_NAME is null or
                                          instr(upper(table_name),upper(:TABLE_NAME))>0)
                                   order by owner, table_name

INDICES NO UTILIZADOS

                       
Verificar los indices no utilizados, es muy importante a la hora de preocuparnos por la performance de nuestra base de datos. No obstante, es necesario tener periódicamente una reconstrucción de nuestros indices y cálculos de estadisticas. Para optimizar todo tipo de demora de nuestra base es importante contar con varios de estos querys que iremos colocando en el blog.


select owner      "Owner",
                                         index_name "Index Name",
                                         index_type "Index Type",
                                         table_name "Table Name",
                                         owner       sdev_link_owner,
                                         index_name  sdev_link_name,
                                         'INDEX'     sdev_link_type
                                    from sys.dba_indexes
                                   where status = 'UNUSABLE'
                                   order by index_name