====== 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\\ \\ - [[https://www.php.net/manual/es/oci8.installation.php|Configurar PHP con OCI8]]  de aqui la opcion de PECL es la mas facil\\ - [[https://pecl.php.net/package/oci8|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