jueves, 1 de diciembre de 2016

RMAN Table Point In Time Recovery (PITR) in Oracle Database 12c Release 1 (12.1)

RMAN Table Point In Time Recovery (PITR) in Oracle Database 12c Release 1 (12.1)

In previous releases point in time recovery of a table or table partition was only possible by manually creating a point in time clone of the database, retrieving the table using data pump, then removing the clone. Oracle 12c includes a new RMAN feature which performs all these steps, initiated from a single command.
Related articles.

Setup

To demonstrate this, we need to create a table to do a PITR on. This example assumes you are running in archivelog mode and have adequate backups in place to allow a recovery via a point in time clone. For such a recent modification, using a flashback query would be more appropriate, but this serves the purpose for this test.
CONN / AS SYSDBA

CREATE USER test IDENTIFIED BY test
  QUOTA UNLIMITED ON users;

GRANT CREATE SESSION, CREATE TABLE TO test;

CONN test/test

CREATE TABLE t1 (id NUMBER);
INSERT INTO t1 VALUES (1);
COMMIT;
Check the current SCN.
CONN / AS SYSDBA

SELECT DBMS_FLASHBACK.get_system_change_number FROM dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1853267

SQL>
Add some more data since the SCN was checked.
CONN test/test

INSERT INTO t1 VALUES (2);
COMMIT;

SELECT * FROM t1;

        ID
----------
         1
         2

SQL> 
Exit from SQL*Plus and log in to RMAN as a root user with SYSDBA or SYSBACKUP privilege.

Table Point In Time Recovery (PITR)

Log in to RMAN as a user with SYSDBA or SYSBACKUP privilege.
$ rman target=/
Issue the RECOVER TABLE command, giving a suitable AUXILIARY DESTINATION location for the auxiliary database. In the following example the REMAP TABLE clause is used to give the recovered table a new name.
RECOVER TABLE 'TEST'.'T1'
  UNTIL SCN 1853267
  AUXILIARY DESTINATION '/u01/aux'  
  REMAP TABLE 'TEST'.'T1':'T1_PREV';


RMAN> RECOVER TABLE username.tablename UNTIL TIME 'TIMESTAMP…'
  AUXILIARY DESTINATION '/u01/tablerecovery'
  DATAPUMP DESTINATION '/u01/dpump'
  DUMP FILE 'tablename.dmp'
  NOTABLEIMPORT   
REMAP TABLE 'username.tablename': 'username.new_table_name'; 


The output from this command is shown here. It's rather long, but it clearly shows the creation of the clone and the data pump export and import operations. Once the operation is complete, we can see the T1_PREV table has been created and contains the data as it was when the SCN was captured.
sqlplus test/test

SELECT * FROM t1_prev;

 ID
----------
  1

SQL> 

Table Point In Time Recovery (PITR) to Dump File

Rather than completing the whole recovery, you can just stop at the point where the recovered table is in a data pump dump file, which you can import manually at a later time. The following example uses the DATAPUMP DESTINATION, DUMP FILE and NOTABLEIMPORT clauses to achieve this.
RECOVER TABLE 'TEST'.'T1'
  UNTIL SCN 1853267
  AUXILIARY DESTINATION '/u01/aux'
  DATAPUMP DESTINATION '/u01/export'
  DUMP FILE 'test_t1_prev.dmp'
  NOTABLEIMPORT;
The output from this command is shown here. Once the operation is complete, we can see the resulting dump file in the specified directory.
$ ls -al /u01/export
total 120
drwxr-xr-x. 2 oracle oinstall   4096 Dec 26 17:33 .
drwxrwxr-x. 5 oracle oinstall   4096 Dec 26 12:30 ..
-rw-r-----. 1 oracle oinstall 114688 Dec 26 17:34 test_t1_prev.dmp
$

lunes, 31 de octubre de 2016

+ASM CHECK ALL REPAIR


 

SQL> alter diskgroup DG_DATA check all repair;

Diskgroup altered.

SQL> alter diskgroup DG_DATA rebalance power 11 nowait;

 

miércoles, 14 de septiembre de 2016

REPORT_SQL_MONITOR

Oracle 11g automatically monitors SQL statements if they are run in parallel, or consume 5 or more seconds of CPU or I/O in a single execution. This allows resource intensive SQL to be monitored as it is executing, as well as giving access to detailed information about queries once they are complete.
SQL monitoring requires the STATISTICS_LEVEL parameter to be set to 'TYPICAL' or 'ALL', and the CONTROL_MANAGEMENT_PACK_ACCESS parameter set to 'DIAGNOSTIC+TUNING'.
SQL> CONN / AS SYSDBA
Connected.
SQL> SHOW PARAMETER statistics_level

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
statistics_level       string  TYPICAL

SQL> SHOW PARAMETER control_management_pack_access

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
control_management_pack_access      string  DIAGNOSTIC+TUNING

SQL>

MONITOR Hint

The MONITOR hint switches on SQL monitoring for statements that would not otherwise initiate it.
SELECT /*+ MONITOR */ d.dname, WM_CONCAT(e.ename) AS employees
FROM   emp e
       JOIN dept d ON e.deptno = d.deptno
GROUP BY d.dname
ORDER BY d.dname;
If you have long running statements you don't want to monitor, use the NO_MONITOR hint to prevent them being monitored.

REPORT_SQL_MONITOR

The REPORT_SQL_MONITOR function is used to return a SQL monitoring report for a specific SQL statement. The SQL statement can be identified using a variety of parameters, but it will typically be identified using the SQL_ID parameter.
The function can accept many optional parameters, shown here, but most of the time you will probably only use the following.
  • SQL_ID - The SQL_ID of the query of interest. When NULL (the default) the last monitored statement is targeted.
  • SQL_EXEC_ID - When the SQL_ID is specified, the SQL_EXEC_ID indicates the individual execution of interest. When NULL (the default) the most recent execution of the statement targeted by the SQL_ID is assumed.
  • REPORT_LEVEL - The amount of information displayed in the report. The basic allowed values are 'NONE', 'BASIC', 'TYPICAL' or 'ALL', but the information displayed can be modified further by adding (+) or subtracting (-) named report sections (eg. 'BASIC +PLAN +BINDS' or 'ALL -PLAN'). This is similar to the way DBMS_XPLAN output can be tailored in the later releases. I almost always use 'ALL'.
  • TYPE - The format used to display the report ('TEXT', 'HTML', 'XML' or 'ACTIVE'). The 'ACTIVE' setting is new to Oracle 11g Release 2 and displays the output using HTML and Flash, similar to the way it is shown in Enterprise Manager.
  • SESSION_ID - Targets a subset of queries based on the specified SID. Use SYS_CONTEXT('USERENV','SID') for the current session.
The report accesses several dynamic performance views, so you will most likely access it from a privileged user, or a user granted the SELECT_CATALOG_ROLE role.
To see it in action, first we make sure we have a monitored statement to work with.
CONN scott/tiger

SELECT /*+ MONITOR */ d.dname, WM_CONCAT(e.ename) AS employees
FROM   emp e
       JOIN dept d ON e.deptno = d.deptno
GROUP BY d.dname
ORDER BY d.dname;
Monitored statements can be identified using the V$SQL_MONITOR view. This view was present in Oracle 11g Release 1, but has additional columns in Oracle 11g Release 2, making it much more useful. It contains an entry for each execution monitored, so it can contain multiple entries for individual SQL statements.
CONN / AS SYSDBA

-- 11gR1
SELECT sql_id, status
FROM   v$sql_monitor;

SQL_ID       STATUS
------------- -------------------
526mvccm5nfy4 DONE (ALL ROWS)

SQL>

-- 11gR2
SET LINESIZE 200
COLUMN sql_text FORMAT A80

SELECT sql_id, status, sql_text
FROM   v$sql_monitor
WHERE  username = 'SCOTT';

SQL_ID        STATUS              SQL_TEXT
------------- ------------------- --------------------------------------------------------------------------------
526mvccm5nfy4 DONE (ALL ROWS)     SELECT /*+ MONITOR */ d.dname, WM_CONCAT(e.ename) AS employees
                                  FROM   emp e
                                         JOIN dept d ON e.deptno = d.deptno
                                  GROUP BY d.dname
                                  ORDER BY d.dname

SQL>
Once the SQL_ID is identified, we can generate a report using the REPORT_SQL_MONITOR function.
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF

SPOOL /host/report_sql_monitor.htm
SELECT DBMS_SQLTUNE.report_sql_monitor(
  sql_id       => '526mvccm5nfy4',
  type         => 'HTML',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF
Examples of the output for each available TYPE are displayed below.
  • TEXT
  • HTML
  • XML
  • ACTIVE - Active HTML available in 11gR2 requires a download of Javascript libraries and a Flash movie from an Oracle website, so must be used on a PC connected to the internet, unless you download the relevant libraries and use the BASE_PATH parameter in the function call to identify their location.
In Oracle 12c, the REPORT_SQL_MONITOR function is now found in the DBMS_SQL_MONITOR package.

REPORT_SQL_MONITOR_LIST

The REPORT_SQL_MONITOR_LIST function was added in Oracle 11g Release 2 to generate a summary screen, similar to that on the "Monitored SQL Executions" page of Enterprise Manager. There are a number of parameters to filer the content of the report (shown here), but most of the time you will probably only use the TYPE and REPORT_LEVEL parameters, similar to those in the REPORT_SQL_MONITOR function. The query below shows how the function can be used.
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF

SPOOL /host/report_sql_monitor_list.htm
SELECT DBMS_SQLTUNE.report_sql_monitor_list(
  type         => 'HTML',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF
Examples of the output for each available TYPE are displayed below.
  • TEXT
  • HTML
  • XML
  • ACTIVE - Active HTML is not currently supported, but the parameter list, specifically the BASE_PATH, suggest it will be supported in future.
In Oracle 12c, the REPORT_SQL_MONITOR_LIST function is now found in the DBMS_SQL_MONITOR package.

viernes, 19 de agosto de 2016

Perdida de Tabla

Perdida de Tabla

Para el presente caso la tabla será premeditadamente borrada. Tal como fue mencionada en la parte inicial del artículo, el caso que estamos desarrollando es el planteamiento de recuperación en caso de que una tabla sea accidentalmente borrada, corrupta, etc y la misma necesite ser recuperada/restaurada a un determinado punto del tiempo, disponiendo para la tarea un backup de la BBDD realizado con RMAN.
sandbox1(orawiss):/home/oracle>sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Wed Jun 26 14:45:21 2013

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

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> alter session set container=ORAWISS12C;

Session altered.

SQL> DROP TABLE wissem.test_rec PURGE;

Table dropped.

SQL> select * from wissem.test_rec;
select * from wissem.test_rec
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
sandbox1(orawiss):/home/oracle>

Sintaxis
Antes de la ejecución veamos la sintaxis del comando a ser utilizado:
RMAN> RECOVER TABLE username.tablename UNTIL TIME 'TIMESTAMP…'
  AUXILIARY DESTINATION '/u01/tablerecovery'
  DATAPUMP DESTINATION '/u01/dpump'
  DUMP FILE 'tablename.dmp'
  NOTABLEIMPORT   
REMAP TABLE 'username.tablename': 'username.new_table_name'; 

TABLE username.tablename: Tabla objeto de recuperación
UNTIL TIME 'TIMESTAMP…': Tiempo hasta el cual se establecerá la recuperación de la tabla
AUXILIARY DESTINATION: Directorio de alojamiento para la BBDD Auxiliar a ser creada
DATAPUMP DESTINATION: Directorio de alojamiento para el “Data Pump export dump file” a ser generado
DUMP FILE: Nombre de “Data Pump export dump file” a ser generado
NOTABLEIMPORT: Opción de control para establecer el posible restaurado de la tabla y/o particiones en la BBDD “Target”
REMAP TABLE 'username.tablename': 'username.new_table_name': Opción para renombrar la tabla a restaurar en la BBDD “Target”
Ejecución
En la presente ejecución la clausula “NOTABLEIMPORT” no esta presente en la conformación del comando “RECOVER TABLE”. Cuando la mencionada clausula es omitida, el proceso importa de forma automática la tabla en la BBDD “Target”.
sandbox1(orawiss):/home/oracle>rman

Recovery Manager: Release 12.1.0.1.0 - Production on Wed Jun 26 15:28:04 2013

Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.

RMAN> CONNECT TARGET "sys AS SYSBACKUP";

target database Password:
connected to target database: ORAWISS (DBID=3257067578)

RMAN> RECOVER TABLE WISSEM.TEST_REC OF PLUGGABLE DATABASE ORAWISS12C UNTIL TIME 
"to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')" AUXILIARY DESTINATION 
'/tmp' DATAPUMP DESTINATION '/tmp' DUMP FILE 'tst_dump2.dmp';

Starting recover at 06/26/2013 15:28:37
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=272 device type=DISK
RMAN-05026: WARNING: presuming following set of tablespaces applies to specified 
Point-in-Time

List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1

Creating automatic instance, with SID='AAxr'

initialization parameters used for automatic instance:
db_name=ORAWISS
db_unique_name=AAxr_pitr_ORAWISS12C_ORAWISS
compatible=12.1.0.0.0
db_block_size=8192
db_files=200
sga_target=1G
processes=80
diagnostic_dest=/opt/app/oracle
db_create_file_dest=/tmp
log_archive_dest_1='location=/tmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true
#No auxiliary parameter file used

starting up automatic instance ORAWISS

Oracle instance started

Total System Global Area    1068937216 bytes

Fixed Size                     2296576 bytes
Variable Size                281019648 bytes
Database Buffers             780140544 bytes
Redo Buffers                   5480448 bytes
Automatic instance created

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
sql 'alter system archive log current';
}
executing Memory Script

executing command: SET until clause

Starting restore at 06/26/2013 15:28:50
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=82 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/AUTOBACKUP/2013_06_26/s_819125085.301.819125085
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/AUTOBACKUP/2013_06_26/s_819125085.301.819125085 
tag=TAG20130626T144445
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
output file name=/tmp/ORAWISS/controlfile/o1_mf_8wpj7slx_.ctl
Finished restore at 06/26/2013 15:28:58

sql statement: alter database mount clone database

sql statement: alter system archive log current

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile  1 to new;
set newname for clone datafile  4 to new;
set newname for clone datafile  3 to new;
set newname for clone datafile  8 to new;
set newname for clone datafile  9 to new;
set newname for clone tempfile  1 to new;
set newname for clone tempfile  3 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  1, 4, 3, 8, 9;
switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

renamed tempfile 1 to /tmp/ORAWISS/datafile/o1_mf_temp_%u_.tmp in control file
renamed tempfile 3 to /tmp/ORAWISS/datafile/o1_mf_temp_%u_.tmp in control file

Starting restore at 06/26/2013 15:29:04
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to 
/tmp/ORAWISS/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to 
/tmp/ORAWISS/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to 
/tmp/ORAWISS/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/BACKUPSET/2013_06_26/nnndf0_tag20130626t123856_0.282.819117537
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/BACKUPSET/2013_06_26/nnndf0_tag20130626t123856_0.282.819117537
 tag=TAG20130626T123856
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00008 to 
/tmp/ORAWISS/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00009 to 
/tmp/ORAWISS/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/nnndf0_tag20130
626t144437_0.298.819125079
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/nnndf0_t
ag20130626t144437_0.298.819125079 tag=TAG20130626T144437
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:07
Finished restore at 06/26/2013 15:29:27

datafile 1 switched to datafile copy
input datafile copy RECID=8 STAMP=819127767 file 
name=/tmp/ORAWISS/datafile/o1_mf_system_8wpj8191_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=9 STAMP=819127767 file 
name=/tmp/ORAWISS/datafile/o1_mf_undotbs1_8wpj819j_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=10 STAMP=819127767 file 
name=/tmp/ORAWISS/datafile/o1_mf_sysaux_8wpj8199_.dbf
datafile 8 switched to datafile copy
input datafile copy RECID=11 STAMP=819127767 file 
name=/tmp/ORAWISS/datafile/o1_mf_system_8wpj8jf1_.dbf
datafile 9 switched to datafile copy
input datafile copy RECID=12 STAMP=819127767 file 
name=/tmp/ORAWISS/datafile/o1_mf_sysaux_8wpj8jdt_.dbf

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# online the datafiles restored or switched
sql clone "alter database datafile  1 online";
sql clone "alter database datafile  4 online";
sql clone "alter database datafile  3 online";
sql clone 'ORAWISS12C' "alter database datafile
 8 online";
sql clone 'ORAWISS12C' "alter database datafile
 9 online";
# recover and open database read only
recover clone database tablespace  "SYSTEM", "UNDOTBS1", "SYSAUX", 
"ORAWISS12C":"SYSTEM", "ORAWISS12C":"SYSAUX";
sql clone 'alter database open read only';
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile  1 online

sql statement: alter database datafile  4 online

sql statement: alter database datafile  3 online

sql statement: alter database datafile  8 online

sql statement: alter database datafile  9 online

Starting recover at 06/26/2013 15:29:28
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 15 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_15.279.819117567
archived log for thread 1 with sequence 16 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_16.278.819123911
archived log for thread 1 with sequence 17 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_17.294.819123955
archived log for thread 1 with sequence 18 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_18.296.819123981
archived log for thread 1 with sequence 19 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_19.295.819124251
archived log for thread 1 with sequence 20 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_20.297.819124297
archived log for thread 1 with sequence 21 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_21.299.819124453
archived log for thread 1 with sequence 22 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_15.279.819117567 thread=1 
sequence=15
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_16.278.819123911 thread=1 
sequence=16
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_17.294.819123955 thread=1 
sequence=17
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_18.296.819123981 thread=1 
sequence=18
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_19.295.819124251 thread=1 
sequence=19
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_20.297.819124297 thread=1 
sequence=20
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_21.299.819124453 thread=1 
sequence=21
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213 thread=1 
sequence=22
media recovery complete, elapsed time: 00:00:04
Finished recover at 06/26/2013 15:29:34

sql statement: alter database open read only

contents of Memory Script:
{
sql clone 'alter pluggable database  ORAWISS12C open read only';
}
executing Memory Script

sql statement: alter pluggable database  ORAWISS12C open read only

contents of Memory Script:
{
   sql clone "create spfile from memory";
   shutdown clone immediate;
   startup clone nomount;
   sql clone "alter system set  control_files =
  ''/tmp/ORAWISS/controlfile/o1_mf_8wpj7slx_.ctl'' comment=
 ''RMAN set'' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
# mount database
sql clone 'alter database mount clone database';
}
executing Memory Script

sql statement: create spfile from memory

database closed
database dismounted
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    1068937216 bytes

Fixed Size                     2296576 bytes
Variable Size                285213952 bytes
Database Buffers             775946240 bytes
Redo Buffers                   5480448 bytes

sql statement: alter system set  control_files =   
''/tmp/ORAWISS/controlfile/o1_mf_8wpj7slx_.ctl'' comment= ''RMAN set'' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    1068937216 bytes

Fixed Size                     2296576 bytes
Variable Size                285213952 bytes
Database Buffers             775946240 bytes
Redo Buffers                   5480448 bytes

sql statement: alter database mount clone database

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile  13 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  13;
switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

Starting restore at 06/26/2013 15:30:08
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=15 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00013 to 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/nnndf0_tag20130
626t144437_0.298.819125079
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/nnndf0_t
ag20130626t144437_0.298.819125079 tag=TAG20130626T144437
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 06/26/2013 15:30:10

datafile 13 switched to datafile copy
input datafile copy RECID=14 STAMP=819127810 file 
name=/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_8wpjb1c3_.dbf

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# online the datafiles restored or switched
sql clone 'ORAWISS12C' "alter database datafile
 13 online";
# recover and open resetlogs
recover clone database tablespace  "ORAWISS12C":"TBS_REC", "SYSTEM", "UNDOTBS1", 
"SYSAUX", "ORAWISS12C":"SYSTEM", "ORAWISS12C":"SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile  13 online

Starting recover at 06/26/2013 15:30:10
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 22 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213 thread=1 
sequence=22
media recovery complete, elapsed time: 00:00:00
Finished recover at 06/26/2013 15:30:11

database opened

contents of Memory Script:
{
sql clone 'alter pluggable database  ORAWISS12C open';
}
executing Memory Script

sql statement: alter pluggable database  ORAWISS12C open

contents of Memory Script:
{
# create directory for datapump import
sql 'ORAWISS12C' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
# create directory for datapump export
sql clone 'ORAWISS12C' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
}
executing Memory Script

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

Performing export of tables...
   EXPDP> Starting "SYS"."TSPITR_EXP_AAxr_wgmi":
   EXPDP> Estimate in progress using BLOCKS method...
   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
   EXPDP> Total estimation using BLOCKS method: 64 KB
   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
   EXPDP> . . exported "WISSEM"."TEST_REC"              5.031 KB       1 rows
   EXPDP> Master table "SYS"."TSPITR_EXP_AAxr_wgmi" successfully loaded/unloaded
   EXPDP> ******************************************************************************
   EXPDP> Dump file set for SYS.TSPITR_EXP_AAxr_wgmi is:
   EXPDP>   /tmp/tst_dump2.dmp
   EXPDP> Job "SYS"."TSPITR_EXP_AAxr_wgmi" successfully completed at Wed Jun 26 
   15:30:51 2013 elapsed 0 00:00:22
Export completed

contents of Memory Script:
{
# shutdown clone before import
shutdown clone abort
}
executing Memory Script

Oracle instance shut down

Performing import of tables...
   IMPDP> Master table "SYSBACKUP"."TSPITR_IMP_AAxr_yzka" successfully 
   loaded/unloaded
   IMPDP> Starting "SYSBACKUP"."TSPITR_IMP_AAxr_yzka":
   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
   IMPDP> . . imported "WISSEM"."TEST_REC"          5.031 KB       1 rows
   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
   IMPDP> Job "SYSBACKUP"."TSPITR_IMP_AAxr_yzka" successfully completed at Wed Jun 
   26 15:31:23 2013 elapsed 0 00:00:08
Import completed

Removing automatic instance
Automatic instance removed
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wpj92wr_.tmp deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wpj8zhc_.tmp deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_3_8wpjb4l3_.log deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_2_8wpjb49s_.log deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_1_8wpjb434_.log deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_8wpjb1c3_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wpj8jdt_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wpj8jf1_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wpj8199_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_undotbs1_8wpj819j_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wpj8191_.dbf deleted
auxiliary instance file /tmp/ORAWISS/controlfile/o1_mf_8wpj7slx_.ctl deleted
auxiliary instance file tst_dump2.dmp deleted
Finished recover at 06/26/2013 15:31:28

RMAN> exit

Verificado de resultado
La tabla que fue anteriormente borrada fue recuperada por el proceso.
Recovery Manager complete.
sandbox1(orawiss):/home/oracle>sqlplus /  as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Wed Jun 26 15:31:36 2013

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

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> alter session set container=ORAWISS12C;

Session altered.

SQL> select * from wissem.test_rec;

        ID
----------
         1

SQL>

Durante la ejecución se pudieron observar detalles importantes que harán que usted como lector pueda entender los procesos internos realizados. Veamos detalles del mismo:
• Ejecución del comando “RECOVER TABLE”
RMAN> RECOVER TABLE WISSEM.TEST_REC OF PLUGGABLE DATABASE ORAWISS12C UNTIL TIME 
"to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')" AUXILIARY DESTINATION 
'/tmp' DATAPUMP DESTINATION '/tmp' DUMP FILE 'tst_dump2.dmp';

• Establecimiento de Parámetros de Inicialización para la Instancia Auxiliar con bajo consumo de recursos
initialization parameters used for automatic instance:
db_name=ORAWISS
db_unique_name=AAxr_pitr_ORAWISS12C_ORAWISS
compatible=12.1.0.0.0
db_block_size=8192
db_files=200
sga_target=1G
processes=80
diagnostic_dest=/opt/app/oracle
db_create_file_dest=/tmp
log_archive_dest_1='location=/tmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true

• Restaurado de “Controlfiles” para iniciar el proceso de recuperación
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile

• Proceso de Restauración de “Tablespaces”
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile  1 to new;
set newname for clone datafile  4 to new;
set newname for clone datafile  3 to new;
set newname for clone datafile  8 to new;
set newname for clone datafile  9 to new;
set newname for clone tempfile  1 to new;
set newname for clone tempfile  3 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  1, 4, 3, 8, 9;
switch clone datafile all;

• Restaurado de “Datafiles” en la ruta indicada por el parámetro “AUXILIARY DESTINATION”
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to 
/tmp/ORAWISS/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to 
/tmp/ORAWISS/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to 
/tmp/ORAWISS/datafile/o1_mf_sysaux_%u_.dbf

• Recuperación “Until Time” de la BBDD Auxiliar
Starting recover at 06/26/2013 15:23:16
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 15 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_15.279.819117567
…

# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile  13 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  13;
switch clone datafile all;

• Generación del “Data Pump export dump file”
sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

Performing export of tables...
 EXPDP> Starting "SYS"."TSPITR_EXP_AAxr_wgmi":
 EXPDP> Estimate in progress using BLOCKS method...
 EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
 EXPDP> Total estimation using BLOCKS method: 64 KB
 EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
 EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
 EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
 EXPDP> . . exported "WISSEM"."TEST_REC"           5.031 KB       1 rows
 EXPDP> Master table "SYS"."TSPITR_EXP_AAxr_wgmi" successfully loaded/unloaded
 EXPDP> *****************************************************************
 EXPDP> Dump file set for SYS.TSPITR_EXP_AAxr_wgmi is:
 EXPDP>   /tmp/tst_dump2.dmp
 EXPDP> Job "SYS"."TSPITR_EXP_AAxr_wgmi" successfully completed at Wed Jun 26 
 15:30:51 2013 elapsed 0 00:00:22
Export completed

“Data Pump export dump file” resultante: EXPDP> /tmp/tst_dump2.dmp
• “Import” automático de la tabla en la BBDD “Target”
Performing import of tables...
   IMPDP> Master table "SYSBACKUP"."TSPITR_IMP_AAxr_yzka" successfully 
   loaded/unloaded
   IMPDP> Starting "SYSBACKUP"."TSPITR_IMP_AAxr_yzka":
   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
   IMPDP> . . imported "WISSEM"."TEST_REC"           5.031 KB       1 rows
   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
   IMPDP> Job "SYSBACKUP"."TSPITR_IMP_AAxr_yzka" successfully completed at Wed 
   Jun 26 15:31:23 2013 elapsed 0 00:00:08
Import completed

• Remoción automática de los componentes de la BBDD “Auxiliar”
Removing automatic instance
Automatic instance removed
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wpj92wr_.tmp deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wpj8zhc_.tmp deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_3_8wpjb4l3_.log deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_2_8wpjb49s_.log deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_1_8wpjb434_.log deleted
auxiliary instance file 
/tmp/AAXR_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_8wpjb1c3_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wpj8jdt_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wpj8jf1_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wpj8199_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_undotbs1_8wpj819j_.dbf 
deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wpj8191_.dbf deleted
auxiliary instance file /tmp/ORAWISS/controlfile/o1_mf_8wpj7slx_.ctl deleted
auxiliary instance file tst_dump2.dmp deleted
Finished recover at 06/26/2013 15:31:28

Conclusiones
Tal como se ha señalado en el desarrollo del artículo, esta nueva característica nos brinda la facilidad de recuperar tablas y/o particiones de tablas con un proceso directo haciendo uso optimo de recursos como: disco, memoria y otros relacionados con el proceso.
El comando “RECOVER TABLE” no solo tiene impacto en la acción directa que realiza, sino también en como lograra cambiar en concepto del papel que juegan los respaldos lógicos que muchas empresas llevaban a cabo para prevenir la posible recuperación de objetos sin tener que restaurar la BBDD completa.
Antes de finalizar el presente artículo veamos cuadro comparativo de las ventajas que posee el nuevo “RECOVER TABLE” con respecto a TSPITR ( Tablespace Point-in-Time Recovery )

martes, 2 de agosto de 2016

Oracle SOA: Cambiando el enfoque arquitectonico, de empresarial a servicios

Oracle SOA: Cambiando el enfoque arquitectonico, de empresarial a servicios

Por Sandra Flores Oracle ACE Associate
Publicado en Abril 2016
En los últimos meses he notado que varias de las grandes compañías, principalmente del sector financiero, en México y en otros países de America Latina, que desde hace algunos años han operado con sistemas basados en aplicaciones empresariales, están cambiando de enfoque arquitectónico, y en el proceso de explorar nuevas arquitecturas, una de las opciones lógicas es usar servicios, y no me refiero a únicamente implementar servicios web, sino que además requieren una capa de integración que resuelva diversos temas, es decir, están optando por implementar arquitecturas orientadas a servicios y automatización de procesos. A continuación analizaremos algunas de las principales razones que he podido identificar para incentivarlos a llegar a ésta determinación y cómo podríamos llevar a cabo dicho cambio, diseñando una arquitectura acorde a la situación.
Pensemos en el siguiente ejemplo que muestra una arquitectura de estilo empresarial con Java, en la cual se mezcla una serie de componentes Opensource, que le proveen la característica de Orientación a Aspectos, persistencia por medio de objetos, entre algunas otras, tal como se ilustra en el diagrama:

Estamos hablando de una aplicación web sencilla pero bien definida, cuya funcionalidad seguramente cubre los objetivos para los cuales fue diseñada inicialmente, definitivamente cumple con una estructura en capas, tiene la posibilidad de conectarse con diversas tecnologías fuera de la aplicación y usa en su mayoría herramientas Opensource, lo que la convierte en una opción económica.
A simple vista no representa mayores problemas que la complejidad misma del negocio, embebida en la capa de servicios, y quizás los temas que impliquen las prácticas que se han adoptado en la construcción de código. Entonces ¿Cuál es el verdadero problema? ¿De dónde surge la necesidad de cambiar el diseño de éstas aplicaciones que parecieran no ser problemáticas?
Podríamos pensar que es cuestión de actualización o de ir con las tendencias tecnológicas, por ejemplo, ahora que el tema de los Microservices y APIs está tomando un papel protagónico en el diseño de arquitecturas, es fácil visualizarnos en escenarios donde querríamos colocarlos.

Sin embargo, más allá de las tendencias y lo que decidamos usar para implementar una transformación tecnológica, la razón fundamental siempre será la misma, el negocio u operación de la organización demanda un crecimiento cada vez mayor y más rápido, mismo que debe ser soportado por la tecnología. Si las aplicaciones actuales no pueden avanzar al mismo ritmo que el crecimiento operativo, éstas tienden a ser obsoletas y limitantes.
Con éste precedente, podemos establecer que el primer factor de cambio es precisamente la falta de agilidad al cambio. Esta idea es refutable con el argumento de que no por ser una sola aplicación, el proceso de cambio tiene que ser demasiado lento, y si bien esto es cierto para aplicaciones bien controladas, también es un hecho real que la mayoría de los proyectos que inicialmente fueron pensados con un alcance, con el tiempo van creciendo desmedidamente, y como ejemplo, lo que comenzó como una aplicación construida por un equipo de 5 personas, se vuelve en monolito en el que intervienen más de 20, tratando de generar un solo archivo desplegable. Sobra decir que los errores humanos están a la orden del día y los controles de cambios y despliegues se convierten en una pesadilla.
El siguiente factor detectado en estas aplicaciones, es que a pesar de que están divididas en capas, muchas veces tienen las responsabilidades mezcladas, por ejemplo, cuando en la capa de presentación e interpretación se agregan validaciones de negocio que implican un flujo cada vez más complejo, con la justificación de que son validaciones de presentación, y que además en un inicio eran muy simples, con el tiempo se convierte en el patrón de implementación. Otro factor relevante es el uso de control de accesos por rol a los componentes en cada pantalla, mismos que agregan complejidad y segregan en cada una, lógica de validaciones de roles. Estas prácticas provocan el aumento de carga de la capa que solo debería tener objetos ligeros de presentación.

Otro factor determinante es la falta de flexibilidad a los cambios en los servicios de negocio. Pensando en una aplicación donde la reutilización de los objetos es reducida, y por otro lado, el acoplamiento con las tecnologías es alto, el impacto de un cambio en algún elemento genera un efecto dominó, sin mencionar la duplicidad de reglas de negocio, o dicho de otra forma, la falta de centralización de éstas, que implican que un cambio pequeño se convierta en días enteros de prueba y error.
En el caso del ejemplo mencionado al inicio, se usó hibernate para la persistencia en base de datos. Se adoptaron prácticas tales como usar de manera excesiva objetos QueryByExample, mismos que generan en tiempo de ejecución los objetos de mapeo para ejecutar los accesos a BD, además de que los mezclaron con objetos Spring JDBC. Todas estas condiciones particulares hicieron que la capa de acceso a datos sea demasiado lenta y que consuma muchos recursos, lo que originó la necesidad de agregar una gran cantidad de infraestructura que soportara dicho procesamiento. Definitivamente esta solución es muy costosa, además de ser un círculo vicioso, porque entre más accesos a base de datos se requieran, más recursos demandará. Entonces, partiendo de este escenario, la idea de tener una capa de acceso a datos completamente homogénea, sin frameworks pesados y con posibilidades reducidas de mal uso de los objetos, es un must que las arquitecturas deben contemplar.
Esta es solo una lista representativa de las posibles áreas de oportunidad que presentan las arquitecturas en cuestión, y dado que la intención es mostrar cómo quedaría representado un diseño arquitectónico más flexible, que contrarreste los problemas del presente, en el siguiente diagrama conceptual se ilustra un ejemplo de lo que éste pudiera contener.


En este diseño se contempla el uso de herramientas del stack de Oracle de capa media en ambientes OnPremise, desde el front end, back end y hasta el control de identidad y accesos de los usuarios.
En cada capa se segmentan las responsabilidades y funciones de los elementos, permitiendo:
  • Crear una interfaz gráfica tan robusta como un Portal o tan ligera como un sitio web, capaz de incluir tecnologías como Node.js, y exponerla de diferentes maneras, para que pueda ser interpretada por diversos canales, usando ADF y las herramientas de Webcenter.
  • Realizar la automatización de procesos de negocio por medio del Business Process Manager (BPM).
  • Mantener un punto de centralización de acceso a todas las aplicaciones de la organización, que a su vez permite rutear y mediar mensajes, realizar transformaciones de datos y usar una serie de componentes tecnológicos que robustecen las integraciones, internas a la organización y con los socios de negocio, por medio del Oracle Service Bus (OSB).
  • Generar composiciones de servicios usando diferentes tipos de adaptadores, con el fin de orquestar las invocaciones a las diversas aplicaciones y fuentes de datos, de manera estandarizada y visual, por medio de BPEL y Mediator.
  • Agrupar y ordenar las reglas de negocio, hacerlas editables por personas no técnicas y exponerlas como servicios de validación para ser usados en cualquier punto de los procesos, usando Oracle Business Rules (OBR).
  • Proveer visibilidad a los usuarios de negocio sobre el comportamiento de la operación en tiempo real, por medio de tableros con distintos tipos de gráficos, usando Business Activity Monitoring (BAM).
  • Controlar la identidad y los accesos que poseen los usuarios y propagarlos hacia el resto de los elementos de la arquitectura, usando Oracle Identity Manger (OIM) y Oracle Access Manager (OAM).
De esta forma, no solo trabajamos apegados a estándares de la industria, sino que además se fomenta la separación de responsabilidades, incrementamos la agilidad debido a que cada elemento es independiente de los demás y ponemos en práctica una serie de principios básicos que, bien aplicados, aportarán cambios significativos al negocio.

Como cambiar el set de caracteres a una base de datos 12c

Como cambiar el set de caracteres a una base de datos 12c

Por Ronald Vargas QuesadaOrace ACE Director
Publicado en Abril 2016
Pasos para ejecutar el cambio del valor del parámetro. Leer el contenido completo de la guía. Al final se detalle algunos aspectos importantes para ambiente de RAC.

Recomendable realizar un full respaldo antes de continuar con este proceso.

Objetivo: Actualizar la tabla sys.prop$ del diccionario de la base de datos en donde se almacena el set de caracteres de la base de datos.
  • Validar el valor de los parámetros en la base de datos
SQL> column VALUE format a10
SQL> column PARAMETER format a30
SQL> select * from v$nls_parameters;


SQL> /


PARAMETER                      VALUE                              CON_ID
-----------------------------  ------------------------------  ---------
NLS_LANGUAGE                   AMERICAN                                0
NLS_TERRITORY                  AMERICA                                 0
NLS_CURRENCY                   $                                       0
NLS_ISO_CURRENCY               AMERICA                                 0
NLS_NUMERIC_CHARACTERS         .,                                      0
NLS_CALENDAR                   GREGORIAN                               0
NLS_DATE_FORMAT                DD-MON-RR                               0
NLS_DATE_LANGUAGE              AMERICAN                                0
NLS_CHARACTERSET               WE8ISO8859P15                           0
NLS_SORT                       BINARY                                  0
NLS_TIME_FORMAT                HH.MI.SSXFF AM                          0
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                0
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                      0
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR            0
NLS_DUAL_CURRENCY              $                                       0
NLS_NCHAR_CHARACTERSET         AL16UTF16                               0
NLS_COMP                       BINARY                                  0
NLS_LENGTH_SEMANTICS           BYTE                                    0
NLS_NCHAR_CONV_EXCP            FALSE                                   0

  • Bajar la base de datos y seguir los pasos indicados a continuación
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> startup mount
ORACLE instance started.


Total System Global Area 1895825408 bytes
Fixed Size                  2925744 bytes
Variable Size             570428240 bytes
Database Buffers         1308622848 bytes
Redo Buffers               13848576 bytes
Database mounted.
SQL> show parameter job_queue_processes


NAME                  TYPE        VALUE
--------------------- ----------- ----------------------
job_queue_processes   integer     1000


SQL> alter system set job_queue_processes=0;
System altered.


SQL> alter database open;
Database altered.


SQL> alter database character set WE8MSWIN1252;
alter database character set WE8MSWIN1252
  *
ERROR at line 1:
ORA-12719: operation requires database is in RESTRICTED mode
 
SQL> update sys.props$ set value$='WE8MSWIN1252' where name='NLS_CHARACTERSET';
1 row updated.
SQL> commit;
Commit complete.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

  • Volver a levantar la base de datos y aplicar los siguientes pasos.
SQL> startup mount
ORACLE instance started.


Total System Global Area 1895825408 bytes
Fixed Size                  2925744 bytes
Variable Size             570428240 bytes
Database Buffers         1308622848 bytes
Redo Buffers               13848576 bytes
Database mounted.
SQL> alter system enable restricted session;


System altered.


SQL> alter database open;
Database altered.


SQL> alter database character set WE8MSWIN1252;
Database altered.


SQL> alter system set job_queue_processes=1000;
System altered.
 
  • Bajar la base de datos y proceder a validar los cambios.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.


Total System Global Area 1895825408 bytes
Fixed Size                  2925744 bytes
Variable Size             570428240 bytes
Database Buffers         1308622848 bytes
Redo Buffers               13848576 bytes
Database mounted.
Database opened.


SQL> select * from v$nls_parameters;


PARAMETER                      VALUE          CON_ID
-----------------------------  ----------  ---------
NLS_LANGUAGE                   AMERICAN            0
NLS_TERRITORY                  AMERICA             0
NLS_CURRENCY                   $                   0
NLS_ISO_CURRENCY               AMERICA             0
NLS_NUMERIC_CHARACTERS         .,                  0
NLS_CALENDAR                   GREGORIAN           0
NLS_DATE_FORMAT                DD-MON-RR           0
NLS_DATE_LANGUAGE              AMERICAN            0
NLS_CHARACTERSET               WE8MSWIN12          0
52
NLS_SORT                       BINARY              0
NLS_TIME_FORMAT                HH.MI.SSXF          0
F AM
. . . 
19 rows selected.
 
  • Validar cambios con datos
[oracle@dbvisit01 ~]$ env|grep NLS
NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252


[oracle@dbvisit01 ~]$ sqlplus /nolog
SQL*Plus: Release 12.1.0.2.0 Production on Thu May 14 14:10:31 2015
Copyright (c) 1982, 2014, Oracle.  All rights reserved.


SQL> connect / as sysdba
Connected.
SQL> truncate table t1;


Table truncated.


SQL> desc t1
Name                       Null?    Type
-------------------------- -------- ---------------------
NOMBRE                              VARCHAR2(20)
APELLIDO                            VARCHAR2(20)


SQL> insert into t1 values ('Fabián','Nuñez');
1 row created.
SQL> commit;


Commit complete.


SQL> select * from t1;


NOMBRE               APELLIDO
-------------------- --------------------
Fabián               Nuñez
SQL>


Aplicación en ambientes RAC
Para ambientes en RAC es necesario modificar algunos pasos al inicio del proceso y final.
  1. SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE;
  2. Bajar todas las instancias del RAC con el usuario GRID ( srvctl stop database –d
  3. Levantar la base de datos en el nodo 1
Cuando se concluya el proceso es necesario volver a revertir los cambios iniciales.
En la base de datos del nodo1 configurar el parámetro de CLUSTER_DATABASE=TRUE
SQL> STARTUP MOUNT; 
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=true scope=spfile; 
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=1000;
SQL> SHUTDOWN IMMEDIATE; 
 
Arrancar las instancias del RAC con el commando srvctl

miércoles, 25 de mayo de 2016

Gestion de Proyectos EVM – Gestión del valor ganado

Gestión del valor ganado paso a paso


EVM – Gestión del valor ganado

Es un método para medir el desempeño de un proyecto, permite comparar la cantidad de trabajo planificado con la cantidad de trabajo real que se ha realizado. Así se puede determinar si el trabajo va según lo previsto y dentro del presupuesto del proyecto.

EVM cubre las tres líneas base de la Gestión de Proyectos: Alcance, Costo y Tiempo. Unificándolo en un marco común que permite representar matemáticamente las relaciones entre ellas.

NOTA:

Hay toneladas de documentación sobre este método en internet, así que no voy a volver a decir lo mismo. En vez de eso, voy a intentar explicar todo esto por partes con un ejemplo paso a paso de este método.

Empecemos con los 4 variables principales del EVM con lo que se realizan todos los cálculos
BAC
Presupuesto a la conclusión (Budget At Completion).

La suma de todos los valores del presupuesto establecidos para el trabajo que se realizará en un proyecto.
El valor planificado total para el proyecto. También conocido como: Presupuesto a la Terminación; Presupuesto Final; o Presupuesto hasta la Terminación.
PV
Valor planeado (Planned Value). 

Indica el valor de tiempo que teníamos planificado en un momento dado del proyecto
EV
Valor Ganado ( Earned Value)

Representa el trabajo realizado en un momento dado. Representado en tiempo.
AC
Coste real (Actual Cost)

Indica el coste que llevamos a un momento dado para realizar el trabajo que llevamos realizado.

 
BAC
Cuanto se presupuesto en total del proyecto 
EAC
BAC/CPI        Cual es el costo final esperado
AC + BAC - EV
ETC
EAC- AC Cuanto dinero falta para completar el proyecto





Imaginemos que tenemos un proyecto con un presupuesto total de 200.000 € y un plazo para su realización de 12 meses. Inicialmente, según nuestra planificación de costes, los gastos no son lineales a lo largo de la vida del proyecto, si no que cada mes necesitamos una cierta cantidad de dinero:
Gasto Mensual
Acumulado
Mes 1
23.000,00
23.000,00
Mes 2
15.000,00
38.000,00
Mes 3
15.000,00
53.000,00
Mes 4
18.000,00
71.000,00
Mes 5
19.000,00
90.000,00
Mes 6
18.000,00
108.000,00
Mes 7
17.000,00
125.000,00
Mes 8
10.000,00
135.000,00
Mes 9
15.000,00
150.000,00
Mes 10
18.000,00
168.000,00
Mes 11
20.000,00
188.000,00
Mes 12
12.000,00
200.000,00
presupuesto
NOTA:
Lo más sencillo para el ejemplo, sería que el presupuesto fuera lineal, o sea, que cada mes gastáramos la misma cantidad de dinero. Pero esa premisa no suele ser lo habitual, ya que en cada periodo de tiempo, las tareas y los recursos dedicados pueden variar, por lo tanto los gastos son diferentes cada mes.
Ahora, al finalizar el quinto mes del proyecto, tenemos realizado un 30% del trabajo y un gasto acumulado de 58.000 € ¿Cómo vamos?
Empezamos calculando el EV a esa fecha:
  • Al final del quinto mes teníamos que tener realizado el 41,66% del trabajo: (5*100)/12.
  • El PV a esa fecha, es de 90.000 €
  • Por lo tanto, si solo llevamos realizado el 30% del trabajo en vez del 41,66%, para sacar el EV solo hay que aplicar una sencilla regla de tres:
EV = \frac{(90.000 * 30)}{41,66} = 64.800
Y nuestro coste real (AC) es de 58.000 €
Vale, esto esta muy bien ¿y ahora que? Ahora tenemos que calcular las variaciones que tenemos sobre el costo y el cronograma:
Variaciones:
CVCost Variance. Una medida de desempeño en función de los costos de un proyecto. También conocido como: Variación del Coste o Variación en los Costos.

Es la diferencia entre el Valor ganado y el Coste real.
CV = EV − AC
SVScheduled Variance. Una medida de desempeño del cronograma en un proyecto. También conocido como Variación de tiempo.

Es la diferencia entre el Valor ganado y el Valor planificado.
SV = EV − PV
Por lo tanto:
CV = 64.800 – 58.000 = 6.800
SV = 64.800 – 90.000 = -25.200
Ya, ya, pero ¿como vamos?
Pues está claro que si el coste del trabajo realizado menos el coste real es cero, eso quiere decir que vamos correctamente, así que:
CV = 0Correcto
CV > 0Hemos gastado menos de lo que presupuestamos
CV < 0Hemos gastado más de lo que teníamos presupuestado.
SV = 0Llevamos el cronograma a la perfección ¿Utopía?
SV > 0Hemos realizado más trabajo del planificado.
SV < 0Hemos realizado menos trabajo del planificado. Vamos retrasados.
Todo esto son valores absolutos y no nos dan una idea real de como va nuestro trabajo, para eso vamos a calcular los índices de desempeño.
índices de desempeño
CPICost Performance Index. Índice de desempeño del costo. Es la proporción del valor ganado y los costos reales.

CPI = EV / AC
SPISchedule Performance Index. Índice del desempeño del cronograma. Una medida de eficiencia del cronograma en un proyecto. Es la razón entre el valor ganado y valor planificado.

SPI = EV / PV
CPI = 64.800 / 58.000 = 1,117
SPI = 64.800 / 90.000 = 0,72
Si los índices son menores a 1, quiere decir que son desfavorables. En este caso, el SPI nos indica que solo hemos realizado el 72% de lo que estaba planificado en el cronograma.
Pero sin embargo, nuestro Índice de Desempeño de Costo (CPI) es mayor de 1. Vamos retrasado según el cronograma pero no hemos gastado lo que teníamos que haber gastado tras el quinto mes.
Cuando estamos ante esta situación y tenemos un índice favorable y otro desfavorable, podemos hacer uso de otro indicador, el CSI. Este indicador nos da una relación entre el costo y el cronograma y así saber que posibilidades tenemos de recuperar nuestro proyecto.
CSI = CPI * SPI
CSI = 1,117 * 0,72 = 0,80
La siguiente tabla define como interpretar el índice CSI.
CSI > 0,9Proyecto OK
CSI Entre 0,8 y 0,9Hay posibilidades de arreglarlo
CSI < 0.8Lo más probable es que no se arregle.
Por ahora, nuestro proyecto es salvable, así que aplicamos las medidas correctivas que estimemos oportunas para mejorar nuestro rendimiento y volvemos a revisar al final del sexto mes.
Vemos que hemos realizado el 45% del trabajo y llevamos un coste de 105.000 €, sabiendo que teníamos que tener realizado el 50% del trabajo, nos da los siguientes valores:
Indicadores
  • AC = 105.000
  • PV = 108.000
  • EV = 97.200
Variaciones
  • CV = -7.800
  • SV = -10.800
Índices
  • CPI = 0,92
  • SPI = 0,90
  • CSI = 0,83
Nuestro proyecto va mejorando, aunque todavía seguimos retrasados.
Al final del decimo mes, deberíamos llevar realizado el 83% del trabajo, sin embargo llevamos el 80% y un gasto de 175.000 €, con eso nos da lo siguiente:
Indicadores
  • AC = 175.000
  • PV = 168.000
  • EV = 161.280
Variaciones
  • CV = -13.720
  • SV = -7.720
Índices
  • CPI = 0,92
  • SPI = 0,96
  • CSI = 0,88
Bueno, bueno, vamos mejorando poco a poco, ahora hacemos el último esfuerzo y terminamos el mes doce con el 100% del trabajo realizado y un costo de 215.000 €, quedando así:
Indicadores
  • AC = 215.000
  • PV = 200.000
  • EV = 200.000
Variaciones
  • CV = -15.000
  • SV = 0
Índices
  • CPI = 0,93
  • SPI = 1
  • CSI = 0,93
Hemos terminado nuestro proyecto en plazo, pero con un sobre coste de 15.000 €. Como se ve, nuestro SPI es 1 y nuestro CPI es menor de 1, esto quiere decir que nuestro rendimiento en el cronograma al final a sido perfecto, sin embargo, a sido un poco desfavorable en cuanto al rendimiento del costo. Pero bueno, solo nos hemos excedido en un 7,5% del presupuesto, eso no esta nada mal ¿Verdad?
En el siguiente gráfico se puede ver la evolución de nuestro proyecto
progreso

martes, 26 de abril de 2016

BACKUP RECOVERY AREA

    rman target / log=$archivolog/log_rman_recovery_area_$ORACLE_SID_$fecha.log  <run {
    allocate channel ch1 device type disk;
    BACKUP RECOVERY AREA TO DESTINATION '/u02/backups/rman/$ORACLE_SID/$fecha' TAG= 'BACKUP RECOVERY AREA FS';
    }
    EOF

viernes, 8 de abril de 2016

wrap

wrap iname=input_file [ oname=output_file ]
input_file is the name of a file containing SQL statements, that you typically run using SQL*Plus. If you omit the file extension, an extension of .sql is assumed. For example, the following commands are equivalent:
wrap iname=/mydir/myfile
wrap iname=/mydir/myfile.sql
You can also specify a different file extension:
wrap iname=/mydir/myfile.src
output_file is the name of the wrapped file that is created. The defaults to that of the input file and its extension default is .plb. For example, the following commands are equivalent:
wrap iname=/mydir/myfile
wrap iname=/mydir/myfile.sql oname=/mydir/myfile.plb
You can use the option oname to specify a different file name and extension:
wrap iname=/mydir/myfile oname=/yourdir/yourfile.out

miércoles, 6 de abril de 2016

Administering a CDB with SQL*Plus

Multitenant : Connecting to Container Databases (CDB) and Pluggable Databases (PDB) in Oracle Database 12c Release 1 (12.1)



https://oracle-base.com/articles/12c/multitenant-overview-container-database-cdb-12cr1

The multitenant option introduced in Oracle Database 12c allows a single container database (CDB) to host multiple separate pluggable databases (PDB). This article describes how to connect to container databases (CDB) and pluggable databases (PDB).
Related articles.

Connecting to a Container Database (CDB)

Connecting to the root of a container database is the same as that of any previous database instance. On the database server you can use OS Authentication.
$ export ORACLE_SID=cdb1
$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Aug 26 15:29:49 2013

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL>
You can connect to other common users in similar way.
SQL> CONN system/password
Connected.
SQL>
The V$SERVICES views can be used to display available services from the database.
COLUMN name FORMAT A30

SELECT name, pdb
FROM   v$services
ORDER BY name;

NAME          PDB
------------------------------ ------------------------------
SYS$BACKGROUND                 CDB$ROOT
SYS$USERS                      CDB$ROOT
cdb1                           CDB$ROOT
cdb1XDB                        CDB$ROOT
pdb1                           PDB1
pdb2                           PDB2

6 rows selected.

SQL>
The lsnrctl utility allows you to display the available services from the command line.
$ lsnrctl service

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 20-MAY-2014 09:01:34

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
Services Summary...
Service "cdb1" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "cdb1XDB" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER 
         (ADDRESS=(PROTOCOL=tcp)(HOST=ol6-121.localdomain)(PORT=21196))
Service "pdb1" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "pdb2" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
The command completed successfully
$
Connections using services are unchanged from previous versions.
SQL> -- EZCONNECT
SQL> CONN system/password@//localhost:1521/cdb1
Connected.
SQL>

SQL> -- tnsnames.ora
SQL> CONN system/password@cdb1
Connected.
SQL>
The connection using a TNS alias requires an entry in the "$ORACLE_HOME/network/admin/tnsnames.ora" file, such as the one shown below.
CDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb1)
    )
  )

Displaying the Current Container

The SHOW CON_NAME and SHOW CON_ID commands in SQL*Plus display the current container name and ID respectively.
SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT
SQL>

SQL> SHOW CON_ID

CON_ID
------------------------------
1
SQL>
They can also be retrieved using the SYS_CONTEXT function.
SELECT SYS_CONTEXT('USERENV', 'CON_NAME')
FROM   dual;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
CDB$ROOT

SQL>


SELECT SYS_CONTEXT('USERENV', 'CON_ID')
FROM   dual;

SYS_CONTEXT('USERENV','CON_ID')
--------------------------------------------------------------------------------
1

SQL>

Switching Between Containers

When logged in to the CDB as an appropriately privileged user, the ALTER SESSION command can be used to switch between containers within the container database.
SQL> ALTER SESSION SET container = pdb1;

Session altered.

SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1
SQL> ALTER SESSION SET container = cdb$root;

Session altered.

SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT
SQL>

Connecting to a Pluggable Database (PDB)

Direct connections to pluggable databases must be made using a service. Each pluggable database automatically registers a service with the listener. This is how any application will connect to a pluggable database, as well as administrative connections.
SQL> -- EZCONNECT
SQL> CONN system/password@//localhost:1521/pdb1
Connected.
SQL>

SQL> -- tnsnames.ora
SQL> CONN system/password@pdb1
Connected.
SQL>
The connection using a TNS alias requires an entry in the "$ORACLE_HOME/network/admin/tnsnames.ora" file, such as the one shown below.
PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )
PDB users with the SYSDBA, SYSOPER, SYSBACKUP, or SYSDG privilege can connect to a closed PDB. All other PDB users can only connect when the PDB is open. As with regular databases, the PDB users require the CONNECT SESSION privilege to enable connections.

JDBC Connections to PDBs

It has already been mentioned that you must connect to a PDB using a service. This means that by default many JDBC connect strings will be broken. Valid JDBC connect strings for Oracle use the following format.
# Syntax
jdbc:oracle:thin:@[HOST][:PORT]:SID
jdbc:oracle:thin:@[HOST][:PORT]/SERVICE

# Example
jdbc:oracle:thin:@ol6-121:1521:pdb1
jdbc:oracle:thin:@ol6-121:1521/pdb1
When attempting to connect to a PDB using the SID format, you will receive the following error.
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
Ideally, you would correct the connect string to use services instead of SIDs, but if that is a problem the USE_SID_AS_SERVICE_listener_name listener parameter can be used.
Edit the "$ORACLE_HOME/network/admin/listener.ora" file, adding the following entry, with the "listener" name matching that used by your listener.
USE_SID_AS_SERVICE_listener=on
Reload or restart the listener.
$ lsnrctl reload
Now both of the following connection attempts will be successful as any SIDs will be treated as services.
jdbc:oracle:thin:@ol6-121:1521:pdb1
jdbc:oracle:thin:@ol6-121:1521/pdb1