Mastering Firebird

MASTERING FIREBIRD CON VISUAL FOXPRO Preguntas, Respuestas y muchos Ejemplos ELIGIENDO LA ARQUITECTURA DE FIREBIRD QUE

Views 1,003 Downloads 143 File size 410KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

MASTERING FIREBIRD CON VISUAL FOXPRO Preguntas, Respuestas y muchos Ejemplos

ELIGIENDO LA ARQUITECTURA DE FIREBIRD QUE SE INSTALARÁ Si la computadora donde se instalará el Servidor tiene varios procesadores (multi-core) entonces debe elegirse Classic o SuperClassic, no SuperServer. Sin embargo, según pruebas intensivas realizadas, el SuperServer: 1. Si se tendrán menos de 20 usuarios concurrentes, SuperServer es la mejor opción, aunque tiene el problema del “congelamiento” (las transacciones pequeñas se quedan esperando hasta que terminen las transacciones grandes) 2. Está limitado al uso de una sola CPU/núcleo El Classic: 1. No es la mejor opción si hay pocos usuarios (menos de 20) 2. Es la recomendable si hay más de 20 usuarios El SuperClassic: 1. Con pocos usuarios es menos eficiente que el SuperServer 2. Con muchos usuarios es menos eficiente que el Classic 3. Por lo tanto, su uso no es recomendable INSTALANDO EL SERVIDOR EN LINUX ¿Cuál es la distribución recomendada? La que tú prefieras ¿Debo elegir una versión Server, Desktop o cualquiera de ellas? Server (servidor) es mucho más recomendable ya que las versiones Desktop (escritorio) aunque también funcionan bien, no están optimizadas para ser usadas como servidores. Las versiones de escritorio son las que normalmente utilizan los usuarios, es la que tienen instalada para usar planillas de cálculo, procesadores de texto, navegar en Internet, etc. En cambio las versiones Server se utilizan para tener en ellos bases de datos. ¿POR QUÉ INSTALAR FIREBIRD EN LINUX?  Seguridad  Velocidad: las particiones Linux formateadas con ext3 (averiguar más sobre esto) son mucho más rápidas que las particiones Windows formateadas con NTFS

INSTALANDO FIREBIRD EN WINDOWS VISTA Y WINDOWS SEVEN Cuando se lo instala en alguno de estos SO la opción “¿Instalar el Applet del Panel de Control?” no debe estar seleccionada porque crea conflictos. En el caso que eso haya ocurrido entonces lo mejor es desinstalar el Firebird y volver a instalarlo aunque ahora sin instalar el applet. Para desinstalar el Firebird se puede ejecutar el programa: C:\Archivos de Programa\Firebird\Firebird_2_5\unins000.exe Asegúrate también que cuando lo instales tengas derechos de Administrador o el Servidor no se iniciará cuando la instalación sea completada.

COMO INSTALAR FIREBIRD SILENCIOSAMENTE Para instalarlo sin intervención manual, hay que hacerlo con alguna de estas opciones: 1. /SILENT Muestra solamente la barra de progreso y el prompt 2. /VERYSILENT No muestra la barra de progreso 3. /SPNo muestra el prompt INSTALACIÓN DEL FIREBIRD Cuando instalo el Firebird me pregunta si deseo instalar las “herramientas administrativas” ¿Cuáles son esas herramientas, para qué sirven y dónde se encuentran? Esas son las herramientas que se usan en la línea de comandos (ISQL.EXE, GBAK.EXE, GFIX.EXE, etc.) Se encuentran en la subcarpeta \BIN de donde se instaló el Firebird, por ejemplo podrían encontrarse en: C:\Archivos de Programa\Firebird\Firebird_2_5\bin Cada una de esas herramientas cumple con una tarea específica (ejecutar comandos SQL, crear y restaurar backups, corregir errores en las Bases de Datos, etc.) INSTALANDO FIREBIRD EN WINDOWS VISTA Y WINDOWS SEVEN Cuando se lo instala en alguno de estos SO la opción “¿Instalar el Applet del Panel de Control?” no debe estar seleccionada porque crea conflictos. En el caso que eso haya ocurrido entonces lo mejor es desinstalar el Firebird y volver a instalarlo aunque ahora sin instalar el applet. Para desinstalar el Firebird se puede ejecutar el programa: C:\Archivos de Programa\Firebird\Firebird_2_5\unins000.exe COMO LIBERAR EL PUERTO 3050 EN EL FIREWALL DE WINDOWS 7 La respuesta en el siguiente enlace: http://www.digisat.com.br/ftp/manuais/Manual_Porta_3050_Windows7.pdf

FIREBIRD INTEGRADO (EMBEDDED) ¿Por qué necesito renombrar el archivo fbembed.dll cuándo deseo usar el Firebird integrado? Porque el Firebird espera encontrar un archivo que se llame fbclient.dll, por eso debes renombrarlo. En versiones antiguas esperaba el nombre gds32.dll pero ese ya no se usa, el que se usa actualmente es fbclient.dll CLAVE PRIMARIA La Clave Primaria debe ser independiente de los datos, no debe tener significado como dato, debe servir solamente como Clave Primaria y nada más. Debe ser creada usando un generador. Si es necesario que el usuario digite un código entonces la tabla tendrá dos columnas: IDENTIFICADOR y CÓDIGO. El Código puede ser introducido manualmente por el usuario o calculado como UltimoCódigo + 1. PROCEDIMIENTOS ALMACENADOS Se pueden hallar los nombres y otros datos de todos los parámetros de los procedimientos almacenados con la siguiente sentencia: SELECT * FROM RDB$PROCEDURE_PARAMETERS ORDER BY RDB$PARAMETER_NUMBER; Se pueden buscar los valores por defecto que tienen los parámetros usando las columnas RDB$DEFAULT_VALUE y RDB$DEFAULT_SOURCE CONFIGURANDO EL FIREBIRD Para acelerar la conexión entre las computadoras Clientes y el Servidor se debe crear y configurar un archivo llamado HOSTS en las computadoras Clientes. Este archivo debe encontrarse en la carpeta WINNT (en Windows) o en /etc (en Linux). La estructura es Número_de_IP Nombre_del_Servidor, como en el ejemplo: 192.168.1. MiServidor COMO CONVERTIR UNA BASE DE DATOS DE UN CHARSET A OTRO 1. Extraer un script con los metadatos 2. Editar el script con el Block de Notas 3. Reemplazar todas las referencias al Charset antiguo por el Charset nuevo 4. Con ese script crear una nueva Base de Datos (ahora con el Charset nuevo) 5. Usar el IBDataPump para migrar los datos de la Base de Datos antigua a la nueva 6. Verificar que se especifiquen los charsets correctos para ambas Bases de Datos COMO DESACTIVAR LOS ÍNDICES DE LAS PRIMARY KEYS (PK) 1. Para desactivar el índice: UPDATE RDB$INDICES SET RDB$INDEX_INACTIVE = 3

WHERE RDB$INDEX_NAE = 'Nombre del índice' 2. Para reactivar el índice: UPDATE RDB$INDICES SET RDB$INDEX_INACTIVE = 0 WHERE RDB$INDEX_NAME = 'Nombre del índice' COMO MAXIMIZAR LA DISPONIBILIDAD DEL SERVIDOR 1. Tener un hardware de calidad (nada de productos chinos baratos) 2. Dimensionarlo de acuerdo a la carga que se pretende tener (número de terminales con acceso simultáneo, cantidad de información, etc.) a. Los mejores discos duros son los que tienen una alta tasa de transferencia de datos b. Comprar los que tengan tecnología de prevención de errores (SMART, p.e.) c. Cuanto mayor sean las RPM del motor, mejor d. Un RAID 10 es una muy buena opción 3. Para monitorear la Base de Datos usar el programa FBDataGuard COMO OBTENER INFORMACIÓN DE LAS TABLAS DE UNA BASE DE DATOS select rdb$relation_fields.rdb$relation_name table_name, rdb$relation_fields.rdb$field_name field_name, case when rdb$types.rdb$type_name = 'VARYING' then 'VARCHAR' else rdb$types.rdb$type_name end field_type, rdb$fields.rdb$field_length field_size from rdb$relation_fields join rdb$fields on rdb$fields.rdb$field_name = rdb$relation_fields.rdb$field_source join rdb$types on rdb$fields.rdb$field_type = rdb$types.rdb$type and rdb$types.rdb$field_name = 'RDB$FIELD_TYPE' where substring(rdb$relation_fields.rdb$relation_name from 1 for 4) 'RDB$' order by rdb$relation_fields.rdb$relation_name COMO OBTENER LA FECHA Y LA HORA DEL SERVIDOR SELECT CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME FROM RDB$DATABASE COMO OBTENER LA INFORMACIÓN DE UNA TABLA USANDO SELECT SELECT DISTINCT A.RDB$FIELD_POSITION AS ORDER_ID, A.RDB$FIELD_NAME AS F_NAME, B.RDB$FIELD_TYPE,

B.RDB$FIELD_SCALE, CASE WHEN B.RDB$FIELD_PRECISION > 0 THEN 'NUMERIC('||CAST(B.RDB$FIELD_PRECISION AS VARCHAR(2))||','||CAST(B.RDB$FIELD_SCALE*-1 AS VARCHAR(2))||')' WHEN C.RDB$TYPE_NAME='LONG' THEN 'INTEGER' WHEN C.RDB$TYPE_NAME='SHORT' THEN 'SMALLINT' WHEN C.RDB$TYPE_NAME='VARYING' THEN 'VARCHAR('||B.RDB$CHARACTER_LENGTH||')' WHEN C.RDB$TYPE_NAME='TEXT' THEN 'CHAR('||B.RDB$CHARACTER_LENGTH||')' WHEN C.RDB$TYPE_NAME='BLOB' THEN 'BLOB SUB_TYPE '||CAST(B.RDB$FIELD_SUB_TYPE AS CHAR(1)) ELSE C.RDB$TYPE_NAME END AS F_TIPO, CASE WHEN A.RDB$NULL_FLAG IS NULL THEN '' ELSE 'NOT NULL' END AS F_NULL, F.RDB$FIELD_NAME AS F_PRIMARY FROM RDB$RELATION_FIELDS A LEFT JOIN RDB$FIELDS B ON A.RDB$FIELD_SOURCE=B.RDB$FIELD_NAME LEFT JOIN RDB$TYPES C ON C.RDB$FIELD_NAME='RDB$FIELD_TYPE' AND B.RDB$FIELD_TYPE=C.RDB$TYPE LEFT JOIN RDB$RELATION_CONSTRAINTS E ON A.RDB$RELATION_NAME=E.RDB$RELATION_NAME AND E.RDB$CONSTRAINT_TYPE='PRIMARY KEY' LEFT JOIN RDB$INDEX_SEGMENTS F ON E.RDB$INDEX_NAME=F.RDB$INDEX_NAME AND A.RDB$FIELD_NAME=F.RDB$FIELD_NAME WHERE A.RDB$RELATION_NAME = 'SUA_TABELA' COMO OBTENER LOS TIPOS DE DATOS SOPORTADOS POR EL FIREBIRD SELECT RDB$TYPE, RDB$TYPE_NAME FROM RDB$TYPES WHERE RDB$FIELD_NAME = 'RDB$FIELD_TYPE' COMO REPARAR UNA BASE DE DATOS 1. Detener el Servidor del Firebird. Esto es muy importante porque aunque ningún usuario esté accediendo a la BD el Servidor puede estar realizando alguna tarea interna y si no se lo detiene eso puede conducir a más corrupción. 2. Hacer una copia de seguridad de la BD.

3. Verificar que la Base de Datos realmente tiene problemas: GFIX –c –full MiBase.FDB 4. En caso de tenerlos, intentar recuperarlos: GFIX –mend –full –ignore MiBase.FDB 5. Verificar que haya sido reparada: GFIX –c –full MiBase.FDB 6. Si aún tiene problemas: GBAK –backup –v –ignore MiBase.FDB MiBase.FBK 7. Si se encontró algún error: GBAK –backup –v –ignore –garbage MiBase.FDB MiBase.FBK 8. Si se encontró algún error: GBAK –backup –v –ignore –garbage –limbo MiBase.FDB MiBase.FBK 9. Si aún existe algún error entonces el problema es muy grave y deberías contactar con alguna empresa especializada en restaurar Bases de Datos Si se consiguió hacer el backup de la Base de Datos: GBAK –create –v MiBase.FBK MiBase.FDB Si ocurrió algún error durante la restauración: Usar los parámetros –inactive y –one_at_a_time COMO SABER SI UNA TABLA EXISTE EN LA BASE DE DATOS SELECT COUNT(RDB$Relation_Name) FROM RDB$Relation_Fields WHERE RDB$Relation_Name = NombreMiTabla OPTIMIZANDO LOS ÍNDICES De vez en cuando (quizás una vez por semana) hay que actualizar las estadísticas de los índices asociados a tablas que sufren constantes actualizaciones de datos. Eso se hace con: SET STATISTICS La razón es que el Firebird utiliza esas estadísticas para determinar cual índice elegir durante una consulta y si las estadísticas están desactualizadas entonces puede elegir un índice que no sea el más correcto. REALIZANDO BACKUPS Es preferible usar GBAK.EXE antes que NBACKUP.EXE, la razón es que NBACKUP es más rápido pero no verifica el contenido de las páginas. Se puede usar NBACKUP pero sólo si se realizan frecuentes sweeps y se monitorea frecuentemente los marcadores de las transacciones (ultima transacción activa, última transacción interesante, etc.) USANDO SHADOWS No se recomienda usar shadows en estos momentos porque solamente sirven para recuperar la Base de Datos en el caso de que el disco duro sea dañado. Mucho más rápido y conveniente para mantenimiento es usar RAID5 o RAID10.

RECREANDO LOS ÍNDICES Si la Base de Datos tiene bastante movimiento, se recomienda que de vez en cuando (quizás una vez cada 15 días) se recalculen las estadísticas de los índices, para que el optimizador tenga valores actuales con los cuales trabajar. Al recalcular las estadísticas, con el comando SET STATISTICS automáticamente se reconstruyen los índices. CONEXIÓN A UNA BASE DE DATOS CON PHP La conexión de PHP con Interbase. Lo primero que hay que hacer es realizar la conexión, por medio del comando PHP: ibase_pconnect("base_de_datos.gdb", "USUARIO", "contraseña"); donde el primer parámetro es la ruta completa hacia la base de datos, por ejemplo, si estamos utilizando Linux, podría ser algo así: /opt/interbase/bases/mi_base.gdb o si usáramos Windows, podría ser algo así: c:basesmi_base.gdb El segundo parámetro se refiere al usuario. Es cierto, se puede utilizar SYSDBA, aunque siempre recomiendo crear otro usuario y asignarle permisos a la tabla que vamos a acceder, esto es porque en el tercer parámetro debemos de especificar la contraseña del usuario, y no conviene mostrar la contraseña del administrador del sistema (SYSDBA). No olvides asignar permisos al usuario mediante una orden como esta, suponiendo que el usuario se llama USU_PHP: GRANT ALL ON TABLAX TO USU_PHP donde TABLAX es cualquier tabla que vamos a acceder desde el programa PHP. De esta manera, un ejemplo de conexión quedaría así: ibase_pconnect("/opt/interbase/bases/mi_base.gdb", "USU_PHP", "usu0189xf"); Aquí hay que tomar en cuenta esto: a) Si usas Linux, y usas la versión Classic Server, entonces puedes crear las bases de datos en cualquier directorio, sólo que debes darle todos los permisos al archivo con el comando chmod de Linux. b) Si usas Linux y usas Super Server, entonces la base de datos la debes crear en un directorio que tenga permisos para el usuario InterBase.

Cómo ejecutar SQL Para ejecutar una instrucción SQL, primero deberás haber ejecutado la instrucción ibase_pconnect que se mencionó antes. La ejecución de una instrucción SQL se hace con la función ibase_query, la cual debes asignar a una variable de PHP: $Q = ibase_query("SELECT * FROM TABLAX"); también puedes ejecutar SQL para insertar, modificar o eliminar: $Q = ibase_query("INSERT INTO TABLAX(CAMPO1, CAMPO2) VALUES ('$valor1', '$valor2');"); Obviamente la diferencia es que una instrucción SELECT nos devolverá datos de la tabla, mientras que otra instrucción SQL no lo hará (como INSERT, DELETE o UPDATE). Para obtener los registros resultantes de una consulta con SELECT, utilizaremos esta instrucción: $R = ibase_fetch_object($Q); como se ve, $Q es la variable que se utilizó en la instrucción ibase_query. Cada vez que se ejecuta la instrucción anterior, se va obteniendo un registro de la consulta. Para obtener todos los registros de la consulta, hay que insertarlo en una instrucción while: while ($R = ibase_fetch_object($Q)) { echo $R->CAMPO1 . " "; } Aquí se observan varias cosas: primero, que el ciclo se ejecutará hasta llegar al último registro, únicamente ejecutando varias veces el comando ibase_fetch_object. También hay que poner atención en que el nombre del campo vaya con mayúsculas, ya que si se escribe con minúsculas no va a funcionar.

La instrucción echo envía la expresión a la salida, en este caso la salida es enviada al cliente (navegador web que solicitó la página). El punto significa concatenación y la cadena " " sirve para que el navegador lo interprete como un cambio de línea. Otra aclaración: cuando se ejecute una instrucción de SQL que no sea de consulta (que no sea SELECT), conviene ejecutar la instrucción ibase_commit() para aplicar la transacción y de esta manera se asegure que los cambios fueron efectuados.

Un Ejemplo Para finalizar, haré un pequeño ejemplo de cómo crear una página web. Tomaré como referencia la tabla personas que se creó en el artículo Pasando de Paradox a InterBase, parte 2. Esta es la estructura de la tabla: CREATE TABLE PERSONAS( CLAVEPERSONA INTEGER NOT NULL, NOMBRE VARCHAR(40), APELLIDOS VARCHAR(40), TELEFONO VARCHAR(40), EMAIL VARCHAR(100), PRIMARY KEY(CLAVEPERSONA) )

Entonces para desplegar esta tabla crearemos un archivo HTML con código integrado de PHP: