select substr(HOST_NAME,1,11) as SERVER,char(session_user,8) as INSTANCIA,char(current_server,9) as DB, substr(firstlog,1,13) as "StartLog", substr(lastlog,1,13) as "EndLog",
substr(location,1,36) as Ruta,
case(operationType)
when 'F' then 'Offline Full'
when 'N' then 'Online Full'
when 'I' then 'Offline Incremental'
when 'O' then 'Online Incremental'
when 'D' then 'Offline Delta'
when 'E' then 'Online Delta'
else '?'
end as TIPOBACKUP,
case objecttype
when 'D' then 'DataBase'
when 'P' then 'TableSpace'
when 'T' then 'Table'
end OBJETO,
date(timestamp(end_time)) as "FECHA",
time(timestamp(start_time)) as "H-INICIO",
time(timestamp(end_time)) as "H-FIN",
timestampdiff(4,char(timestamp(end_time)-timestamp(start_time))) as "TOTAL(min)",
case when (SQLCODE < 0 ) then char('ERROR',5)
else 'OK' end as Status
from SYSIBMADM.DB_HISTORY,sysibm.sysdummy1,TABLE(SYSPROC.ENV_GET_SYS_INFO())
where operation = 'B' ORDER BY "FECHA" DESC FETCH FIRST 1 ROWS ONLY;
DB2 - Listar ultimo Backup generado en una Base de Datos
Oracle Spool desde sqlplus Generar resultado como tabla
#--Generar resultado como tabla separador '|' desde sqlplus
set serveroutput on size 999999
set linesize 5000
set colsep '|'
set echo on
set feedback on
set pagesize 5000
set trimspool on
set heading on
spool SALIDA_TABLA.txt;
start Consulta_Tabla.sql;
spool off
MARCACION|PROCESO|CASO|DESC|
------------|----------|----------|--------------|
9139| 706| 83741| 82499|
46722| 525| 83741| 82499|
#--Generar resultado como tabla separador ';' desde sqlplus
set serveroutput on size 999999
set colsep ';'
set echo off
set feedback on
set pagesize 32767
set trimspool on
set heading on
set trimout on
set LINESIZE 32767
spool on
spool ConsultaTabla.csv
SELECT * FROM tabla_pruebas;
spool off;
Cambiar horario de UTC a Colombia en EC2/Linux/AWS
Cambiar horario de UTC a Colombia en EC2/Linux/AWS
[ec2-user~]$timedatectl list-timezones
Estamos decididos al cambio ejecutamos
[ec2-user~]$ sudo timedatectl set-timezone America/Bogota
[ec2-user~]$ date
Como restaurar BD de MongoDB
Como restaurar BD de Mongo
mongorestore --host=localhost --port=27021 --authenticationDatabase="admin" -u="dba" -p="*****" --db test /backup_mongodb/test/
Crear Backup de BDs de MongoDB
Crear Backup de BDs de MongoDB
mongodump --host=localhost --port=27021 --authenticationDatabase="admin" -u="dba" -p="****" --out=/backup_mongodb
mongodump --host=localhost --port=27021 --out=/backup_mongodb
MongoDB en replicaset para pruebas
Mongo con Replicaset en 1 solo Nodo
con usuario mongod vamos a editar el archivo de configuración que trae la instalación.
vi /etc/mongod.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /mongo_data/single/
journal:
enabled: true
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
journalCompressor: snappy
directoryForIndexes: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27024
bindIp: 0.0.0.0
#security:
# authorization: enabled #Se modifica al final cuando se haya creado el usuario de autenticacion
#operationProfiling:
replication:
#oplogSizeMB: 1024
replSetName: mongodbsingle
#sharding:
[root@vm-l-01 etc]# ls -larth mongo*
-rw-r--r-- 1 mongod mongod 711 Jul 14 19:52 mongod.conf
Iniciar servicio
[root@vm-l-01 etc]# systemctl start mongod
[root@vm-l-01 etc]# systemctl status mongod
.png)
[root@vm-l-01 etc]# systemctl stop mongod
--con usuario mongod
[mongod@vm-l-01 ~]$ mongo --host localhost:27024
MongoDB shell version v4.2.14-rc0
--Creamos el Nodo que va a utilizar la replication
> rs.initiate({_id : "mongodbsingle",members: [{ _id : 0, host : "192.168.9.204:27024" }]})
{ "ok" : 1 }
--Revisamos el estado de los nodos de la replica
mongodbsingle:PRIMARY> rs.status()
{
"set" : "mongodbsingle",
"date" : ISODate("2021-07-14T19:49:23.275Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 1,
"writeMajorityCount" : 1,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1626292154, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2021-07-14T19:49:14.037Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1626292154, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2021-07-14T19:49:14.037Z"),
"appliedOpTime" : {
"ts" : Timestamp(1626292154, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1626292154, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2021-07-14T19:49:14.037Z"),
"lastDurableWallTime" : ISODate("2021-07-14T19:49:14.037Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1626292114, 4),
"lastStableCheckpointTimestamp" : Timestamp(1626292114, 4),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2021-07-14T19:48:34.026Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1626292114, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 1,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"newTermStartDate" : ISODate("2021-07-14T19:48:34.036Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2021-07-14T19:48:34.042Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.9.204:27024",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 543,
"optime" : {
"ts" : Timestamp(1626292154, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-07-14T19:49:14Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1626292114, 2),
"electionDate" : ISODate("2021-07-14T19:48:34Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1626292154, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1626292154, 1)
}
--Listar las BD de Inicio
mongodbsingle:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
--Pasamos a admin
mongodbsingle:PRIMARY> use admin
switched to db admin
--Creamos el usuario
mongodbsingle:PRIMARY> db.createUser( { user: "dba", pwd: "dba2021*", roles: [ { role:"root", db:"admin" } ] } )
Successfully added user: {
"user" : "dba",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
mongodbsingle:PRIMARY> show users
{
"_id" : "admin.dba",
"userId" : UUID("a35e5a67-06d3-4a63-a4a4-9f3408841f95"),
"user" : "dba",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
mongodbsingle:PRIMARY> exit
bye
--Habilitar la autenticacion
[root@vm-l-01 /]# systemctl stop mongod
[root@vm-l-01 /]# vi /etc/mongod.conf
--descomentar las lineas
security:
authorization: enabled
--Volver a subir servicio de MongoDB
[root@vm-l-01 /]# systemctl start mongod
[root@vm-l-01 /]# systemctl status mongod
[mongod@vm-l-01 ~]$ mongo -u dba --host localhost:27024
pwd:*****
---Ver el alert de la BD
[mongod@vm-l-01 mongodb]$ tail -300f /var/log/mongodb/mongod.log
---Probar conexión por herramienta MongoDB Compass
Cancelar Sesiones con scripts en RDS AWS
Cancelar Sesiones con scripts en RDS AWS
Cuando tenemos bases de datos oracle en AWS en momentos nos piden cerrar todas las sesiones INACTIVE o ACTIVE, cuando es una es muy facil, pero cuando son muchas sesiones se debe recurrir a instrucciones que nos ayuden a ganar tiempo.
SQL> select s.username, s.status, count(1) from v$process p, v$session s where paddr(+)=addr group by s.status, s.username order by 1;
USERNAME STATUS COUNT(1)
------------------------------ -------- ----------
AWSDBA ACTIVE 1
AWSDBA INACTIVE 1
APP INACTIVE 30
RDSADMIN INACTIVE 1
Podemos utilizar el script con DISCONNECT
SQL> select status,OSUSER,USERNAME,'EXEC rdsadmin.rdsadmin_util.disconnect('||''||SID||','||serial#||''||' ); ' cadena from v$session where status like '%&STATUS%' AND USERNAME like '%&USER%' ;
INACTIVE jboss APP
SQL> EXEC rdsadmin.rdsadmin_util.disconnect(3866,5704 );
Podemos utilizar el script con KILL
SQL> select status,OSUSER,USERNAME,'begin rdsadmin.rdsadmin_util.kill(sid=> '||''||SID||',serial =>'||serial#||''||' );end; ' cadena from v$session where status like '%&STATUS%' AND USERNAME like '%&USER%' ;
SQL> begin rdsadmin.rdsadmin_util.kill(51,59312,'IMMEDIATE');end;
2 /
Convertir SCN a Marca de Tiempo (scn_to_timestamp)
Convertir SCN a Marca de Tiempo (scn_to_timestamp)
Buscando información me intereso este post importante para temas de recuperación de datos tomado y traducido en google "Vi la buena función a continuación mientras leía sobre la sección de bloqueo y pestillos del Libro del Sr. Thomas Kytes (Expert Oracle Architecture Architecture 9i y 10g Programming Techniques and Solutions) y me dije a mí mismo que tenía que compartirlo para personas como yo. 
Si conoce el SCN (número de cambio del sistema), puede obtener su valor de marca de tiempo (dentro de aproximadamente +/– 3 segundos) mediante la función scn_to_timestamp. Después de mirar el manual para obtener más información, vi otras dos buenas funciones sobre scn. Todos están bajo el paquete DBMS_FLASHBACK y no están disponibles para las versiones anteriores a 10 g. Encontré estas funciones útiles para problemas de recuperación de datos, problemas de recuperación y problemas de flashback."
SQL> select TO_CHAR(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER) from dual;
TO_CHAR(DBMS_FLASHBACK.GET_SYSTEM_CHANGE
----------------------------------------
12282276930740
Convertir a Fecha y hora
SQL> select scn_to_timestamp(12282276930740) as timestamp from dual; ---Valor anterior
TIMESTAMP
---------------------------------------------------------------------------
05-JUN-20 02.39.34.000000000 AM
Convertir de Fecha y Hora a SCN
SQL> select TO_CHAR(timestamp_to_scn(to_timestamp('05/06/2020 02:39:34','DD/MM/YYYY HH24:MI:SS'))) as scn from dual;
SCN
----------------------------------------
12282276930737
Tomado de: http://hemora.blogspot.com/search/label/SCN
Resolver atraso de archive entre PRIMARY y STANDBY - Dataguard
Resolver atraso de archive entre PRIMARY y STANDBY - Dataguard
Una base de datos de StandBy se sincroniza con la primaria mediante la aplicación continua de registros de archivo de una base de datos primaria.
Cuando faltan los registros en espera, hay menos de 10-15 números. Podemos enviar los registros que faltan en la base de datos en espera desde la base de datos primaria mediante SCP / FTP y luego registrar los archivos de registro en espera para resolver el atraso.
Utilice la consulta a continuación para encontrar la direfencia de archivo en modo de espera:
SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received", APPL.SEQUENCE# "Last Sequence Applied", (ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference"
FROM (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
(SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
WHERE ARCH.THREAD# = APPL.THREAD# ORDER BY 1;
Thread Last Sequence Received Last Sequence Applied Difference
---------- ---------------------- --------------------- ----------
1 820398 820369 29
Última secuencia recibida Última secuencia aplicada:
SQL> SELECT THREAD#, MAX(SEQUENCE#) AS "LAST_APPLIED_LOG" FROM V$LOG_HISTORY GROUP BY THREAD#;
THREAD# LAST_APPLIED_LOG
---------- ----------------
1 820369
Copiar archive desde la BD PRIMARIA:
scp oracle@10.18.0.9:/backup/archive/PRD1/*820254* oracle@10.19.0.10:/backup/archive/STB1/
Registar el archive log en BD STANDBY:
SQL> alter database register logfile '/backup/archive/STB1/820254.arc';
logfile registered
Repita el mismo proceso para todos los archivos de registro que faltan en el modo de standby.
Otras referencias: http://hemora.blogspot.com/2012/12/resolving-gaps-in-data-guard-apply.html
Tamaño de Base de Datos Oracle
Estos scripts retornan el tamaño de las Bases de Datos incluyendo data, temp, controlfile, redos.
#---Tamano-en-MB-#
SELECT a.data_size_mb
, b.temp_size_mb
, c.redo_size_mb
, d.controlfile_size_mb,
a.data_size_mb
+ b.temp_size_mb
+ c.redo_size_mb
+ d.controlfile_size_mb "total_size in MB"
FROM (SELECT SUM (BYTES) / 1024 / 1024 data_size_mb
FROM dba_data_files) a,
(SELECT NVL (SUM (BYTES), 0) / 1024 / 1024 temp_size_mb
FROM dba_temp_files) b,
(SELECT SUM (BYTES) / 1024 / 1024 redo_size_mb
FROM SYS.v_$log) c,
(SELECT SUM (block_size * file_size_blks)/1024/1024 controlfile_size_mb
FROM v$controlfile) d;
DATA_SIZE_MB TEMP_SIZE_MB REDO_SIZE_MB CONTROLFILE_SIZE_MB total_size in MB
------------ ------------ ------------ ------------------- ----------------
381448 20735.9922 1500 57.75 403741.742
#---Tamano-en-GB-#
SELECT a.data_size_gb
, b.temp_size_gb
, c.redo_size_gb
, d.controlfile_size_gb,
a.data_size_gb
+ b.temp_size_gb
+ c.redo_size_gb
+ d.controlfile_size_gb "total_size in MB"
FROM (SELECT SUM (BYTES) / 1024 / 1024 /1024 data_size_gb
FROM dba_data_files) a,
(SELECT NVL (SUM (BYTES), 0) / 1024 / 1024/1024 temp_size_gb
FROM dba_temp_files) b,
(SELECT SUM (BYTES) / 1024 / 1024/1024 redo_size_gb
FROM SYS.v_$log) c,
(SELECT SUM (block_size * file_size_blks)/1024/1024/1024 controlfile_size_gb
FROM v$controlfile) d;
DATA_SIZE_GB TEMP_SIZE_GB REDO_SIZE_GB CONTROLFILE_SIZE_GB total_size in MB
------------ ------------ ------------ ------------------- ----------------
372.507813 20.2499924 1.46484375 .056396484 394.279045
Monitorear Conexiones "Procesos" ejecutandosen en la Instancia de MySQL
Revisión Full de los procesos
SHOW FULL PROCESSLIST;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' and command!='Binlog Dump';
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' and command!='Binlog Dump';
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 0;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 0;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME >= 5;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %';
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND INFO LIKE '%UPDATE %';
SELECT `ID`, `USER`, `HOST`, `DB`, `COMMAND`, `TIME`, `STATE`, LEFT(`INFO`, 51200) AS `Info` FROM `information_schema`.`PROCESSLIST`
where command <> 'sleep' order by time desc;
SELECT `ID`, `USER`, `HOST`, `DB`, `COMMAND`, `TIME`, `STATE`, LEFT(`INFO`, 51200) AS `Info` FROM `information_schema`.`PROCESSLIST` where command <> 'sleep' order by time desc;
SELECT `ID`, `USER`, `HOST`, `DB`, `COMMAND`, `TIME`, `STATE`, LEFT(`INFO`, 51200) AS `Info` FROM `information_schema`.`PROCESSLIST`
where command !='Sleep'
order by 6 desc;
SELECT `ID`, `USER`, `HOST`, `DB`, `COMMAND`, `TIME`, `STATE`, LEFT(`INFO`, 51200) AS `Info` FROM `information_schema`.`PROCESSLIST` where command !='Sleep' order by 6 desc;
Backup de Base de Datos MySQL
El instalador de MySQL trae por defecto dentro de las utilerías, un comando que nos sirve para realizar respaldos de datos en el servidor MySQL. Dicho comando es mysqldump.
El comando mysqldump se utiliza desde la terminal y recibe una serie de parámetros en los cuales podemos definir el realizar un respaldo completo de una base de datos específica ó tablas específicas dentro de una base de datos. Esto es muy útil cuando tenemos información crítica y deseamos implementar una tarea automática de respaldos.
Así como con el cliente de MySQL, el comando mysqldump necesita de un usuario que tenga los privilegios necesarios para extraer la información de la base de datos a respaldar.
La sintaxis básica del comando mysqldump es:
El comando mysqldump se utiliza desde la terminal y recibe una serie de parámetros en los cuales podemos definir el realizar un respaldo completo de una base de datos específica ó tablas específicas dentro de una base de datos. Esto es muy útil cuando tenemos información crítica y deseamos implementar una tarea automática de respaldos.
Así como con el cliente de MySQL, el comando mysqldump necesita de un usuario que tenga los privilegios necesarios para extraer la información de la base de datos a respaldar.
La sintaxis básica del comando mysqldump es:
mysqldump -u [usuario] -p [base de datos] > [archivo de respaldo].bkp
La sintaxis del comando mysqldump para sacar todo lo de la Base de Datos a respaldo es:
mysqldump -u root -p -S/data_mysql/data1/mysql.sock_1 -B --add-drop-table --routines --triggers --events --create-options mysql > /data_mysql/backup/bk_mysql.bkp
La sintaxis del comando mysqldump para ignorar tablas pesadas de la Base de Datos a respaldo es:
mysqldump -u root -p -S/data_mysql/data1/mysql.sock_1 -B --add-drop-table --routines --triggers --events --create-options --ignore-table=mysql.tabla_pesada mysql > /data_mysql/backup/bk_sin_tabla_pesada.bkp
Backup de 1 o mas Tablas de una Base de Datos en MySQL
Hacer Backup de 1 o mas Tablas de una Base de Datos en MySQL
mysqldump -p -uroot BasedeDatos tabla1 tabla2 > /Backup/backup_tablas_consolidado_2018.bkp
Backup Full de una Base de Datos MySQL y Comprimirlo
Hacer un Backup Full de una Base de Datos MySQL y Comprimirlo
A disco Local:
A disco Local:
mysqldump --add-drop-database --add-drop-table -B --create-options --log-error=/backup/errores_backup_full_BasedeDatos_29042019.log --routines --triggers -S/tmp/mysql1.sock -uroot -p BasedeDatos |gzip >/backup/BasedeDatos_29042019.gz
Ignoring query to other database - Error MySQL
Ignoring query to other database - Error
Nos puede pasar en algunas ocasiones que al querer conectarnos a la base de datos MySQL por Linux nos de el siguiente error: "Ignoring query to other database"
El problema: "mysql -root -p -S/data1/mysql.sock_1"
Normalmente nos pasa a los que tenemos apuro y nos olvidamos de escribir bien la sintaxis.
La solución; "mysql -u root -p -S/data1/mysql.sock_1"
Aquí podemos verificar que la diferencia de la primera con la segunda es la falta de la "u" antes del usuario de la base.
Depurar homes de Oracle y Grid con ADRCI
Exportamos las variables de Grid:
. oraenv
ORACLE_SID = [] ?+ASM ó +ASM1 (depende del tipo de instalación)
ORACLE_SID = [] ?+ASM ó +ASM1 (depende del tipo de instalación)
ORACLE_HOME = [] ? /oracle/DB/dbhome_1
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
for f in $( adrci exec="show homes" | grep -v "ADR Homes:" );
do
echo "Purging ${f}:";
adrci exec="set home $f; purge -age 0 ;" ;
done
Purging
diag/tnslsnr/bmbdpt01/listener:
Purging
diag/asm/+asm/+ASM:
Purging
diag/crs/bmbdpt01/crs:
Exportamos las variables de Base de Datos Oracle:
. oraenv
ORACLE_SID = [] ?+BD1 ó +BD2 (Nombre de la Base de Datos)
ORACLE_HOME = [] ?/grid/GI/12.0.1
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
for
f in $( adrci exec="show homes" | grep -v "ADR Homes:" );
do
echo "Purging ${f}:";
adrci exec="set home $f; purge -age 0
;" ;
done
Lo cual genera una salida como esta:
Purging
diag/rdbms/BD1/BD1:
Purging
diag/clients/user_oracle/host_2343385924_82:
Suscribirse a:
Entradas (Atom)













