Aligerar Xiami

Puede  que su terminal Android que viene de fábrica con un puñado de aplicaciones ya no le interesan lo más mínimo. No se desespere pues hay varias cosas que se pueden hacer y no todas requieren de permisos de root


La mayoría de dispositivos Android  suelen  venir con unas cuantas aplicaciones preinstaladas, ciertamente algunas de ellas  obligatorias como por ejemplo el propio teléfono  o el servicio de mensajeria. Ademas  los fabricantes que quieren incluir los servicios de Google se comprometen a incluir una serie de aplicaciones “recomendadas ” por Google, pero  otras provienen de acuerdos con terceras partes o porque pensaron que serían útiles.

El problema es que algunas de estas aplicaciones preinstaladas podrían no ser de  interés, pero  lo peor  no eso sino que  no siempre se puede desinstalar sin más( de hecho cuando esto sucede, se las denomina bloatware, un término que se usa para nombrar las aplicaciones preinstaladas que hacen el sistema más pesado, sin aportar gran cosa).

Precisamente en este post vamos a centrarnos  en todo el sw que suele añadir Xiami  en sus terminales , sw que no siempre nos resulta de interés sobre todo por el valioso espacio que ocupa en la limitada memoria del terminal

Photo by Tracy Le Blanc on Pexels.com

 

 

En efecto  cualquiera que adquiera un terminal XIaomi es fácil que incluya alguna o todas de  las aplicaciones siguientes:

  • Joyose: servicios de entretenimiento
  • Mi App store : tienda de apliaciones de Xiaomi
  • Mi Cloud : nube de Xiaimi
  • Mi Credit :credito para tienda de Xiaomi
  • Mi Drop :envio de archivos
  • Mi Pay :servicio de pagos
  • Mi Recycle:papelera 
  • Miui Daemon:recolector de estadisticas
  • MiWebView :Ejecución de contenido desde la red
  • MSA:MSA es el servicio instalado de Xiaomi para mostrar anuncios a lo largo de diferentes apps e interfaces gráficas en los smartphones. No es fácil deshabilitarlo, probablemente se necesitan más de un intento para que realmente quitarlo. Además, es importante que esté conectado a interne
  • PAI :PAI son las siglas de Personal Activity Intelligence, que es un nuevo algoritmo que, en vez de darnos pasos, tiempos o distancia, nos proporciona un número único que indica qué tan activos debemos estar para llevar una vida más sana.
  • PartnerBookmarks :Enlaces asociados
  • Xiaomi Service Framework : Sincronizador de servicios de Xiaomi
  • Xiaomi SIM Activate ServiceServicio para activar SIMs
  • etc

 

Puede que no todo este sw le interese ..¿pero se puede eliminar si mas?..Pues  veamos en primer lugar las herramientas que nos pone Android  y después veremos en efecto que existen  otras opciones para eliminar este sw   y recuperar esa cantidad de memoria que tanto necesitamos  

 

 Desinstalación  manual de aplicaciones

Ciertamente  hay aplicaciones que no se pueden desinstalar normalmente ,pues  como comentábamos  no solo porque una aplicación esté preinstalada en su móvil o tablet no quiere decir que sea imposible de desinstalar. En algunos casos, afortunadamente, todavía hay  aplicaciones instaladas de forma tradicional, de modo que si se  pueden desinstalar normalmente.

La forma más fácil de comprobar si es así  es hacer una pulsación prolongada y ver si te aparece la opción de desinstalar (si es así como funciona en tu lanzador).Si no, vaya a Ajustes – Aplicaciones, busque la aplicación en cuestión y mire si dispone del botón Desinstalar en su pantalla de información:si el botón es Desinstalar en vez de Desactivar, puede librarse de la aplicación para siempre, sin más.

Deshabilitación de aplicaciones

Para las aplicaciones preinstaladas que no se pueden desinstalar normalmente (que, desgraciadamente, es lo más común), la mayoría permiten sin entrar en el territorio root es la deshabilitación. Una aplicación deshabilitada sigue estando en el sistema ( y por tanto ocupando espacio en la memoria interna) , pero se  ve en el lanzador, no se abre y ocupa algo menos espacio.

Una aplicación deshabilitada pues  sigue estando físicamente en el sistema y ocupando algo del espacio disponible  ya que es el tamaño del APK incluido en el sistema, sin contar las posteriores actualizaciones y datos, que en algunos casos pueden ser de varios cientos de megas.

Para deshabilitar una aplicación vaya a Ajustes – Aplicaciones, busquea la aplicación que quiere desactivar y pulse el botón Desactivar. Esto, generalmente, implica desinstalar las actualizaciones que se hayan instalado posteriormente. 

 

Usar herramientas a medida para eliminar aplicaciones en su Xiaomi

Deshabilitar aplicaciones no es la forma definitiva de librarse del sw del fabricante, de Google o  de operadora , aunque por lo menos es la solución más sencilla para obtener un resultado aceptable, sin necesidad de hacer root o nada fuera de lo normal.

Si su deseo es aligerar aun mas memoria  y su terminal es Xiami , sin ser root , todavía existe una herramienta que nos va a permitir eliminar tanto el sw que Xiaomi proporciona como el que el propio Google recomienda que quizas  tampoco nos interese ( por ejemplo Google Duo, Google Play movies o Google play music)

Bien la herramienta se llama XiaomiABFastbootTools  y es gratuita  estando disponible en Github en  https://github.com/Szaki/XiaomiADBFastbootTools

Esta a herramienta viene comprimida en un fichero jar pero antes de descargarla  y ejecutarla deberá oratoriamente que cumplir los siguientes  requisitos :

        •  Depuración USB activada en el terminal.
        •  Java instalado en PC con Windows ( a ser posible Java SE Development kit  en version 64 bits).

De la  herramienta Xiaomi ADB Fastboot Tools, algunos pueden pensar que es solo otro instalador ADB Fastboot, pero sin embargo, la función de esta herramienta va  mucho más allá de eso pues de hecho pues  es una utilidad que tiene muchas herramientas  o modulos dentro de un mismo  paquete software
 
En efecto XAF tiene funciones principales de todo lo que pueden hacer las herramientas ADB Fastboot tradicionales, excepto que todas las funciones ahora tienen GUI (interfaz gráfica de usuario) lo cual facilita todos los trabajos para cualquier usuario así que ya no necesitamos memorizar todos los comandos para ejecutar casi cualquier tarea relacionada con sus dispositivos Android Xiaomi.
 
 

Pasos previos: habiltar depuración  e instalar  Java Se Development Kit

 

Para habilitar las opciones de desarrollador en Xiaomi, en todos los modelos y todas las gamas de dispositivos de la popular marca china, tan solo deberemos entrar en Ajustes y dirigirnos a la última opción que nos aparece, una opción que se llama Acerca del Teléfono

Una vez estemos ahí,  tan solo tendremos que clicar las mismas siete veces seguidas aunque sobre la opción que dice Versión de MIUI:

Cómo habilitar las opciones de desarrollador en Xiaomi

Finalmente nos aparecerá el aviso, tal y como os muestro en la captura de aquí abajo, anunciándonos que el tan ansiado menú para desarrolladores se ha habilitado con éxito.

Cómo habilitar las opciones de desarrollador en Xiaomi

Ahora, para acceder a este nuevo menú de desarrolladores desde el que podremos realizar acciones tan interesantes como habilitar la depuración USB, tan solo tendremos que dirigirnos a Ajustes/ Ajustes adicionales  y podremos ver como dentro ahora ya si que nos aparecen estas opciones de desarrollador.

 
Una vez habilitado el modo desarrollador en nuestro terminal Xiaomi ( en caso de no tenerlo )  nos toca instalar la  ultima version de java Se Development kit  adecuado al sistema operativo donde vaya ejecutar la herramienta.
 
 
 
 
 
Nota: es importante tener instalada la ultima version java disponible pues de lo contrario probablemente le dará error al  intentar ejecutar esta herramienta.

 

Ejecución de la jerramienta  XAF

XAF  es la herramienta comentada  que nos ayuda a establecer conexiones ADB y Fastboot y una vez establecido, se podrán seleccionar qué acción desean continuar, así que una vez cumplidos los dos requisitos para ejecutar la herramienta  , descararemos  el jar de  la herramienta XiaomiABFastbootTools    que esta disponible en Github en  https://github.com/Szaki/XiaomiADBFastbootTools

 

Esta a herramienta viene comprimida en un fichero jar , pero si hemos instalado Java Se DEvelopement ,el mismo se encargara de lanzar el entorno simplemente clicando en el fichero jar

Descargado pues  el fichero, conectaremos el terminal con un cable usb a micro-usb a nuestro PC , desbloquearemos el terminal  y haremos clic sobre el fichero XiaomiADBFastbootTools.jar
 
 
En seguida , si hemos seguido los pasos anteriores  deberíamos ver   una ventana con todas las apps  instaladas .
 
 
 
Según  la mayoría de los foros sobre el tema las siguientes aplicaciones deberíamos poder eliminar sin sufrir graves coontratiempos y ahorrando un precioso espacio de memoria :
 
      • Analytics – Analizador de datos
      • App Vault – Bóveda de aplicaciones
      • Backup – Copia de seguridad
      • Browser – Navegador
      • Calculator – Calculadora
      • Calendar – Calendario
      • Cleaner – Limpiador
      • Clock – Reloj
      • Compass – Brújula
      • Downloads – Descargas
      • Facebook – Facebook
      • Feedback – Comentarios
      • FM Radio – Radio
      • Freeform – Pantalla compartida
      • Games – Juegos
      • GBoard – Teclado de Google
      • Google Duo – Videollamadas
      • Google Lens – Lentes de Google
      • Google Play movies – Google Películas
      • Google play music – Google Música
      • Joyose – Servicios de entretenimiento
      • Mail – Correo
      • Mi App store – Tienda de aplicaciones
      • Mi Cloud – Nube
      • Mi Credit – Crédito para tienda Mi
      • Mi Drop – Envío de archivos
      • Mi Pay – Pagos
      • Mi Recycle – Papelera
      • Miui Daemon – Recolector de estadísticas
      • MiWebView – Ejecución de contenido desde la red
      • Mobile Device Information Provider – Proveedor de información de dispositivos móviles
      • MSA – Anuncios
      • News – Noticias
      • Notes – Notas
      • PAI – Instalación de aplicaciones en la primera configuración
      • PartnerBookmarks – Enlaces asociados
      • PartnerNetflixActivation – Activador de Netflix
      • Quick Apps – Lanzador de aplicaciones sin necesidad de instalarlas
      • Quick Ball – Botones de acceso directo
      • SMS Extra – ¿?
      • Translation Service – Servicio de traducción
      • Uniplay Service – Servicio de proyección de juegos
      • VsimCore – Núcleo de sim virtual
      • Xiaomi Service Framework – Sincronizador de servicios de Xiaomi
      • Xiaomi SIM Activate Service – Servicio para activar SIMs
      • Yellow Pages – Identificador de números
      • Youtube – Youtube
Ahora pues  en la pestaña Uninstaller  clicaremos sobre alguna de las apps citadas  que deseamos quitar .
 
 
 
 
OJO:UNA VEZ DESINSTALEMOS   LAS APPS QUE MARQUEMOS, EN LA MAYORIA DE LAS VECES ,   YA NO LAS PODREMOS VOLVER A INSTALAR A MENOS QUE CAMBIAMOS LA ROM 
 
Bien , una vez seleccionadas, si realmente estamos seguros que no las necesitamos  ,  simplemente daremos al botón Unsinstaller
 

 

Bien una vez recibamos la pantalla de  hecho , tan solo necesitaremos reiniciar el terminal  y tendremos nuestro terminal liberado de sw innecesarios
 
 
 
 

Funcionalidades  de XAF

 

 Bien ahora hablemos sobre algunas de sus características clave del sw XAF:

 

Desinstalador: esta característica  que como hemos visto permite a los usuarios eliminar cualquier aplicación integrada. Los teléfonos Xiaomi generalmente vienen con varias aplicaciones predeterminadas que incluyen Mi Store, Mi Calculator, Mi Scanner, Mi Remote, etc.

Esta característica permite a los usuarios desinstalar cualquier aplicación predeterminada. Esas aplicaciones no son bloatware para algunos. Otros pueden considerarlo inútil y, por lo tanto, se convierte en bloatware para ellos.
 

 Camera2:la característica más buscada. Muchos fanáticos de Mi exigen desbloquear el cargador de arranque de su teléfono solo para habilitar la API de Camera2. Esta característica permite a los usuarios habilitar y deshabilitar la API de Camera2, habilitar y deshabilitar EIS (Estabilización electrónica de imagen) y reiniciar en recuperación.

Una vez que se ha habilitado la API Android Camera2, los usuarios pueden instalar cualquier aplicación de cámara con controles manuales, al igual que una DSLR.

 

Explorador de archivos:  esta es la característica más querida. Esto lanza un Explorador de archivos que permite a los usuarios administrar sus archivos almacenados en el almacenamiento del teléfono. Esta característica es muy conveniente porque a veces es crucial copiar y pegar archivos desde y hacia el teléfono.

 Densidad de pantalla: los usuarios ahora pueden ajustar y cambiar el valor de DPI de la pantalla de su teléfono fácilmente. Cuanto mayor sea el DPI, mejor será la pantalla. Cuanto más bajo es, menor es la calidad de la pantalla, pero puede ahorrar batería.

 Propiedades del dispositivo: una vez que se hace clic, el XAF recuperará muchas estadísticas e información sobre su dispositivo.

 Flasher: esta es la última característica de XAF. El software puede flashear casi cualquier cosa que sea flash a través de la conexión ADB-Fastboot. Los usuarios pueden flashear recuperaciones personalizadas, flashear ROM de arranque rápido, etc. Esta función también es capaz de arrancar cualquier imagen.

 Wiper: Bueno, su nombre lo dice todo. Esta característica es necesaria para aquellos que desean borrar los cachés o realizar un restablecimiento de fábrica.

 Desbloqueador / OEM: Esto desbloqueará el cargador de arranque del teléfono en una condición; el teléfono ejecuta Android One (Mi A1 / Mi A2). Esto no funcionará en dispositivos MIUI.

 

MIUI ROM Downloader: esta característica es muy útil. En lugar de navegar solo para descargar la ROM MIUI correcta, esta función busca directamente el enlace a la ROM Fastboot. Los usuarios pueden copiar el enlace o descargar la ROM directamente.

 

Rebooter: reinicia los teléfonos de los usuarios sin esfuerzo sin tocar el botón de encendido.


En la ultima version
 Xiaomi ADB / Fastboot 6.6.1

    •  Se corrigió un error en Windows que rompía el módulo Flasher y se agregó descarga nativa al módulo ROM Downloader (no es necesario el navegador)
    • Complemento Kotlin actualizado a 1.3.50
    • ADB / Fastboot actualizado a 29.0.2
Consulte la página principal para obtener más información sobre las opciones de descarga.



 

Aplicaciones que podemos desinstalar

Ya lo hemos comentado, pero a modo de resumen ,al parecer y según siempre la propia herramienta, todas las aplicaciones que aparecen en la lista se pueden desinstalar sin ningún problema. No obstante, en  un hilo de HTC, uno de los usuarios recomienda desinstalar solo las siguientes  a los que mi querido lector  yo solo he marcado en negrita y cursiva :

        • Analytics
        • App Vault
        • Backup
        • Browser
        • Facebook
        • Games
        • Google Duo
        • Google Play movies
        • Google play music
        • Joyose
        • Mi App store
        • Mi Cloud
        • Mi Credit
        • Mi Drop
        • Mi Pay
        • Mi Recycle
        • Miui Daemon
        • MiWebView
        • MSA
        • Notes
        • PAI
        • PartnerBookmarks
        • Quick Apps
        • Quick Ball
        • SMS Extra
        • Translation Service
        • Uniplay Service
        • VsimCore
        • Yellow Pages
        • Xiaomi Service Framework
        • Xiaomi SIM Activate Service

 

 

Problemas: Atención solo ver  esto cuando ha seguido los pasos anteriores y obtiene el error de can’t find ADB/Fasboot

 
 


Si no le funciona  la herramienta puede  que necesite deshabilitar el uso obligatorio de controladores firmados en Windows, ya que con esto evitaremos problemas de compatibilidad que no permitan instalar correctamente los controladores, lo cual posteriormente pude generar problemas.

En Windows 10 abriremos el menú inicio y daremos clic en la opción Configuración icono de engrane, lo cual abrirá la ventana configuración de Windows en la que daremos clic en la opción Actualización y seguridad que nos abrirá un nuevo menú en el que daremos clic en la opción Recuperación y por último buscaremos del lado derecho el apartado Inicio avanzado y daremos clic en el botón Reiniciar ahora.

Deshabilitar el uso obligatorio de controladores firmados en Windows 8, 8.1 y 10
 

  • Cuando Windows se reinicie tras a ver entrado al modo Inicio avanzado veremos una pantalla azul en la deberemos seleccionar la opción Solucionar problemas.

Deshabilitar el uso obligatorio de controladores firmados en Windows 8, 8.1 y 10

  • En la siguiente pantalla seleccionaremos Opciones avanzadas para posteriormente seleccionar la opción Configuración de inicio.

Deshabilitar el uso obligatorio de controladores firmados en Windows 8, 8.1 y 10

  • Ahora en la nueva pantalla de Configuración de inicio veremos una lista con las opciones que podremos modificar, pero para hacerlo primero tendremos que presionar el botón Reiniciar.

Deshabilitar el uso obligatorio de controladores firmados en Windows 8, 8.1 y 10

  • Por último, una vez que la computadora se haya reiniciado veremos que nuevamente entraremos a la pantalla azul de Configuración de inicio con la lista de opciones que podemos modificar, en nuestro caso deberemos seleccionar la opción 7 Deshabilitar el uso obligatorio de controladores firmados para ello presionaremos la tecla F7 para que la computadora se reinicie de forma normal y así podamos instalar los programas y sus controladores sin ningún problema.

Deshabilitar el uso obligatorio de controladores firmados en Windows 8, 8.1 y 10

Programas
Una vez deshabilitado el uso obligatorio de controladores firmados en Windows debes instalar los programas necesarios que instalan los controladores en windows para la correcta deteccion del telefono.

    • Mi Flash o  en /https://www.xiaomiflash.com/
    • Mi PC Suite
    • Controladores ADB

 

Windows no detecta el teléfono con depuración USB 


Si no puede entrar al modo EDL reiniciando el teléfono por comandos ADB a pesar de a ver activado la depuración USB, muy probablemente se deba a que los controladores no se instalaron correctamente.

Pero antes de empezar asegúrese de que:

    • La depuración USB este activada.
    • La opción Desbloqueo de OEM esta activada.
    • Prueba conectando el cable en un puerto diferente.
    • Utilize otro cable USB.


Si hiciste todos los puntos anteriores y aun así no detecta el teléfono entonces procederemos a verificar si faltan controladores por instalar o si no se instalaron correctamente.

  • Primero abriremos el explorador de archivos teclas Control + Windows y posterior mente daremos clic derecho en Mi equipo o Mi PC y seleccionaremos la opción Administrar si no encuentras la opción simplemente ve al menú inicio o a la barra de tareas y en el buscador escribe Administración de equipos o Administrador de dispositivos.
  • Una vez abierta la herramienta Administración de equipos buscaremos la opción Administrador de dispositivos en la que posteriormente buscaremos la opción Android Phone si aparece la opción como en la imagen entonces todo se instaló de forma correcta.
  • Pero si no aparece la opción Android Phone y aparece Otros dispositivos como en la imagen entonces deberemos instalar los controladores de forma manual.

  • Para ello daremos clic derecho en ADB Interface y en el menú que nos aparece seleccionaremos la opción Actualizar software de controlador lo que abrirá una ventana en la que seleccionaremos la opción Buscar software de controlador en el equipo.
  • Después de seleccionar la opción Buscar software de controlador en el equipo, tendremos que buscar la ruta donde se instalaron los controladores del programa Universal Adb Driver si no cambiaste la ruta de instalación entonces tendría que ser la siguiente: C:\Program Files (x86)\ClockworkMod\Universal Adb Driver

 

 

  • Por último, daremos clic en el botón siguiente para comenzar la instalación cuando termine la instalación volveremos a la opción Administrador de dispositivos para ver que ya aparecerá el teléfono como Android Phone, por lo cual ahora si ya podremos proceder a poner el teléfono en modo EDL para instalar la rom.


Reiniciar controladores

  • En dado caso de que el error no sea la falta de controladores y aparezca correctamente Android Phone y el error sea el de la siguiente imagen entonces tendremos que deshabilitar y habilitar el controlador del puerto para que se reinicie y detecte los controladores recién instalados.
  • Para ello daremos clic derecho sobre los controladores que marque error “triángulo amarillo” y seleccionaremos deshabilitar una vez deshabilitado esperaremos unos segundos y lo habilitaremos de nuevo.
  • Al habilitar nos daremos cuenta que el controlador ya no marca error “triángulo amarillo” ahora solo quedara conectar el teléfono y verificar que lo reconozca como como Android Phone en el Administrador de dispositivos y así podremos proceder a poner el teléfono en modo EDL para instalar la rom
Windows no detecta el teléfono en modo Fastboot 
 

Si no puede entrar al modo EDL reiniciando el teléfono por comandos Fastboot a pesar de a ver entrado al modo Fastboot o no puedes instalar la rom en modo Fastboot “si tienes el bootloader desbloqueado”, muy probablemente se deba a que los controladores no se instalaron correctamente.

Pero antes de empezar asegúrate de que:

  • El modo Fastboot este activado.
  • Prueba conectando el cable en un puerto diferente.
  • Utiliza otro cable USB.

Si hizo todos los puntos anteriores y aun así no detecta el teléfono entonces procederemos a verificar si faltan controladores por instalar o si no se instalaron correctamente.

  • Primero abriremos el explorador de archivos teclas Control + Windows y posterior mente daremos clic derecho en Mi equipo o Mi PC y seleccionaremos la opción Administrar si no encuentras la opción simplemente ve al menú inicio o a la barra de tareas y en el buscador escribe Administración de equipos o Administrador de dispositivos.
  • Una vez abierta la herramienta Administración de equipos buscaremos la opción Administrador de dispositivos en la que posteriormente buscaremos la opción Android Phone si aparece la opción como en la imagen entonces todo se instaló de forma correcta.
  • Pero si en lugar de aparezca la opción Android Phone, aparece Kedacom USB Device como en la imagen entonces deberemos instalar los controladores de forma manual.

Como solucionar problemas con controladores para la correcta detección del teléfono

  • Para ello daremos clic derecho en Android Bootloader Interface y en el menú que nos aparece seleccionaremos la opción Actualizar software de controlador lo que abrirá una ventana en la que seleccionaremos la opción Buscar software de controlador en el equipo.

Como solucionar problemas con controladores para la correcta detección del teléfono

  • Después de seleccionar la opción Buscar software de controlador en el equipo, tendremos que seleccionaremos la opción Elegir en una lista de controladores de dispositivos en el equipo para selecciona el controlador a instalar.
Como solucionar problemas con controladores para la correcta detección del teléfono

  • Por último, en la nueva ventana que aparecerá buscaremos y seleccionaremos el controlador Android Bootloader Interface y daremos clic en el botón siguiente para comenzar la instalación cuando termine la instalación volveremos a la opción Administrador de dispositivos para ver que ya aparecerá el teléfono como Android Phone, por lo cual ahora si ya podremos proceder a poner el teléfono en modo EDL o instalar la rom con Mi Flash por Fastboot si es que se tiene desbloqueado el bootloader.
Como solucionar problemas con controladores para la correcta detección del teléfono
 
 
 Mi Flash no detecta correctamente el teléfono en modo EDL 
 
Si el teléfono no es detectado en Mi Flash a pesar de que ya se encuentra en modo EDL, al igual que en el anterior punto el problema es generado por la falta de controladores que no se instalaron, pero en este caso los controladores faltantes son los de Qualcomm.

Pero antes de empezar asegúrate de que:
  • Asegúrate que el teléfono está en modo EDL “bootloader bloqueado”.
  • Asegúrate que el teléfono está en modo Fastboot “bootloader desbloqueado”.
  • Asegúrate que el teléfono sea reconocido por Windows.
  • Prueba conectando el cable en un puerto diferente.
  • Utiliza otro cable USB.

Si hiciste todos los puntos anteriores y aun así no detecta el teléfono entonces procederemos a verificar si faltan controladores por instalar o si no se instalaron correctamente.
  • Primero abriremos el explorador de archivos teclas Control + Windows y posterior mente daremos clic derecho en Mi equipo o Mi PC y seleccionaremos la opción Administrar si no encuentras la opción simplemente ve al menú inicio o a la barra de tareas y en el buscador escribe Administración de equipos o Administrador de dispositivos.
  • Una vez dentro de la opción Administrador de dispositivos deberemos buscar el apartado Puertos (COM Y LPT1) y dentro Qualcomm HS-USB QDLoader 9008 (COM10) si aparecen entonces quiere decir que todo se instaló correctamente y Mi Flash debería detectar el teléfono como COM10 por lo cual ya podríamos instalar la rom.

Como solucionar problemas con controladores para la correcta detección del teléfono

  • Pero si lo que aparece es QHUSB_BULK como en la imagen entonces deberemos instalar los controladores de forma manual.

Como solucionar problemas con controladores para la correcta detección del teléfono

  • Para ello daremos clic derecho en QHUSB_BULK y en el menú que nos aparece seleccionaremos la opción Actualizar software de controlador lo que abrirá una ventana en la que seleccionaremos la opción Buscar software de controlador en el equipo.

Como solucionar problemas con controladores para la correcta detección del teléfono

  • Después de seleccionar la opción Buscar software de controlador en el equipo, tendremos que buscar la ruta donde se instalaron los controladores del programa MI Flash si no cambiaste la ruta de instalación entonces tendría que ser la siguiente: C:\XiaoMi\XiaoMiFlash\Source\ThirdParty\Qualcomm\Driver

Como solucionar problemas con controladores para la correcta detección del teléfono

Por último, daremos clic en el botón siguiente para comenzar la instalación cuando termine la instalación veremos que al revisar en la opción Administrador de dispositivos el teléfono en modo EDL ya aparecerá como Qualcomm HS-USB QDLoader 9008 (COM10), por lo cual ahora si ya podremos proceder a instalar la rom.

Extracion de documentos en Oracle text

Vamos a ver como desde diferentes lenguajes podemos extraer información almacenada en una BBDD Oracle por medio de CLOB’s


Oracle incorpora un tipo de datos llamado BLOB que permite almacenar documentos de cualquier tipo (imágenes, excel, word, access, comprimidos, vídeos, música, etc). En principio admite cualquier tipo de documento y de cualquier tamaño aunque aún sigue manteniendo el tipo de datos LONG RAW que está obsoleto, sustituido por BLOB. Las instrucciones que os mostramos a continuación admiten ambos tipos de datos: BLOB y LOB RAW.

 

Insertar o extraer documentos  desde Visual Basic

Para poder insertar documentos en un campo BLOB de Oracle con Visual Basic necesitaremos una librería (dll) llamada SAFileMgr Module (SAFileMgr.dll), esta librería está disponible de forma gratuita en la web http://www.softartisans.com. Tras descargar este fichero, deberemos copiarlo a la carpeta del sistema (normalmente C:/Windows/System32) y registrarlo con el comando:  regsvr32 C:/Windows/System32/SAFileMgr.dll .  Tras copiar y registrar el fichero SAFileMgr.dll, también necesitaremos disponer de una base de datos Oracle activa

Tras tener la tabla creada con el campo BLOB, procederemos a abrir Visual Basic y a crear un nuevo proyecto para insertar y extraer documentos en Oracle. En la ventana de “Nuevo proyecto” seleccionaremos “EXE estándar” y pulsaremos “Abrir”:Para que la aplicación funcione correctamente deberemos agregar las referencias necesarias. Para ello pulsaremos en el menú “Proyecto ” – “Referencias” de Visual Basic:Seleccionaremos la referencia FileMgr 1.1:Si no aparece en la lista, pulsaremos en Examinar y seleccionaremos el fichero .dll copiado y registrado anteriormente:C:/Windows/System32/SAFileMgr.dll y seleccionaremos también Microsoft ActiveX Data Objects 2.6 Library: Si no aparece en la lista, pulsaremos en Examinar y seleccionaremos el fichero ubicado en: C:/Archivos de programa/Archivos comunes/system/ado/msado26.tlb

 

Ahora veamos el código de cada uno de los tres  botones de un  formulario tipo para lanzar una consulta de inserción o extracción de un documento :

  • Para el botón “Insertar documento“:

Private Sub btInsertarDocumento_Click()

Dim Conn As New ADODB.Connection

Dim Rs As New ADODB.Recordset

Dim FileMgr As New FileManager

Dim SQL As String

On Error GoTo cError

‘ Conexión mediante OLEDB

Conn.Provider = “OraOLEDB.Oracle”

Conn.Open txtServicio.Text, _

txtUsuario.Text, txtContrasena.Text

‘ Ejecutamos una consulta SQL sobre la tabla  para activar el recordset

SQL = “Select * from ” + txtTabla.Text + ” where 1=2″

Rs.Open SQL, Conn, 2, 3

‘ Añadimos un nuevo registro con los datos indicados

Rs.AddNew

Rs(txtCampoTitulo.Text).Value = txtDocumentoTitulo.Text

Rs(txtCampoRutaDocumento.Text).Value = txtDocumento.Text

‘ Insertamos el documento en el campo BLOB/RAW

FileMgr.ExportToBlob txtDocumento.Text, Rs(txtCampoBLOB.Text)

Rs.Update

Rs.Close

Conn.Close

Set Conn = Nothing

MsgBox “Documento insertado correctamente en ” + “la base de datos: ” + vbCrLf + vbCrLf + txtDocumento.Text, vbOKOnly + vbInformation

cSalir:

Exit Sub

cError:

MsgBox Err.Description

GoTo cSalir

End Sub

  • Para el botón “Ejecutar“:

Private Sub btEjecutar_Click()

Dim Conn As New ADODB.Connection

Dim Rs As New ADODB.Recordset

On Error GoTo cError

‘ Conexión a Oracle mediante OLEDB

Conn.Provider = “OraOLEDB.Oracle”

Conn.Open txtServicio.Text,  txtUsuario.Text, txtContrasena.Text

‘ Ejecutamos consulta SQL introducida por el usuario

Rs.Open txtSQL.Text, Conn, 0, 1

txtExtraerTitulo.Text = Rs(txtCampoTitulo.Text)

txtDestino.Text = Rs(txtCampoRutaDocumento.Text)

Rs.Close

Conn.Close

Set Conn = Nothing

MsgBox “Consulta SQL ejecutada correctamente.”,  vbOKOnly + vbInformation

cSalir:

Exit Sub

cError:

MsgBox Err.Description

GoTo cSalir

End Sub

  • Para el botón “Ejecutar“:

Private Sub btExtraer_Click()

Dim Conn As New ADODB.Connection

Dim Rs As New ADODB.Recordset

Dim FileMgr As New FileManager

Dim continuar As Boolean

On Error GoTo cError

‘ Conexión a Oracle mediante OLEDB

Conn.Provider = “OraOLEDB.Oracle”

Conn.Open txtServicio.Text, _

txtUsuario.Text, txtContrasena.Text

‘ Ejecutamos consulta SQL introducida por el usuario 

Rs.Open txtSQL.Text, Conn, 0, 1

‘ Comprobamos si existe ya un fichero destino

‘ con el mismo nombre

continuar = False

If Dir(txtDestino.Text) <> “” Then

continuar = MsgBox(“Ya existe un documento ” + “con este nombre ¿desea reemplazarlo?”, vbYesNo + vbQuestion) = vbYes

Else

continuar = True

End If

‘ Extraemos el documento del primer   registro de la consulta SQL  en el destino especificado por el usuario

If continuar Then

FileMgr.ImportFromBlob Rs(txtCampoBLOB.Text), txtDestino.Text

MsgBox “Fichero extraído correctamente en: ” + vbCrLf + vbCrLf +  txtDestino.Text, vbOKOnly + vbInformation

End If

Rs.Close

Conn.Close

Set Conn = Nothing

cSalir:

Exit Sub

cError:

MsgBox Err.Description

GoTo cSalir

End Sub

 

Extracción desde java

 

Ahora  veamos  usando el lenguaje   Java un ejemplo de como podemos extraer  documentos almacenados en  CLOB’s   en una base de Datos Oracle Text 9 en Java

Necesitaremos tener instalado el cliente Oracle instalado en la maquina, las credenciales de acceso  ,    asi como referenciar en el proyecto desde el Eclipse las siguientes librerías

 

 

 

Y ahora veamos  un ejemplo de una clase de extracción de campos clob’s

La clase principal es Main , la cual debería seleccionarse al exportar el proyecto desde Eclipse

Se puede ejecutar en local  o crear un pequeño script para invocar el java

En este ejemplo es  obligatorio usar tres argumentos y en este orden  para llamar al programa:

  • nodo= número del nodo a exportar
  • tope = numero de orden donde se quedo la última exportación empezando por cero
  • topefinal= umbral donde termina

 

En el proyecto se han referenciado dos versiones de la MV Java porque puede ocurrir que la MV usada en local ( 1.6 ) sea diferente a la del host  donde se ejecute ( por ejemplo  la 1.4.2_08, razon por la habria que copiar tambien esa version 1.4.2.08  dedseel host  a una ruta local

También se hace referencia al driver de oracle classes12.jar , ruta que también existe en la maquina

 

 

Este proyecto debería exportarse situándose en la raiz del proyecto como un jar sin incluir tanto los ficheros .classspath como el de .project

Antes de compilar debe eliminar manualmente el war existente desde el propio eclipse asi como el log de ejecución (manualmente habría que ubicarse en c:\ users\xxx\workspace\application)

Asimismo por ultimo , al   compilarlo  no debemos incluir el classpath

 

Veamos el código completo;

 

/*
Main.java
*
* Created on 20 de Marzo de 20174, 11:43
*

*/

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import oracle.jdbc.driver.OracleDriver;

/**
* @author CRN
*
* EXTRACTOR DOCUMENTOS
*/

public class Main {

private static int nodo;

private static int tope;

private static int topefinal;

public static void main(final String[] args) {

System.out.println(“Inicializando programa …”);

Connection conn = null;

GestorDeConexiones gc = null;

try{

gc = new GestorDeConexiones(“xxxx”, “yyyyyy”); // credenciales de  acceso a la BBDD con el user y pwd de acceso 

conn = gc.getConnection();

// Comprueba si hay argumentos en la linea de comandos

final int nnodo=1;

if(args.length != 0)
//CON ARGUMENTOS

{
for(int counter = 0; counter < args.length; counter++)
{
System.out.println(“Argument index ” + counter + “: ” + args[counter]);
}

System.out.println(” fin argumentos”);

nodo = Integer.parseInt(args[0]); // primer argumento ( el nodo)

tope = Integer.parseInt(args[1]); //segundo argumento (inicio

topefinal = Integer.parseInt(args[2]); //tercer argumento ( tope)

System.out.println(“Argumento nodo= ” + nodo);
System.out.println(“Argumento conteo incial= ” + tope);
System.out.println(“Argumento numero de documentos= ” + topefinal);

}

else

//SIN ARGUMENTOS

{
System.out.println (“No se ha incluido ningún argumento”);
System.exit(0);
}

System.out.println(“NODO” + nodo);
System.out.println(“Valor inicial= ” + tope);
System.out.println(“Valor final= ” + topefinal);

final String path1 =”d:\”;

final String nfichero= path1+”previa_carga_jd_”+nodo+”tope“+tope+”topefinal_”+ topefinal;

//generacion del fichero de salida

File theDir = new File(nfichero);

if (!theDir.exists())
{
System.out.println(“..creando directorio: ” + theDir.getName()); // SI EL DIRECTORIO NO EXISTE ,. SE CREA
boolean result = false;
try{
theDir.mkdir();

result = true;
}
catch(SecurityException se){   //handle it
}
if(result) {
System.out.println(“Directorio creado”);
}
}

//Intentamos cambiar los permisos al directorio creado
System.out.println(“Cambiamos permisos 777 a “+nfichero);
Process theProcess = null;
try
{
theProcess = Runtime.getRuntime().exec(“chmod 777 “+ nfichero);
}
catch(IOException e)
{
System.out.println(“Error en el método exec()”);
}

//creacion fichero de log

final String log1=path1;

final String nfichero1= log1+”directorio_”+nodo+”tope“+tope+”topefinal_”+ topefinal+”.log”;

System.out.println(“Fichero Log de proceso :[” +nfichero1+”]”);
System.out.println(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”);

//generación del fichero de salida

File fichero = new File(nfichero1);

 

if (!fichero.exists())
{

// SI NO EXISTE , SE CREA
System.out.println(“..creando fichero de log: ” + fichero.getName());
boolean result = false;
try{
fichero.createNewFile();

result = true;
}
catch(SecurityException se){ //handle it
}
if(result) {
System.out.println(“Fichero creado”);
}
}

//abre fichero de log
File TextFile = new File(nfichero1);
FileWriter TextOut = new FileWriter(TextFile, true);
TextOut.write(“********************************************************************\r\n”);
TextOut.write(“INICIANDO PROCESO DE EXTRACCIÓN DE DOCUMENTOS r\n”);
TextOut.write(“Fichero Log de proceso :[” +nfichero1+”]\r\n”);
TextOut.close();

String path=nfichero +”/”;

System.out.println (“RUTA DESTINO FINAL”+ path);

//extraemos los objetos de texto
RecuperadorBD2.RecuperarBD2(conn,path, tope,topefinal,nodo,nfichero1);

}
catch (final SQLException sqle) {
System.out.println
(“Error de acceso a BD:” + sqle.getMessage());
sqle.printStackTrace();
}
catch (final IOException ioe){
System.out.println
(“Error de acceso a disco:” + ioe.getMessage());
ioe.printStackTrace();
}

try{
if (gc != null && conn != null)
gc.closeConnection();
}

catch (final SQLException sqle)
{
System.out.println
(“Error de acceso a BD:” + sqle.getMessage());
sqle.printStackTrace();
conn = null;
gc = null;
}
System.out.println(” **** Fin extraccion ****”);
}
}

class RecuperadorBD2
{
public static void RecuperarBD2 (final Connection cn, final String path , final int topec, final int topex, final int nodo ,final String path1)
throws SQLException, IOException
{

 

String topex1= String.valueOf(topex);

String topec1= String.valueOf(topec);

String nnodo= String.valueOf(nodo);

int contador=0;
FileOutputStream fos = null;

Statement st = null;
ResultSet rs = null;

 

final String sql=” SELECT “+
“FROM(SELECT to_number (rownum) cuenta,”+
” p.
“+
” FROM “+
” ( “+
“SELECT c.nodo_co_nodo, “+
” c.infi_nu_infi, “+
” c.docu_co_documento, “+
” d.docu_no_documento, “+
” d.docu_no_extension ,”+
” d.docu_nu_version, “+
” d.DOCU_FX_MODIFICACION fecha,”+
” e.doct_do_documento doc “+
” FROM tablametadatos c, “+
tablaauxiliar d, “+
tabladocumentos e “+
” WHERE c.nodo_co_nodo = ” + nnodo +
” AND c.docu_co_documento =d.docu_co_documento “+
” AND d.docu_co_documento =e.docu_co_documento “+
” AND e.docu_nu_version =d.docu_nu_version “+
” AND c.docu_nu_version =e.docu_nu_version “+
” ) “+
” where (cuenta >”+topec1 + ” and cuenta <” +topex1 +” )”;

 

//abre fichero de log
File TextFile = new File(path1);
FileWriter TextOut = new FileWriter(TextFile, true);

System.out.println(“”);
System.out.println(“********************************************************************”);
System.out.println(“COMENZANDO PROCESO INICIAL”) ;
System.out.println(“sql general=”+sql);
System.out.println(“”);

TextOut.write(“********************************************************************\r\n”);
TextOut.write(“COMENZANDO PROCESO INICIAL\r\n”);
TextOut.write(“sql general=”+sql+”\r\n”);

try
{

st = cn.createStatement();
rs = st.executeQuery(sql);

while (rs.next())
{
++contador;
//para blobs
final String verdocu= rs.getString(“docu_no_documento”) ;
System.out.println(“Ndocu =” + verdocu );

final String verinfi =rs.getString(“infi_nu_infi”);
System.out.println(“Infi =” + verinfi );

final String verloc = rs.getString(“docu_co_documento”);
System.out.println(“Cdocc =” + verloc );

final String vernombre= verinfi+”“+verloc + ““+ verdocu;

System.out.println(“Nombre =” + vernombre );

System.out.println(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”);
System.out.println(“Numero fichero a extraer =” + contador );

TextOut.write(“Numero fichero a extraer =” + contador+”\r\n”);

final String nfichero =vernombre; //LE PASAMOS COMO ARGUMENTO EL NOMBRE YA MONTADO:INFI_DOCU+LOC

System.out.println(” Fichero a extraer: ” +nfichero);
TextOut.write(“Fichero a extraer =” + nfichero+”\r\n”);

final String pathname= path + nfichero ;
System.out.println(” Extrayendo fichero multimedia : “+pathname);
TextOut.write(“Extrayendo fichero multimedia =” + pathname +”\r\n”);

//deberíamos comprobar si existe ese fichero
final File file = new File(pathname);

fos = new FileOutputStream(file);
final Blob bin = rs.getBlob(“doc”);
System.out.println(“…Extrayendo BLOB”);
TextOut.write(“Extrayendo BLOB \r\n”);

final InputStream inStream = bin.getBinaryStream();
final int size = (int)bin.length();
System.out.println(“Tamaño: “+size);
TextOut.write(“Tamaño =” + size+”\r\n”);

final byte[] buffer = new byte[size];
int length = -1;

while ((length = inStream.read(buffer)) != -1)
{
fos.write(buffer, 0, length);
}

if (fos != null)

{

//Intentamos cambiar los permisos al directorio creado
TextOut.write(“Fichero extraido ok \r\n”);

permisos777(pathname);
fos.close();
System.out.println(” Fichero extraido ok.”);
System.out.println(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”);
TextOut.write(“+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n”);

}
}
}
catch (final IOException ioe)
{
throw new IOException(ioe.getMessage());

}
finally
{
if (fos !=null)
{
fos.close();
TextOut.write(“FIN DEL PROCESO \r\n”);
TextOut.close();

}
if (rs !=null)
{
rs.close();

TextOut.close();
}
rs=null;
st=null;

 

 

System.out.println(“Fin RecuperaBD2”);

System.out.println(“FIN PROCESO”) ;

TextOut.close();

}
}

 

//funcion para añadir permisos 777 a los ficheros extraidos 
public static void permisos777 (final String pathname)
{

Process theProcess = null;

//intentamos cambiar los permisos del fichero recién creeado
System.out.println(“Cambiamos permisos 777 a “+pathname);
try
{
theProcess = Runtime.getRuntime().exec(“chmod 777 “+ pathname);
}
catch(IOException e)
{
System.out.println(“Error en el método exec()”);
}
//fin de cambio de permisos

}

}

//clase para gestionar las conexiones con la BBDD

class GestorDeConexiones
{
private final String user;
private final String password;
private Connection conn = null;
private boolean conectado = false;

public GestorDeConexiones(final String usr, final String pwd){
user = usr;
password = pwd;
}

public void closeConnection() throws SQLException{
if (conectado)
conn.close();
}

private void conectar() throws SQLException {

String url;
DriverManager.registerDriver(new OracleDriver());

url = “jdbc:oracle:thin:@x.x.x.x:yyy:cadena”; ///ojo PROD

 

conn = DriverManager.getConnection(url,user, password);
System.out.println(“Conexion correcta”);
conectado = true;

}

public Connection getConnection() throws SQLException
{
if (!conectado)
conectar();
return conn;
}
}

 

 

 

 

¿Cómo se puede probar la conectividad de Oracle?

Veremos lo sencillo que es probar una conexión contra una BBDD Oracle


Conectarse a una base de datos de Oracle mediante ODBC requiere dos cosas:

  • Un Nombre de servicio Oracle (conocido como un Alias en las versiones anteriores de Oracle 8.0) el cual define la ubicación (nombre del servidor y puerto) y la base de datos (instancia) para la conexión.
  • Un Origen de datos ODBC define simplemente el nombre del servicio debe utilizarse para la conexión ODBC.

Cada uno de estos elementos debe configurarse correctamente para que una conexión funcione  asi que cuando se producen problemas de conexión, es mejor probar cada parte de la conexión para determinar dónde reside el problema.

La utilidad TNSPING determina si se puede llegar con éxito al oyente de un servicio en una red de Oracle Net. Si puede conectarse con éxito de un cliente a un servidor (o de un servidor a otro servidor) utilizando la utilidad TNSPING, entonces muestra una estimación del tiempo de viaje de ida y vuelta (en milisegundos) que se necesita para alcanzar el servicio Oracle Net.

Si falla, entonces muestra un mensaje que describe el error que ocurrió. Esto le permite ver el error de red que está ocurriendo sin la sobrecarga de una conexión de base de datos.

Use el siguiente comando para probar la conectividad:

 tnsping net_service_name count

En el comando anterior, se utilizan los siguientes argumentos:

  • net_service_name debe existir en el archivo tnsnames.ora o en el servicio de nombres en uso, como NIS.
  • count determina cuántas veces el programa intenta alcanzar el servidor. Este argumento es opcional.

Si el nombre de servicio de red especificado es un nombre de base de datos, TNSPING intentará comunicarse con el oyente correspondiente.En realidad no determina si la base de datos se está ejecutando. Utilice SQL * Plus para intentar una conexión a la base de datos.

 

Probar el nombre del servicio Oracle

La utilidad TNSPING puede utilizarse para probar un nombre de servicio de Oracle. Uso:

1. Abra un símbolo del sistema (haga clic en Inicio, haga clic en Ejecutar, escriba cmd y, a continuación, haga clic en Aceptar).

2. Escriba tnsping < nombre servicio > (para Oracle 7.3 o Oracle 8i y versiones posteriores) o tnsping80 < nombre servicio > (para Oracle 8.0), y, a continuación, presione ENTRAR.

La utilidad de Ping TNS producirá un “Aceptar” o un mensaje de “Error de conexión”. En el caso de un “Error al conectar” del mensaje, una causa o motivo se incluirá (por ejemplo, “12545 de TNS: conexión fallado porque el objeto o el host de destino no existe”). Si falla el comando Ping TNS, hay un problema con el nombre del servicio Oracle. La configuración para el nombre del servicio debe comprobarse mediante el Ayudante Net de Oracle o el Asistente para configuración de red. DBA Oracle que necesite proporcionar la información de conexión correcta.

 

Probar el origen de datos ODBC

La utilidad de prueba ODBC de Oracle puede utilizarse para probar un origen de datos ODBC. Uso:

  1. Haga clic en Inicio, seleccione programas y, a continuación, seleccione la carpeta de programa de Oracle (el nombre de esta carpeta puede variar).
  2. En versiones anteriores de Oracle, el programa de prueba ODBC de Oracle puede mostrarse en la carpeta de programa de Oracle. Si es así, haga clic en él. Si no es así, seleccione la carpeta de Administración de la red y, a continuación, haga clic en Prueba ODBC de Oracle. Aparecerá una ventana de prueba ODBC de Oracle de 32 bits .
  3. Haga clic en el botón Conectar . Aparecerá el cuadro de diálogo Seleccionar origen de datos.
  4. Haga clic en la ficha Machine Data Source y, a continuación, seleccione el origen de datos que desea probar y haga clic en Aceptar.
  5. En el cuadro de inicio de sesión, escriba el Nombre de usuario y la contraseña en los cuadros apropiados y, a continuación, haga clic en Aceptar.

  6. Tras pulsar en Aceptar, el botón Conectar está disponible y se deben habilitar los botones Desconectar, Todas las tablas, Las tablas de usuarioy Execute . De lo contrario, se producirá un error.
  7. Si el Ping TNS tuvo éxito, pero se produce un error en la prueba de ODBC, hay un problema con el origen de datos ODBC o con el inicio de sesión y la contraseña proporcionados para realizar la conexión. Compruebe que ambos son correctos y vuelva a intentarlo.

¿Que se puede hacer para mejorar el rendimiento de las consultas en Oracle 11?

Para mejorar las consultas en oracle nos ayudamos de los indices, los cuales serán mas útil cuanto mas rápido podamos encontrar un registro en él respecto buscarlo en la tabla padre; de aquí se deduce fácilmente que todos los índices que podemos crear no son igual de efectivos, además de que conforme evolucionan los datos dentro de la tabla y por tanto dentro de sus índices, dicha efectividad puede cambiar con el tiempo. Por otro lado, hay ocasiones en los que sale a cuenta mirar directamente la tabla en lugar de pasar antes por el índice.


Tradicionalmente para mejorar el rendimiento de las consultas en SQL contra una BBDD Oracle , una vez optimizada la consulta con técnicas  de Tuneling ( por ejemplo usando Hints si procede) ,   siempre pasamos a dos técnicas clásicas :

  • Reconstruyendo los  índices existente en base de datos ,para lo cual previamente comprobaremos si esos índices deberían de ser reconstruidos  
  • Actualizando estadísticas sobre las tablas que realizamos las consultas.

Veamos mas despacio de que estamos hablando: 

 

Reconstrucción de indices

El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla por lo que se suelen usar sobre aquellos campos sobre los cuales se vayan a realizar búsquedas frecuentes dado que su  funcionamiento es similar al índice de un libro: guardando duplas de elemento que se desea indexar junyo a su posición en la base de datos, de modo que para buscar un elemento que esté indexado, sólo necesitamos que buscar en el índice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice.

Los índices pueden ser creados usando una o más columnas, preparando la base de datos tanto para búsquedas rápidas al azar como para ordenaciones eficientes de los registros.

Los índices son construidos sobre árboles B, B+, B* o sobre una mezcla de ellos, funciones de cálculo u otros métodos.

El espacio en disco requerido para almacenar el índice es típicamente menor que el espacio de almacenamiento de la tabla (puesto que los índices generalmente contienen solamente los campos clave de acuerdo con los que la tabla será ordenada, y excluyen el resto de los detalles de la tabla), lo que da la posibilidad de almacenar en memoria los índices de tablas que no cabrían en ella. En una base de datos relacional un índice es una copia de parte de una tabla.

La siguiente consulta SQL mostrará el tamaño en megabytes de un índice determinado, en nuestro caso del índice PK_FACTURACION_CODIGO perteneciente a la tabla FACTURACION y el campo CODIGO del ejemplo. La consulta SQL para mostrar el tamaño ocupado por un índice es la siguiente:

select segment_name, sum(bytes)/1024/1024 MB
from dba_extents
where segment_name = ‘INDICE DE EJEMPLO’
group by segment_name

 

 

Es importante periódicamente examinar y determinar qué índices son susceptibles de ser reconstruidos. Cuando un índice está descompensado puede ser porque algunas partes de éste han sido accedidas con mayor frecuencia que otras dando como resultado problemas de contención de disco o cuellos de botella en el sistema.

Normalmente reconstruimos un índice con el comando ALTER INDEX  (esta sentencia se utiliza para cambiar o reconstruir un índice existente en la base de datos).

Para poder ejecutar este comando el índice debe de estar en el propio esquema donde intentes ejecutarlo o deberías de tener el privilegio alter any index. También tenemos que tener en cuenta que para realizar la reconstrucción de un índice deberíamos de tener cuota suficiente sobre el tablespace que lo lanzamos.

Para reconstruir un índice bastaría con lazar la siguiente sentencia

ALTER INDEX <index_name> REBUILD;

Para reconstruir una partición de un índice podríamos hacer lo siguiente

ALTER INDEX <index_name> REBUILD PARTITION <nb_partition> NOLOGGING;

Nota: En algunos casos cuando alguno de los índices tiene algún tipo de corrupción no es posible reconstruirlo. La solución en este caso es borrar el índice y recrearlo

 

 

 

Actualización de estadísticas

Cuando una base de datos Oracle recibe una sentencia “SQL” para resolver una consulta, se llevan a cabo diversas acciones para lograr la entrega del resultado.

Dentro de los diversos pasos uno de los más importantes es el llevado a cabo por el optimizador basado en costos “Cost Based Optimizer o CBO”. Para que el “CBO” pueda determinar de forma exacta el plan de ejecución de para un “SQL Query” debe disponer de la información de las estadísticas de las tablas e índices que participan en el “SQL Query”, esta información comúnmente es conocida como “Optimizer statistics” “Estadisticas del optimizador”, la misma describe como esta compuesto y distribuido internamente el objeto.

Estas estadísticas son utilizadas por el optimizador para elegir el mejor plan de ejecución para cada instrucción SQL.

El tiempo necesario para colectar las estadísticas en algunos casos puede ser de gran medida. En el manejador se pueden utilizar diversos métodos para tratar de reducir el tiempo de esta tarea en la mayor proporción posible.

 

Es importante tener por tanto actualizadas las estadísticas de la base de datos. Para saber si las estadísticas se están lanzando correctamente podemos hacer una consulta sobre la tabla ALL_INDEXES en oracle 11  (en Oracle 10  es  dba_indexes )y ver el campo last_analyzed para observar cuando se ejecutaron sobre ese índice las estadísticas.

Nota: la columna “LAST_ANALYZED” la cual puede ser encontrada en vistas tales como: “DBA_TABLES”, “DBA_INDEXES”, “DBA_TAB_COL_STATISTICS” indica la fecha en que fue calculada la estadística para dicho objeto por ultima vez.

 

Como ejemplo  , si queremos  saber cuando fue la ultima vez que se ejecutaron estadísticas sobre todas las tablas perteneciente a un determinado esquema de BBDD  lanzaremos la siguiente consulta:

SELECT LAST_ANALYZED,table_name FROM ALL_INDEXES ;

 

 

Como vemos con las fechas podemos  hacernos una idea , de lo actualizado que están las estadisticas   sobre cada tabla   

Para actualizar las estadísticas de forma global para  un  esquema de BBDD,  podemos utilizar  el paquete DBM_STATS  de la la siguiente forma:

Execute DBMS_STATS.gather_schema_stats(‘Esquema’);

 

Una vez actualizadas las estadísticas de los índices de la base de datos lanzamos la siguiente consulta:

SELECT LAST_ANALYZED,table_name FROM ALL_INDEXES ;
SELECT index_name, blevel,
DECODE(blevel,0,'OK BLEVEL',1,'OK BLEVEL',2,
'OK BLEVEL',3,'OK BLEVEL',4,'OK BLEVEL','BLEVEL HIGH') OK
FROM dba_indexes where table_owner='DBPROD08';

 

Con esta sentencia obtendremos el nombre nombre del índice, el blevel y si es correcto este indice.

Los índices que deberíamos de reconstruir son los que en la columna ok aparecen como BLEVEL HIGH.

Blevel (branch level) es parte del formato del B-tree del índice e indica el número de veces que ORACLE ha tenido que reducir la búsqueda en ese índice. Si este valor está por encima de 4 el índice debería de ser reconstruido.

.

Diferencias entre DBA_FREE_SPACE y DBA_TABLESPACE_USAGE_METRICS

Veremos con un ejemplo que para obtener el volumen de los Tablespaces en Oracle obtendremos resultados diferentes segun usemos las vistas DBA_FREE_SPACE o DBA_TABLESPACE_USAGE_METRICS


Resultado de imagen de tablespaces

 

 

He estado durante  muchísimo  tiempo  realizando consultas nivel de ocupación de los tablespaces en Oracle 9  que utilizan las vistas del sistema DBA_FREE_SPACE y DBA_DATA_FILES   , lo cual esta muy bien,  pero recientemente he sabido que  hay personas que  en  Oracle 11  están usando  otra vista del sistema para conocer  el  nivel de ocupación de los tablespaces   que es muy rápida: DBA_TABLESPACE_USAGE_METRICS .

Esta  vista contiene información sobre espacios de tablas permanentes, temporales y de deshacer, y tiene solo cuatro columnas:

  • TABLESPACE_NAME TABLESPACE_NAME
  • USED_SPACE ESPACIO USADO
  • TABLESPACE_SIZE TABLESPACE_SIZE
  • USED_PERCENT USED_PERCENT

Hay tres cosas importantes acerca de esas columnas:

  1. Los números de USED_SPACE y TABLESPACE_SIZE están en bloques , no en bytes, por lo que necesitamos unir   esta vista a la vista del sistema DBA_TABLESPACES para terminar con números en bytes. ( ellos la ofrecen  tal cual sin hacer la  conversión a  bytes , de modo que  lo que nos están dando son el nº de bloques y no el de bytes)
  2. La columna TABLESPACE_SIZE muestra el tamaño total posible , no el tamaño actual  
  3. USED_PERCENT muestra el uso del tamaño total posible de un espacio de tabla.

Es decir ,    la información de esta vista no es la que muestra el tamaño real , sino el posible  tamaño   máximo lo cual  explica  la gran diferencia   que nos encontraremos  entre  cálculos realizados sobre la vista  DBA_FREE_SPACE   o sobre la  vista  DBA_TABLESPACE_USAGE_METRICS

Algo muy importante es que la vista  DBA_TABLESPACE_USAGE_METRICS nos ofrece la volumetría en bloques lo cual no es muy útil , por lo que para traducirlo a bytes  tendremos que saber  el tamaño del bloque . Con esta consulta podemos ver el tamaño del bloque:

show parameter block_size

Ahora , lo mejor es hacer la conversión  usando el valor de Block_size de modo que obtengamos  en la  consulta el  tamaño de los Tablespaces  en MB y no en bloques

select * from(
SELECT
a.tablespace_name,
ROUND((a.used_space * b.block_size) / 1048576, 2) AS “Used space (MB)”,
ROUND((a.tablespace_size * b.block_size) / 1048576, 2) AS “Tablespace size (MB)”,
ROUND(a.used_percent, 2) AS “Used %”
FROM dba_tablespace_usage_metrics a
JOIN dba_tablespaces b ON a.tablespace_name = b.tablespace_name) where TABLESPACE_NAME LIKE ‘%EJEMPLO_TB%’

 

También podemos usar el método “antiguo ” basado en las vista   DBA_FREE_SPACE  uniéndolas con las vistas DBA_DATA_FILES  y s.DBA_TABLESPACES  tanto en oracle 9, 10 y 11:, 

select ‘EJEMPLO2_TB’, usados, total ,100*usados/total used_percent,libre from

(select sum(total)total , sum(usados) usados, sum(libre) libre

from (
Select t.tablespace_name Tablespace, t.status Estado,
ROUND(MAX(d.bytes)/1024/1024,2) Total,
ROUND((MAX(d.bytes)/1024/1024) –
(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024),2) Usados,
ROUND(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024,2) Libre,
t.pct_increase “% incremento”,
SUBSTR(d.file_name,1,80) “Fichero de datos”
FROM  sys.DBA_FREE_SPACE f, sys.DBA_DATA_FILES d, sys.DBA_TABLESPACES t
WHERE

t.tablespace_name = d.tablespace_name AND
f.tablespace_name(+) = d.tablespace_name
AND f.file_id(+) = d.file_id

GROUP BY t.tablespace_name,
d.file_name, t.pct_increase, t.status ORDER BY 1,3 DESC )

where Tablespace=’EJEMPLO2_TB’)

 

 

El resultado de ambos consultas sobre la  vista    DBA_TABLESPACE_USAGE_METRICS  o sobre la  vista  DBA_FREE_SPACE  con datos de ejemplo   las podemos ver reflejados en la siguiente tabla:

TABLESPACE_NAME Used space (MB) Tablespace size (MB) Usado % Esta consulta usa dba_tablespace_usage_metrics
dba_tablespaces
EJEMPLO1_ 454310 572776,94 79,3
  234853 295259,47 79,5
EJEMPLO2 454246 459200,94 98,9 Esta consulta  solo usa dba_fee_space
  234853,3 241833,53 97,1

Es decir,   en los cálculos anteriores    teniendo en cuanta  que la vista  dba_tablespace_usage_metric solo muestra el tamaño total posible ,  como vemos como   la información anterior , solo nos están dando  la volumetría  máxima   posible  y no la real dba_tablespace_usage_metrics

Como  puede  apreciar querido lector en este ejemplo las diferencias son  notables  entre los resultados arrojados por  ambas consultas   :para el caso del primer da una ocupación del 79’3% para el  TB de datos  y 79,5 % de ocupación  para los  TB de los indices  usando la vista dba_tablespace_usage_metric, lo cual da resultados esperanzadores ( aun quedaría  mas del 20% por ocupar) mientras en el segundo caso la query  da una ocupación del 98’9 para el  TB de datos  y 97,1 % de ocupación  para los  TB de los indices  usando la vista dba_fee_space, lo cual son resultados  reales   bastantes alejados de los resultados obtenidos en la primer vista

 

 

 

Espero que encuentre útil la consulta. Aquí está el enlace de la documentación de Oracle sobre la vista:  Oracle Documentation – DBA_TABLESPACE_USAGE_METRICS

 

Como crear un tunel ssh para acceder a una BBDD Oracle

veremos la creacion de un tunel VPN para conectarnos a una BBDD Oracle usando el SQL Devleoper


En una presentación de krisrice y thatjeffsmith en KScope15, Jeff señaló algunas nuevas características, incluyendo una para crear túneles SSH usando el programa gratuito que ofrece Oracle para manejar cualquier BBDD ORacle :  el   SQL Developer.

SQL Developer es un entorno de desarrollo de uso general (y gratuito) para la base de datos Oracle. Esta característica parece que debería funcionar independientemente de si realmente desea conectarse a una base de datos Oracle

Sí, puede crear túneles SSH de la forma tradicional utilizando su cliente de línea de comandos SSH favorito   tambien deberia poderse hacer de un ambiente mas potente   como es el entorno de SQL Developer. Este post no es un pros / contras, es sólo una introducción a la función.

Si usted necesita a veces crear túneles de SSH  para lanzar  SQL entonces usted puede encontrar esto interesante.

En esta  introducción se hacen los siguientes supuestos::

  • Tiene un servidor remoto que tiene SSH en ejecución y admite la autenticación basada en claves.
  • Ya tiene sus claves públicas y privadas SSH generadas y correctamente instaladas en el servidor remoto.
  • Debe enviar las solicitudes a cualquier servicio que se ejecute en un puerto del servidor remoto que pueda estar bloqueado por un servidor de seguridad o, de lo contrario, sólo es accesible una vez que haya iniciado sesión en ese servidor remoto. Para este último punto,  se supone que se cuenta con una instancia de una base de datos Oracle que se ejecuta detrás de un firewall en un servidor remoto y el único puerto accesible a los hosts externos es el puerto TCP 22 (predeterminado para SSH). Usando un túnel SSH con reenvío de puertos, puede obtener SQL Developer para arriba y corriendo en su PCl para que pueda conectarse a su instancia de base de datos remota de Oracle. 

Aquí está el  modo  de hacerlo:

  • En primer lugar, si no lo tiene todavía tendrá que descargar SQL Developer versión 4.1 o posterior (en la versión 4.0  esta característica aún no estaba disponible)

 

  • A continuación, abra SQL Developer y elija View > SSH que abrirá el panel de conexiones SSH.
  • En el panel SSH, haga clic con el botón derecho en Hosts SSH y seleccione Nuevo host SSH …
  • Rellene el cuadro de diálogo con sus datos de conexión según sea necesario y pulse OK. Nota: si especifica el puerto incorrecto (como lo hice) en el servidor remoto o desea especificar el puerto TCP para enlazar sus conexiones locales, puede editar las conexiones posteriormente.

 

 

 

  • En este ejemplo,se  esta utilizando claves SSH para conectarse al servidor remoto. Esta es la práctica recomendada y también eliminará el paso de tener que ingresar una contraseña en el futuro. Nota: La clave que especifique en este cuadro de diálogo debe ser su clave privada y su clave pública ya debe estar configurada en el servidor remoto con los permisos correctos para que esto funcione correctamente.
  • El primer puerto especificado es el puerto del servicio (Oracle DB) que se ejecuta en el servidor remoto y el segundo (puerto local) puede ser cualquier puerto disponible en su máquina que desee utilizar. Este túnel enviará el tráfico de su máquina en el puerto local al servidor remoto. En este caso, probablemente recomendaría usar el mismo puerto que el servidor remoto a menos que tenga varios túneles ejecutándose a servidores remotos al mismo tiempo.

 

  • En el panel SSH debe aparecer su nueva conexión. Haga clic con el botón derecho en la conexión y elija Connect .
  • En este punto, si su conexión tiene éxito usted no necesariamente recibe ninguna retroalimentación positiva. Puede comprobar si está conectado al pasar el ratón sobre el túnel SSH con su ratón o haciendo clic con el botón Disconnect en él de nuevo para ver si se le pide que Disconnect .
  • Por último, debe tener un túnel SSH que se ejecute en su máquina local que puede utilizar para acceder a su base de datos remota de Oracle mediante la conexión a localhost:<local port> que reenvía su solicitud de conexión y todos los otros SQL Developer TCP tráfico Al servidor remoto en el puerto TCP que ha especificado. Excepto para el nombre de host y el número de puerto TCP, debe especificar todos los demás detalles de conexión como de costumbre.

 

 

Desde  luego era  una característica muy demandada por la comunidad de usuarios de BBDD Oracle que necesitan conectarse  en un ambiente de host .  Espero que haya encontrado esta visión general de la creación de túneles SSH en Oracle SQL Developer  útil y que le ayude en el camino.