Mostrando entradas con la etiqueta Database. Mostrar todas las entradas
Mostrando entradas con la etiqueta Database. Mostrar todas las entradas

Modificar el status de una base de datos Interbase / Firebird


Al realizar un backup o un restore de una base de datos necesitamos desconectar a los clientes para garantizar la integridad de la copia de seguridad. Para ello vamos a utilizar un componente llamado tIBConfigService de la paleta Interbase Admin.




El código que utilizaremos será el siguiente:




with IBConfigService1 do

begin

DatabaseName:=Base de datos;

ServerName:=Nombre del servidor;

LoginPrompt:=False;

Params.Clear;


Antes de cerrar la BD se deberá conectar únicamente un usuario


que será el que tomará el control de la BD

Params.Add(user_name=SYSDBA);


Params.Add(password=xxxxx);

try

Active:=True;


ShutdownDatabase(Forced, 0); Cierra la base de datos

except

ShowMessage('No se ha podido cerrar la BD');

end;

Active:=False;

end;


Para activar la BD hay que cambiar la línea "ShutdownDatabase(Forced, 0);" por


"BringDatabaseOnline;"




Los parámetros asociados al procedimiento ShutDownDatabase pueden ser:




Forced: Apaga la base de datos después del número de segundos especificado. Para apagar inmediatamente poner el número de segundos=0;



DenyTransaction: Niega nuevas transacciones para el número de segundos especificado y luego hacer shutdown



DenyAttachment: Niega nuevas conexiones para el número de segundos especificado y luego hacer shutdown.


Libros:









Programa complejo resuelto con una línea de código en Delphi

Partimos del supuesto que recibimos el encargo de realizar un programa en Delphi que debe hacer una llamada a una API, la cual nos devuelve un resultado en formato JSON, con 1000 campos, pero sólo queremos visualizar 3 de ellos (URL, TITLE, EXPLANATION) en el formulario de presentación al cliente.

¿Cómo hacemos esto de una forma visual en Delphi?, pues a continuación les explico detalladamente los pasos a seguir:


Añadimos un componente tRestResponseDataSetAdapter, un tFDMemTable y para hacer pruebas un tStringGrid, que nos mostrará todo el conjunto de datos

En la propiedad "Dataset" del tRestResponseDataSetAdapter seleccionamos FDMemTable1 y en "Response" selecciono "RESTResponse1"

Con el botón derecho del ratón pulsamos sobre el componente FDMemtable1 y seleccionamos AddBindSource, con lo se creará otro componente llamado "BindSourceDB1"

Volvemos a pulsar con el botón derecho del ratón sobre FDMemTable1 y seleccionamos Bind Visually... abriéndose una ventana llamada "LiveBindings Designer" 


Si vinculamos FDmemTable1 con el componente StringGrid1, uniendo con el ratón los campos marcados con un asterisco, de esta forma:


al iniciar el programa llamando a "Execute", de esta forma:

PROCEDURE TFORM1.INICIO;
BEGIN
RESTRequest1.Execute;
END;

veremos que los 1000 campos que nos ha devuelto la API se ven el Grid, que no es lo queremos en este caso, ya que únicamente necesitamos que se muestren en pantalla 3 de ellos, entonces ¿cómo se hace esto?, pues gracias al componente tBindingsList    ¡Este es el truco de magia!

1) Hacemos doble clic sobre el componente BindingsList1


(que se habrá creado al hacer la vinculación anterior)

 


 2) Sobre el apartado Bind Components hacemos clic con el botón derecho y seleccionamos la opción "New LinkControlToField1" y hacemos clic sobre esa nueva línea que se habrá creado para ver las propiedades en el Inspector de Objetos.


 

Allí en la propiedad "DataSource" seleccionamos "BindSourceDB1"  y en "FieldName" escribimos "Title" (es uno de los campos que nos interesa visualizar)


Cerramos la ventana de Edición del BindingsList y Actualizamos la ventana "LiveBindings Designer" haciendo clic con el botón derecho del ratón y activando el menú "Refresh Designer"
 
Veremos que se ha creado un nuevo ítem "Title (Invalid)", lo de Invalid me imagino que es por que el dataset está cerrado en la fase de diseño.
 

y hacemos lo mismo para los otros dos campos.

Después sólo queda vincular los ítems "Title (invalid), url (invalid) y explanation (invalid)" a los componentes tEdit-Text, uniendo con el ratón los campos anteriores con el campo "Text", tal como se muestra en la imagen:

 

Eliminamos el componente "StringGrid1"

Y eso es todo, ahora al ejecutar el programa

PROCEDURE TFORM1.INICIO;
BEGIN
RESTRequest1.Execute;
END;
 




Veríamos el resultado que nos interesa, lo que se traduce en una mayor rapidez de ejecución del programa, ya que nos ahorramos procesar 997 campos, de los 1000 que devuelve la API.


Además, como han podido ver, todo se ha hecho de forma visual con sólo 1 línea de código (RESTRequest1.Execute),
simplemente asombroso y es que además este mismo programa funciona en
Android, IOS, Linux y Windows y la portabilidad es instantánea.

¿A que merece la pena pasarse a Delphi? 

Imáginense la cantidad de código que habría que escribir con otros lenguajes de programación para hacer lo mismo, y es que Delphi utilizando programación visual no tiene rival.



 

Asegurar / monitorizar Firebird

Estos son algunos tips que hay que tener encuenta para proteger las bases de datos Firebird:



-Cambiar la contraseña:

gsec –user SYSDBA –pa "antiguo pass" –modify SYSDBA –pw "nuevo pass"


-Abrir el puerto 3050 como aquí te indica si quieres que los usuarios accedan desde fuera a tu sistema, si estás en un entorno web en donde tienes en el servidor tus bases de datos esto no hace falta hacerlo.

Ejecutar Firebird como non-system-user:

-Crear un usuario por ejemplo "UsuarioFB", que no pertenezca a ningun grupo de usuarios del sistema y en la ventana de propiedades desmarcar el check "Allow logon to terminal server"

-En la carpeta donde estén las bases de datos en Propiedades->Seguridad añadir el usuario "UsuarioFB" con los permisos de lectura, escritura,listar directorios, listado y ejecución.

En entornos web con que des permisos al usuario "iusr" de lectura y escritura es suficiente.

- Hay que cambiar las propiedades del servicio "Firebird Server – DefaultInstance" y "FB Guardian" de la siguiente manera:

1) desde Propiedades->Recovery cambiando todos los desplegables a "restart recovery"

2) desde Propiedades->Log on pinchar en "This account" y seleccionar el usuario "UsuarioFB" con la contraseña y usuario que hayamos indicado previamente.

3) desde Propiedades->General marcar en tipo de inicio "Automático"

Por regla general, sólo el proceso del servidor Firebird debería tener acceso a los archivos de base de datos. Los usuarios no necesitan, y no deben tener, el acceso a los archivos - ni siquiera de sólo lectura. Ellos consultan bases de datos a través del servidor, y el servidor se asegura de que sólo los usuarios obtengan el tipo de acceso permitido (en su caso) a cualquier objeto dentro de la base de datos.



Monitorización

Firebird incorpora tablas de monitorización que permiten conocer información relativa a la base de datos y a las consultas de los clientes respecto a la base de datos conectada, sentencias preparadas, transacciones, etc

Las tablas son las siguientes:

MON$DATABASE: base de datos conectada. Con información como ruta de la base de

datos, versión de ODS, identificadores de proceso, etc.

- MON$ATTACHMENTS: Conexiones realizadas. Con información de estado, usuario que

hace la conexión, protocolo de conexión, etc.

- MON$STATEMENTS: Sentencias preparadas para ejecutar. Con información como

identificadores, texto, estado, etc.

- MON$CALL_TACK: Pila de llamadas de las sentencias PSQL activas.

- MON$IO_STATS: Estadísticas de I/O.

- MON$RECORD_STATS: Estadísticas a nivel de fila.

- MON$MEMORY_USAGE: Uso de memoria actual.

- MON$CONTEXT_VARIABLES: Variables de contexto conocida



Ejemplos de consultas:



-Para saber todos los identificadores de procesos con carga de CPU actuales:

SELECT MON$SERVER_PID

FROM MON$ATTACHMENTS

WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION

AND MON$STATE = 1



-Para obtener información sobre las aplicaciones clientes

SELECT MON$USER, MON$REMOTE_ADDRESS,

MON$REMOTE_PID,

MON$TIMESTAMP

FROM MON$ATTACHMENTS

WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION



-Para obtener el nivelde aislamiento de la transacción actual

SELECT MON$ISOLATION_MODE

FROM MON$TRANSACTIONS

WHERE MON$TRANSACTION_ID = CURRENT_TRANSACTION



-Para obtener las sentencias actualmente activas

SELECT ATT.MON$USER,

ATT.MON$REMOTE_ADDRESS,

STMT.MON$SQL_TEXT,

STMT.MON$TIMESTAMP

FROM MON$ATTACHMENTS ATT

JOIN MON$STATEMENTS STMT

ON ATT.MON$ATTACHMENT_ID = STMT.MON$ATTACHMENT_ID

WHERE ATT.MON$ATTACHMENT_ID <> CURRENT_CONNECTION

AND STMT.MON$STATE = 1



Créditos:

Simon Carter

Vicente Tejero Trueba (Monitorización)


















Activating a Shadow (Firebird)

The switch for activating a shadow when a database dies is –ac[tivate]. The syntax is



gfix -ac

Suppose the shadow’s first volume, employee.sh1, is in a directory /opt/
dbshadows. You would activate it with this command:

./gfix -ac /opt/dbshadows/employee.sh1








Finding Limbo Transactions (Firebird)

To list the IDs of all limbo transactions



gfix -l db_name



Validate a database (Firebird)

To validate a database, simply enter the command

gfix -v

Validation will silently locate and free any unassigned pages or misallocated structures

it finds. It will report any corrupt structures but does not attempt to mend them.



To have gfix report faults but not attempt to free the spaces, include the –n[o_update]

switch:



gfix -v -n



You can have the validation ignore checksum errors by adding the –i[gnore]

switch:



gfix -v -i




Libros:






Make / restore a backup (Firebird)

Make a backup

gbak -t -user sysdba -pass masterkey mibase.fdb mibase.fbk



Restore a backup

gbak -r -user sysdba -pass masterkey mibase.fbk mibase.fdb





Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...