Tabla de Contenidos

Oracle DB

Descripción

Base de datos muy popular  pero el montaje es una mamera.

Prerequistos

Tener un linux instalado usualmente de famila redhat  (centos, redhat u oracle)  aun cuando lo hemos logrado ocasionalmente en debians

Oracle ofrece maquinas virtuales ya con el sistema instalado

Procedimiento

1. Instalación del server

Descargue el rpm para instalar y siga las instrucciones

** OJO .. se requiere 2G en Swap y el nombre del equipo en el hosts.

** OJO hay un usuario administrador (system) que se crea usualmente cuando se instala. Recuerdele. Si es la maquina virtual de Oracle la contraseña es “oracle”

2. Configurar

Agregue el path en el /etc/profile

**.  /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh


** Para 18c recomiendan instalar rlwrap (para tener history)

export ORACLE_SID=XE
export ORAENV_ASK=NO
. /opt/oracle/product/18c/dbhomeXE/bin/oraenv

alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
**
**
Crear Usuario


Esto no lo hacemos nosotros pero a veces en Oracle XE se hace

sqlplus system

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> create user admin identified by “orfeo”;

User created.

En la 18c .. toca crear el usuario con C## (para que funcione remoto)

create user C##PROGRAMAS identified by contraseña default tablespace USERS;



Crear Base de Datos

XE no permite tener BDs independientes .. solo es una


**Asigne permisos al usuario

**SQL>  grant CREATE SESSION, ALTER SESSION, CREATE DATABASE LINK, -
  CREATE MATERIALIZED VIEW, CREATE PROCEDURE, CREATE PUBLIC SYNONYM, -
  CREATE ROLE, CREATE SEQUENCE, CREATE SYNONYM, CREATE TABLE, -
  CREATE TRIGGER, CREATE TYPE, CREATE VIEW, UNLIMITED TABLESPACE -
  to admin ;

Grant succeeded.


En 18c a veces no es suficiente. ( a veces)

El create session para que se pudiera loguear remoto me toco agregarselo desde la interfaz de ME 5500  .. en seguridad → usuarios → privilegios y roles


Permita Acceso remoto

**
EN 
18c** XE  TOCO !!! ponerle unas reglas de firewall para que oiga desde afuera (si no solo funciona en localhost)

$>   sysctl -w net.ipv4.conf.all.route_localnet=1
$>   iptables -t nat -A PREROUTING -p TCP -i eth0 -d 192.168.8.71  –dport 1521  -j DNAT –to-destination 127.0.0.1:1539

o
$>   iptables -t nat -A PREROUTING -p TCP -i eth0 -d 192.168.8.71  –dport 1521  -j DNAT –to-destination 127.0.0.1:1521


Se puede intentar cambiar las cosas .. pero es un camello para que escuche por no solo localhost

https://surachart.blogspot.com/2018/10/oracle-database-em-18-xe-available-to.html

SQL>  EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

Ahi puede ingresar a una interfaz grafica web .. que necesita flash pero esta bonita

https://server:5500/em     ingresa con sys / password / XEPDB1


Conectarse remoto por linea de comandos


sqlplus admin/orfeo@//192.168.8.8:1521/ 

pero para hacerlo debe

Instale los paquetes

oracle-instantclient11.2-basic
oracle-instantclient11.2-sqlplus

Lo unico adicional ..fue agregar a ld.so.conf el directorio “/usr/lib/oracle/11.2/client/lib/“  donde estan las librerias y correr ldconfig para que ya el sqlplus funcionara

PHP y OCI8

El soporte para el acceso remoto pasa por montar las librerias de soporte. Descargue basic y sqlplus. Puede tambien descargar tools y el sdk despues.

https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

** el pdo_oci ya estan incluido en los fuentes de PHP y toca compilarlo por aparte

Referencias

- Configurar PHP con OCI8  de aqui la opcion de PECL es la mas facil
- El manual de la extecion de PECL

En esencia, para PHP7 haga
- Monte el instantclient-devel
- pecl  pecl install oci8-2.2.0
  en el momento de compilar en vez del ORACLE_HOME ponga  instantclient,/usr/lib/oracle/19.6/client64/lib/
- Listo .. agregue extension=oci8.so en el php.in
- Reinicie apache

EL formato de las fechas

Esto es un camello. Se puede cambiar en muchos sitios, pero no siempre funciona. Si quiere chequear como esta haga

SQL>    select sysdate from dual;

Cambiarlo en la sesion que me encuentro con

SQL>  ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'

O Asignarlo directo en el sistema con :

SQL> ALTER SYSTEM SET NLS_DATE_FORMAT='YYYY-MM-DD'

Para el sistema este ulitmo no funciona .. entonces toca la variable de ambiente .. con 11g funciona .. pero con 18c nop

Lo intente desde el administrador web  (ME) de 18c .. pero tampoco . Este ejecuta el comando para registrarlo en el SPFILE ..pero igual no anda

SQL>  alter system set “nls_date_format”='YYYY-MM-DD' comment='Para OrfeoNG' scope=spfile sid='*';

Hay otro sistema que es creando un trigger de session para el usuario .. pero en xe no lo he logrado hacer funcionar con un usuario diferente a system

SQL> CREATE OR REPLACE TRIGGER SCOTT.CHANGE_DATE_FORMATAFTER LOGON ON DATABASEWHEN (USER='SCOTT')beginexecute immediate 'alter session set nls_date_format = "YYYY-MM-DD" ';end ;/--------**** recordar que antes conectarse por consola sqlplus ejecute export NLS_LANG=.AL32UTF8

Trucos

1. SQLPLUS con formateo de la salida

El acceso es

  sqlplus skina/skina@//192.168.10.11:1521/cygnus11 < entrada> salida

donde la entrada tiene el sql con lo siguiente pa que formatee bien separandolos campos por “|”


set echo off
set newpage 0
set pagesize 0
set space 0
18c set feedback off
set trimspool on
set heading off
set linesize 555
SELECT C.I_CODIGO || '|' || C.C_IDENTIFICACION || '|' || C.C_CLAVE_INT || '|' || C.C_CLAVE || '|' || C.C_APELLIDOS || '|' || C.C_NOMBRES || '|' || C.C_DIRECCION || '|' || C.C_TELEFONO || '|' || C.F_FEC_INGRESO || '|' || B.C_NOMBRE || '|' || A.C_DESCRIPCION || '|' || D.D_END_MAX FROM DEPENDENCIAS A, PAGADURIAS B, PERSONAS C, VIS_NIV_END D WHERE C.I_PAGADURIA = B.I_CODIGO And C.I_DEPENDENCIA = A.I_CODIGO And C.I_CODIGO = D.I_CODIGO AND C.I_TIPO_CLIENTE in (1,2) ORDER BY 1 ASC;
exit



http://docs.oracle.com/cd/B19306_01/server.102/b14357/ape.htm
http://www.rocket99.com/techref/8716.html

2. Borrar todas las tablas de una BD


select 'drop table ', table_name, 'cascade constraints;' from user_tables;

Y ejecutar el comando resultante

https://www.digitalsanctuary.com/database/an-easy-way-to-drop-all-of-the-tables-in-your-tablespace-in-oracle.html

En la 19c me funciono mejor

BEGIN FOR c IN (SELECT table_name FROM user_tables) LOOP EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'); END LOOP; FOR s IN (SELECT sequence_name FROM user_sequences) LOOP EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name); END LOOP; END;


En 18c XE se puede borrar todo y reiniciarlo con

/etc/init.d/oracle   delete

3. Cambio de contraseña

ALTER USER my_user IDENTIFIED BY MyNewPassword123;

4. Migrar bases de datos

4.1.  Usando impdp

Es mas complicado que en las otras bases de  datos .. no basta un DUMP clasico .. pero se usa algo parecido llamado expdp impdp que estan en instantclient-tools

https://stackoverflow.com/questions/45489236/oracle-importing-exporting-with-command-line


Follow this steps:

EXPORT:

1- Create a export directory on source server. mkdir /path/path
2- Grant oracle user. chown oracle /path/path
3- Create a directory in database. CREATE DIRECTORY Your_Dir_Name as '/path/path';
4- Add your Oracle user to EXP_FULL_DATABASE role. Grant EXP_FULL_DATABASE to your_user;
5- Grant your created directory in database to role. GRANT READ, WRITE  ON DIRECTORY Your_Dir_Name TO EXP_FULL_DATABASE ;
6- Execute expdp command with oracle user. expdp your_db_user/password schemas=Your_Schema_Name tables=table_name directory=Your_Dir_Name version=your_version_for_target_db dumpfile=data.dmp logfile=data.log (EXPDP command takes a lot of parameter I wrote examples. check all parameters https://oracle-base.com/articles/10g/oracle-data-pump-10g)

IMPORT:

1- Create a import directory on target server. mkdir /path/path
2- Grant oracle user. chown oracle /path/path
3- Create a directory in target database. CREATE DIRECTORY Your_Dir_Name as '/path/path';
4- Add your Oracle user to IMP_FULL_DATABASE role. Grant IMP_FULL_DATABASE to your_user;
5- Grant your created directory in database to role. GRANT READ, WRITE  ON DIRECTORY Your_Dir_Name TO IMP_FULL_DATABASE ;
6- Execute impdp command with oracle user. impdp your_db_user/password  directory=Your_Dir_Name dumpfile=data.dmp logfile=data.log (IMPDP command takes a lot of parameter I wrote examples. check all parameters https://oracle-base.com/articles/10g/oracle-data-pump-10g)(If you want rename schema,tablespace,table use remap parameter).

4.2 Usando SQL

Se puede exportar la base de datos en SQL desde sqldevelopper y subirla con sqlplus al otro lado. Importante que el SCHEMA (el usuario) sea el mismo para que funcione

4.3. Conexion directa


Se puede usar vinculo directo .. pero solo me funciona con usuarios con privilegios completos.

Toca definir el otro servidor en tsnames.ora

http://www.dba-oracle.com/t_expdp_network_link.htm
https://www.dbajunior.com/implement-data-pump-to-and-from-remote-databases/

En 18c me funcionó usando expdb del schema c##orfeo_usr

5. Migrando maquinas


Debe actualizar la direccion IP del nombre de la maquina en /etc/hosts para que funcione

Problemas

1. The account is locked

Conectese como sysdba

SQL> alter user orfeo_usr account unlock;
 

2. No escucha por el 1521 publico


A veces en 11g me ha tocado configurar el listener para que escuche. Cambien el host de localhost al suyo

/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora

Y en /etc/hosts .. asigna una ip al nombre y reinicie
 

Referencias

- http://www.davidghedini.com/pg/entry/install_oracle_11g_xe_on
- http://docs.oracle.com/cd/E17781_01/install.112/e18802/toc.htm
- http://blog.pedrocarrico.net/post/10031075627/installing-oracle-11g-xe-on-centos6
 
Un guia para 18c en Centos 8 https://josehuaman.com/instalacion-de-oracle-18c-xe-sobre-centos-rhel-8/
El howto oficial https://docs.oracle.com/en/database/oracle/oracle-database/18/xeinl/connecting-oracle-database-xe.html

Guia de configuracion posterior en 18c

FIN


Advertencia

Este documento es privado y es de u so exclusivo de sus autores y de SKINA TECH. Cualquier uso sin una autorización escrita es contra la ley de derechos de autor y de propiedad intelectual, y será motivo de una acción legal.


 

15-Marzo-2006 J.E.Gomez v1.0 Primera version