lunes, 26 de agosto de 2019

Encontrar una sesion de Oracle para matarla.

Existen diferentes maneras de matar una sesión de oracle tanto dentro de oracle como fuera:

El primer paso es identificar la sesión que queremos matar:


SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A20
COLUMN program FORMAT A45

SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.program
FROM   gv$session s
       JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';
Si tenemos el SID lo agregamos en la condicion de Where y nos es mas directo !!
La sintaxis básica para matar una sesión es la siguiente:
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';
Matar una sesión en windows
C:> orakill ORACLE_SID spid
Matar una sesión en Unix
% kill spid
Si después de unos minutos no ha muerto utilizar
% kill -9 spid
Para verificar que el spid coincide con el proceso del sistema operativo:
% ps -ef | grep ora

viernes, 23 de agosto de 2019

Flash Recovery Area

SQL> select space_limit/1024/1024 "Limit MB", space_used/1024/1024 "Used MB",
 space_reclaimable/1024/1024 "Reclaimable MB"
 from v$recovery_file_dest;  2    3  

  Limit MB    Used MB Reclaimable MB
---------- ---------- --------------
     40960 38990        35818

SQL> select * from v$flash_recovery_area_usage;

alter system set db_recovery_file_dest_size=7G scope=both sid='*';

jueves, 22 de agosto de 2019

Sustitucion y agregado en lineas del VIM

Para sustituir  una palabra o un string de varias palabras  en VIM 

:%s/texto_a_sustituir/texto_nuevo/g

Para agregar una palabra o un string de varias palabras al principio de una linea en VIM 
:%s/^/palabra/g
Para agregar una palabra o un string de varias palabras al final de una linea en VIM 
:%s/$/palabra/g

martes, 20 de agosto de 2019

viernes, 16 de agosto de 2019

Migracion de MariaDB a Oracle 12c via archivo chatos.


Pasos para migrar bases de datos heterogéneas. (paso a paso técnico)


En este caso pasamos de MariaDB a Oracle 12c.


Hay muchas formas de migrar bases de datos por todos los foros, pero en todas siempre algo falla. Esta es la tradicional forma de migración bajando todos los datos a texto y luego subirlos a las tablas destinos de la otra base de datos.
Vamos a empezar con esta migración, tomando el origen de MariaDB (de aquí en mas MDB) y llevando todos los datos de la mejor manera posible a Oracle 12c (de aquí en mas ORC).

Pasos que seguimos:


Ubicados en la base origen MDB,

1.- Seteamos el uso de la base que vamos a migrar:

2.- Nos fijamos la cantidad de tablas que vamos a migrar; y armamos un archivo de texto para luego modificar y hacer un Shell para ejecutar todo.
Y más tablas … solo tomo una porción de la pantalla.

3.- Armamos una sentencia de INTO OUTFILE, para cada tablas, de esta forma hacemos un export de los datos de todas las tablas perteneciente a esa base de datos desde MDB.

Donde seleccionamos todos los campos de la tabla y los exportamos a un archivo de texto en un directorio especifico que le indicamos en la sentencia INTO OUTFILE, de esta forma le decimos donde lo dejamos y de que forma lo dejamos, es decir especificamos como vamos a separar los campos, como terminara la línea y de que tabla lo sacamos.
Esto lo ejecutamos para todas las tablas del listado que obtuvimos antes.
Generará un archivo por cada tabla con los datos, en el directorio donde le dijimos que lo haga en el script, por ejemplo “/migración/<nombre_tabla>.DAT”
A su vez le decimos que la separación de campos se proceda con “,” y el fin de línea sea el control “\n”
Una vez que exportamos todo a TXT debemos llevar todos los archivos de todas la tablas al equipo destino, donde será tomado via el SQL Loader para la suba de datos a las tablas destino.

4.- Pasamos los archivos .DAT al server destino:
  scp <origen>  <usuario>@<server_destino>:<ubicacion_destino>
  scp /migracion/*.dat  dlaadmin@10.20.8.11:/migracion/data/

Una ves que tenemos todo en el server destino, vamos y ejecutamos lo siguiente en dicho Server.


5.- Verificamos que todos los archivos hayan pasada correctamente.

6.- En ambos servidores creamos la misma estructura de directorio para llevar a cabo la migracion, es decir en ambos existe el directorio.
“/migracion”
Tomaremos este como raíz para la migración, de ahí saldrán todos los demás para acomodarlos según tengamos que hacer, por ejemplo
/migracion/log
/migracion/data
/migracion/ctl

En el directorio “/migracion” realice un script que genera los CTL de todas las tablas del owner a  migrar. Cabe destacar que ya nos encontrábamos con un esquema instalado de cero.
Este script es el siguiente.
[oracle@ora01nc001-2 migracion]$ cat gen_todas.sh
#!/bin/bash
# Generacion de CTL para sqlloader.
while read tabla;
do
SALIDA=$(sqlplus -s '/ as sysdba' <<-EOF>> /u05/migracion/$tabla.ctl
set heading off feedback off serveroutput on trimout on pagesize 0

declare
i number :=0;
j number :=0;

begin
  for i in (select * from dba_tables a where a.owner='NEXTCLOUD' and a.table_name ='$tabla') loop
    DBMS_OuTPUT.PUT_LINE ('LOAD DATA');
    DBMS_OUTPUT.PUT_LINE ('INFILE '|| upper(i.table_name) ||'.DAT');
    DBMS_OUTPUT.PUT_LINE ('REPLACE INTO TABLE NEXTCLOUD."'||i.table_name||'"' );
    DBMS_OUTPUT.PUT_LINE ('FIELDS TERMINATED BY '|| chr(39) ||',' ||chr(39) );
    for j in (select * from dba_tab_columns b where b.owner=i.owner and b.table_name=i.table_name order by column_id) loop
      if j.column_id = 1 THEN
        DBMS_OUTPUT.PUT_LINE('("'||j.column_name||'"' );
      ELSE
        DBMS_OUTPUT.PUT_LINE(', "'||j.column_name||'"' );
      END IF;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(')');
  END LOOP;
END;
/
EOF
);
done < /u05/migracion/tablas_nextcloud.txt

[oracle@ora01nc001-2 migracion]$

Donde mediante un loop de un archivo externo lo recorre y crea un archivo CTL por cada fila, ese archivo fue lo que extrajimos al principio, es decir la lista de tablas que pertenece al esquema que vamos a importar. Cabe destacar que tanto el nombre de la tabla como los campos se deben sostener entre comillas debido a como fueron creados.

7.- Luego de esto, ya estamos en condiciones de ejecutar el Sql Loader para cada tabla. Es importante para que no surgan errores incluir los path absolutos en casa Loader.
sqlldr "'/ as sysdba'" control=/u05/migracion/ data=/u05/migracion/data/OC_PRIVATEDATA.DAT log=/u05/migracion/log/0.log

8.- Contamos con un scripts (ingreso_masivo.sh) en el mismo directorio, que une a todos los CTL para ejecutarlos todos juntos.
[oracle@ora01nc001-2 migracion]$ cat ingreso_masivo.sh
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_accounts.ctl data=/u05/migracion/data/OC_ACCOUNTS.DAT log=/u05/migracion/log/oc_accounts.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_activity.ctl data=/u05/migracion/data/OC_ACTIVITY.DAT log=/u05/migracion/log/oc_activity.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_activity_mq.ctl data=/u05/migracion/data/OC_ACTIVITY_MQ.DAT log=/u05/migracion/log/oc_activity_mq.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_addressbookchanges.ctl data=/u05/migracion/data/OC_ADDRESSBOOKCHANGES.DAT log=/u05/migracion/log/oc_addressbookchanges.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_addressbooks.ctl data=/u05/migracion/data/OC_ADDRESSBOOKS.DAT log=/u05/migracion/log/oc_addressbooks.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_fake_user_backend_auth.ctl data=/u05/migracion/data/OC_AMX_FAKE_USER_BACKEND_AUTH.DAT log=/u05/migracion/log/oc_amx_fake_user_backend_auth.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_filesharing_contacts.ctl data=/u05/migracion/data/OC_AMX_FILESHARING_CONTACTS.DAT log=/u05/migracion/log/oc_amx_filesharing_contacts.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_filesharing_templates.ctl data=/u05/migracion/data/OC_AMX_FILESHARING_TEMPLATES.DAT log=/u05/migracion/log/oc_amx_filesharing_templates.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_filesharing_templates_media.ctl data=/u05/migracion/data/OC_AMX_FILESHARING_TEMPLATES_MEDIA.DAT log=/u05/migracion/log/oc_amx_filesharing_templates_media.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_gallery_myalbums.ctl data=/u05/migracion/data/OC_AMX_GALLERY_MYALBUMS.DAT log=/u05/migracion/log/oc_amx_gallery_myalbums.ctl.log
 sqlldr "'/ as sysdba'" control=/u05/migracion/oc_amx_gallery_myalbums_files.ctl data=/u05/migracion/data/OC_AMX_GALLERY_MYALBUMS_FILES.DAT log=/u05/migracion/log/oc_amx_gallery_myalbums_files.ctl.log
y asi sucesivamente con las 76 tablas.
Una vez ejecutado el script con todos los CTL y los DAT ya estaríamos en condiciones de verificar si se cargaron los datos en nueva base de datos.
En el mismo directorio donde ejecutamos el anterior scripts, vamos a encontrar los archivos BAD que son las fallas que nos dan los sqlLoaderl.
Fin

Saber el lag de una standby

[oracle@ORA-sb-0320 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri Aug 16 11:43:32 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> 

with lag as (select cast (value as interval day(2) to second(0)) l from v$dataguard_stats where name='apply lag') select extract(second from l)+extract(minute from l)*60+extract(hour from l)*3600+extract(day from l)*86400 segundos from lag;

  SEGUNDOS
----------
         0

SQL>


select db_unique_name,dest_name,status,gap_status from v$archive_dest_status where status!='INACTIVE';


SQL> /

DB_UNIQUE_NAME                 DEST_NAME                                STATUS    GAP_STATUS
------------------------------ ---------------------------------------- --------- ------------------------
NONE                           LOG_ARCHIVE_DEST_1                       VALID
NONE                           STANDBY_ARCHIVE_DEST                     VALID

SQL>





miércoles, 14 de agosto de 2019

Trabajo con ACL

Sencillamente tenemos que crear una ACL que nos permita acceder al puerto 25 de nuestro servidor de correo.
En este caso lo haremos para
  • SMTP Server 127.0.0.1 (localhost de la BBDD)
  • Puerto 25 ( puerto estandard de correo)
  • usuarios Usuario1 y usuario2
Así pues , ejecutaremos :
begin
--creamos la ACL
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL
   (acl => 'send_mail.xml',
   description => '
   send_mail ACL',
   principal => 'USUARIO1',
   is_grant => true, 
   privilege => 'connect');
-- Asignamos privilegios  al usuario elegido 
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
   acl => 'send_mail.xml',
   principal => 'USUARIO1',
   is_grant  => true,
   privilege => 'connect');
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
   acl => 'send_mail.xml',
   principal => 'USUARIO1',
   is_grant  => true,
   privilege => 'resolve');
-- Asignamos provilegios  al usuario elegido 
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
   acl => 'send_mail.xml',
   principal => 'USUARIO2',
   is_grant  => true,
   privilege => 'connect');
--Asignamos recursos 
 dbms_network_acl_admin.assign_acl (
   acl => 'send_mail.xm',
   host => '127.0.0.1',
   lower_port => 25,
  upper_port => 25);
END;
/
COMMIT;
Si queremos ver las ACL creadas
SELECT * FROM dba_network_acls;
Y los privilegios de cada una de ellas
SELECT acl
      ,principal
      ,privilege
      ,is_grant
      ,invert
      ,start_date
      ,end_date
  FROM dba_network_acl_privileges;

martes, 13 de agosto de 2019

QUERY – SQLs pesadas desde la v$sql

Extraemos las queries mas pesadas de la v$sql
Set verify off
SET LINES 200 
COL SQL_ID HEADING 'sql_id'
COL child_cursor FOR 999999 HEADING 'Child'
COL FIRST_LOAD_TIME HEADING 'Hour Loaded'
COL last_execution FOR A30 HEADING 'Last Execution'
COL executions HEADING 'Executions'
COL pio_per_exec HEADING 'Physical Reads|Per Exec'      
COL lio_per_exec HEADING 'Logical Reads|Per Exec'
COL msec_exec HEADING 'Time (misec)|Per Exec'  
column sample_end format a21 
SELECT * 
FROM
(SELECT SQL_ID, 
CHILD_NUMBER as child_cursor, 
FIRST_LOAD_TIME, 
TO_CHAR(LAST_ACTIVE_TIME,'YYYY/MM/DD HH24:MI:SS') as last_execution ,EXECUTIONS, 
ROUND(DISK_READS/DECODE(EXECUTIONS,0,1,EXECUTIONS)) as pio_per_exec, 
ROUND(BUFFER_GETS/DECODE(EXECUTIONS,0,1,EXECUTIONS)) as lio_per_exec, 
ROUND(ELAPSED_TIME/DECODE(EXECUTIONS,0,1,EXECUTIONS)/1000) as msec_exec 
FROM
 V$SQL 
WHERE   (ELAPSED_TIME >= (SELECT MEDIAN(ELAPSED_TIME) FROM V$SQL) OR    BUFFER_GETS >= (SELECT MEDIAN(BUFFER_GETS) FROM V$SQL) )   
and LAST_ACTIVE_TIME >= sysdate-NVL(&mins_back,1)/1440 
ORDER BY lio_per_exec DESC) 
WHERE ROWNUM<=20;



luego buscamos la mas grosa en la V$SQL.

select SQL_TEXT from v$SQL where SQL_ID ='62hjck53xcubz';

miércoles, 7 de agosto de 2019

Creacion de User en MariaDB

1. Creación de la base de datos

mysql> CREATE DATABASE `mibd`;

2. Creación del usuario

mysql> CREATE USER 'miusuario' IDENTIFIED BY 'mipassword';

3. Conceder permisos para poder acceder y usar el servidor MySQL

Para sólo permitir el acceso local desde el propio servidor (localhost). Esta será la configuración más segura y más habitual que usaremos para una aplicación web:
mysql> GRANT USAGE ON *.* TO 'miusuario'@localhost IDENTIFIED BY 'mipassword';
Para permitir el acceso desde cualquier otra máquina que tenga acceso al servidor MySQL desde la red:
mysql> GRANT USAGE ON *.* TO 'miusuario'@'%' IDENTIFIED BY 'mipassword';

4. Conceder todos los privilegios sobre la base de datos al usuario

mysql> GRANT ALL privileges ON `mibd`.* TO 'miusuario'@localhost;
Al igual que en punto anterior, si queremos que el usuario pueda trabajar con la base de datos desde cualquier ubicación tendremos que sustituir localhost por ‘%’.

5. Aplicar los cambios realizados

Para que sean efectivos los nuevos permisos que hemos asignado debemos finalizar con el siguiente comando:
mysql> FLUSH PRIVILEGES;

6. Verificar que nuestro nuevo usuario tiene los permisos correctos

mysql> SHOW GRANTS FOR 'miusuario'@localhost;     
+--------------------------------------------------------------+ 
| Grants for miusuario@localhost                                | 
+--------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'miusuario'@'localhost'                 | 
| GRANT ALL PRIVILEGES ON `mibd`.* TO 'miusuario'@'localhost' | 
+--------------------------------------------------------------+ 
2 rows in set (0,00 sec)
Si nos hemos equivocado en algún punto podemos deshacer todos los pasos ejecutando los siguientes comandos, teniendo la precaución de sustituir localhost por ‘%’ si también lo cambiaste en los pasos anteriores:
DROP USER miusuario@localhost;
DROP DATABASE midb;
A continuación dejo un pequeño script muy simple para Bash que nos permite hacer esto de una forma mucho más rápida y directa, cambiando simplemente el nombre de nuestro usuario y de nuestra base de datos:
#! /bin/bash 
 
newUser='testuser'
newDbPassword='testpwd'
newDb='testdb'
host=localhost
#host='%'

commands="CREATE DATABASE \`${newDb}\`;CREATE USER '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT USAGE ON *.* TO '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT ALL privileges ON \`${newDb}\`.*
TO '${newUser}'@'${host}';FLUSH PRIVILEGES;"

echo "${commands}" | /usr/bin/mysql -u root -p
Luego de esto si queres ver los usuarios de la base de datos, podemos tirar el siguiente query:
select u.User,Db from mysql.user u,mysql.db d where u.User=d.User;

+------------+-----------+
| User       | Db        |
+------------+-----------+
| averdecia  | nextcloud |
| averdecia  | nextcloud |
| ncbeusr    | nextcloud |
| averdecia  | nextcloud |
| averdecia  | nextcloud |
| devncbeusr | nextcloud |
+------------+-----------+
6 rows in set (0.00 sec)



RMAN - Cuando no se encuentra un archive log --- RMAN-06726: could not locate archived log

  Lo importante en todo esto, es estar dentro del catalogo correspondiente, sino el crosscheck NO FNCIONA !!   oracle backup of logfiles is ...