martes, 31 de marzo de 2015

Como mover un datafile en Oracle 12c R1


Como mover un datafile en Oracle 12c R1

Aquí les voy a pasar un tip rapido de como en Oracle 12c R1 podemos mover un datafile sin tener que bajar la base de datos o poner el tablespace al que pertenecía el datafile en modo offline.


Para este ejemplo, voy a usar OMF (Oracle Managed Files), pero también lo puedes hacer sin OMF.Lo primero que voy a hacer, es verificar que el db_create_file_dest tenga el valor a donde quiero que se creen mis datafiles.



oracle@localhost.localdomain [CDB2] /home/oracle
oracle $ sqlplus
SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 1 00:46:27 2015
Copyright (c) 1982, 2014, Oracle.All rights reserved.
Enter user-name: /as sysdba
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> show parameter db_create_file_dest
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
db_create_file_dest string
/u01/app/oracle/oradata/cdb2

Ahora vamos a verificar el estado de la BD y las PDBs y los datafiles que tenemos en nuestra BD



SQL> select open_mode from v$database;
OPEN_MODE
------------------------------------------------------------
READ WRITE
SQL> </span>SELECT PDB_ID, PDB_NAME, STATUS FROM CDB_PDBS ORDER BY PDB_ID;
PDB_ID PDB_NAME STATUS
---------- --------------- ---------------------------
2 PDB$SEED NORMAL
3 PDB1NORMAL
SQL> SELECT file_id, file_name FROM cdb_data_files ORDER BY file_id;
FILE_ID FILE_NAME
---------- ----------------------------------------------------------------------
1 /oradata/CDB2/system01.dbf
3 /oradata/CDB2/sysaux01.dbf
5 /oradata/CDB2/undotbs01.dbf
6 /u01/app/oracle/oradata/cdb2/CDB2/datafile/o1_mf_users_bk1wg0z4_.dbf
7 /oradata/UPGR/system01.dbf
8 /oradata/UPGR/sysaux01.dbf
9 /oradata/UPGR/users01.dbf
10 /tmp/aq01.dbf
12 /u01/app/oracle/product/12.1.0.2/dbs/rene.dat
9 rows selected.

Y ahora vamos a usar el comando ALTER DATABASE MOVE DATAFILE dentro de la CDB y nos va a marcar un error de que el datafile no existe



SQL> ALTER DATABASE MOVE DATAFILE "/u01/app/oracle/product/12.1.0.2/dbs/rene.dat";
ALTER DATABASE MOVE DATAFILE "/u01/app/oracle/product/12.1.0.2/dbs/rene.dat"
*
ERROR at line 1:
ORA-01516: nonexistent log file, data file, or temporary file "12"

El detalle es que en 12cR1, no nos permite mover un datafile que le pertenece a un PDB desde el CDB, si nos cambiamos a la PDB llamada PDB1, ahi si vamos a poder hacerlo



SQL> ALTER SESSION SET container =PDB1;
Session altered.
SQL> ALTER DATABASE MOVE DATAFILE "/u01/app/oracle/product/12.1.0.2/dbs/rene.dat";
Database altered.

Me voy a regresar el CDB para verificar todos los datafiles de nuestra BD y vas a ver que ahora el datafile 12 se encuentra dentro de la ruta del db_create_file_dest



SQL> ALTER SESSION SET container = cdb$root;
Session altered.
SQL>
SQL> SELECT file_id, file_name FROM cdb_data_files ORDER BY file_id;
FILE_ID FILE_NAME
---------- ----------------------------------------------------------------------
1 /oradata/CDB2/system01.dbf
3 /oradata/CDB2/sysaux01.dbf
5 /oradata/CDB2/undotbs01.dbf
6 /u01/app/oracle/oradata/cdb2/CDB2/datafile/o1_mf_users_bk1wg0z4_.dbf
7 /oradata/UPGR/system01.dbf
8 /oradata/UPGR/sysaux01.dbf
9 /oradata/UPGR/users01.dbf
10 /tmp/aq01.dbf
12 /u01/app/oracle/oradata/cdb2/CDB2/datafile/o1_mf_rene_bkpj4t2x_.dbf
9 rows selected.
SQL> SELECT PDB_ID, PDB_NAME, STATUS FROM CDB_PDBS ORDER BY PDB_ID;
PDB_ID PDB_NAME STATUS
---------- --------------- ---------------------------
2 PDB$SEED NORMAL
3 PDB1NORMAL

Conclusión

Como puedes ver ahora es un proceso mucho mas sencillo para poder cambiar un datafile, así que espero que te ayude en un futuro este pequeño tip.

jueves, 5 de marzo de 2015

Oracle SQLcl ¡ El Futuro de SQL*Plus !


Oracle SQLcl ¡ El Futuro de SQL*Plus !

En diciembre del 2014 el equipo de Oracle SQLDeveloper lanzo como version beta la herramienta Oracle SQLcl , que en pocas palabras es el motor de SQL*Plus que le pertenece a SQLDeveloper, y la verdad desde que la vi, me enamore de esta pequeña herramienta.


Esta herramienta la puedes descargar desde OTN , en la sección de “Early Adopters” para SQLDeveloper, que es una herramienta de 11Mb, que ya tiene embebida el JRE, asi que esta lista para usarse una vez que descomprimes el archivo. Segun el equipo de SQLDeveloper, es una herramienta que va a ser distribuida con SQLDeveloper v4.1 así como Oracle Database 12cR2


2015-03-05_1327


Una vez que descargas la herramienta, te puedes conectar con EZConnect, asi como OCI o clientes Thick. En este caso, me voy a conectar al esquema de HR en la base de datos “pluggable”  PDB1 en el puerto 1521.



Rene@iMac-de-Antunez [] /Users/Rene/Documents/Oracle/SQL Developer/sqlcl/bin
Rene $ pwd
/Users/Rene/Documents/Oracle/SQL Developer/sqlcl/bin
Rene@iMac-de-Antunez [] /Users/Rene/Documents/Oracle/SQL Developer/sqlcl/bin
Rene $ ls
sql sql.bat
Rene@iMac-de-Antunez [] /Users/Rene/Documents/Oracle/SQL Developer/sqlcl/bin
Rene $ sh ./sql hr/hr@192.168.15.167:1521/PDB1
SQLcl: Release 4.1.0 Beta on Thu Mar 05 13:41:05 2015
Copyright (c) 1982, 2015, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
SQL>

Como puedes ver, muchos de los comandos de SQL*Plus funcionan como antes, pero te da un mensaje que antes no se veia “Try the new information command: info employees



SQL> desc employees
Try the new information command: info employees
Name Null Type
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)

Y vamos a probar este comando, y es aquí cuando te enamoras de esta herramienta , ya que antes para poder sacar toda esta información, eran varios querys, que si no los tenias guardados, te iba a tomar bastantes minutos para sacar toda esta información. Perdon por poner imagenes, pero mi blog no me permite darle el formato que te permite apreciar el gran beneficio de esta herramienta



SQL> info employees

2015-03-05_1408


Y si con esto, no estas listo para bajar esta herramienta, también hay una versión extendida del comando info



SQL> info+ employees;

2015-03-05_1408_2


Y esto no acaba aqui, antes sacar el DDL de un objeto tenias que usar procedimientos de dbms_metadata.get_ddl, ahora lo unico que tienes que hacer es ejecutar el comando DDL nombre_objeto



SQL> DDL employees

CREATE TABLE "HR"."EMPLOYEES"
( "EMPLOYEE_ID" NUMBER(6,0),
"FIRST_NAME" VARCHAR2(20),
"LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
"EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
"PHONE_NUMBER" VARCHAR2(20),
"HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
"JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
"SALARY" NUMBER(8,2),
"COMMISSION_PCT" NUMBER(2,2),
"MANAGER_ID" NUMBER(6,0),
"DEPARTMENT_ID" NUMBER(4,0),
CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
...
CREATE OR REPLACE EDITIONABLE TRIGGER "HR"."UPDATE_JOB_HISTORY"
AFTER UPDATE OF job_id, department_id ON employees
FOR EACH ROW
BEGIN
add_job_history(:old.employee_id, :old.hire_date, sysdate,
:old.job_id, :old.department_id);
END;
ALTER TRIGGER "HR"."UPDATE_JOB_HISTORY" ENABLE

Como puedes ver, aunque son 11Mb, es una herramienta muy poderosa que viene a evolucionar a SQL*Plus, y aunque hay ciertas cosas que se van a poder hacer solo via SQL*Plus, te puedo apostar que a partir de hoy vas a empezar a utilizar SQLcl mucho mas que SQL*Plus