Principais Recursos Do Firebird 2

Download Principais Recursos Do Firebird 2

Post on 22-Nov-2015

49 views

Category:

Documents

0 download

TRANSCRIPT

Principais recursos do Firebird 2.1Para a alegria de muitos desenvolvedores e usurios, em Abril/2008 foi lanada a verso final do Firebird 2.1! Apesar do incremento de apenas 0.1 no nmero da verso (de 2.0 para 2.1), a quantidade de novos recursos e melhorias inseridas neste release do SGBD expressiva, e facilmente justificaria ganhar um incremento maior, no mnimo, para 2.5 ;-)Migrando para o FB 2.1Migrar de uma verso para outra do Firebird nunca foi uma tarefa complicada. Este release mantm a mesma facilidade de sempre, geralmente bastando um backup/restore para atualizar a ODS (On Disk Structure) do arquivo. No entanto, nesta verso, alguns detalhes devem ser observados, especialmente para quem tem o hbito de usar caracteres fora da tabela ASCII (ex: acentuados) na metadata dos seus BDs.At a verso 2.0, durante a criao ou alterao dos objetos do banco de dados (tabelas, procedures, etc.), o Firebird no fazia a traduo do charset do cdigo fonte da metadata entre a aplicao cliente e a codificao padro, usada internamente no BD (UNICODE_FSS). Alm disso, durante a leitura de blobs textuais, o FB no estava convertendo a informao armazenada para o charset utilizado no cliente.Esses problemas foram resolvidos nesta verso. Isso s no verdade se voc criar ou alterar objetos no banco de dados, onde a metadata contenha caracteres fora do padro UNICODE_FSS, utilizando uma conexo com charset NONE ou UNICODE_FSS.Caso seu banco de dados tenha objetos definidos com caracteres fora do padro ASCII, voc deve repar-lo para que possa ser lido aps a migrao para o Firebird 2.1.O artigo "Migrando um BD para o FB 2.1" descreve dois mtodos para corrigir o problema. Escolha o que julgar mais adequado para o seu caso.PRINCIPAIS NOVIDADESMonitoramento de banco de dadosTalvez este seja o recurso mais aguardado para esta verso do Firebird. Aqueles que sempre quiseram saber o que se passava dentro de um banco de dados em um determinado momento, agora podero extrair essa informao atravs das tabelas virtuais de monitoramento! Note que, para ter acesso a esse recurso, sua base de dados deve estar com a ODS na verso 11.1.A recuperao das informaes de monitoramento feita atravs de selects normais, executados nas tabelas de monitoramento. importante saber que o acesso informao feito com a transao associada ao select de monitoramento no isolamento Consistency. Com isso, para atualizar as informaes recuperadas (refresh), necessrio fechar a transao atual e executar o select novamente, abrindo uma nova transao. Isso garante que as informaes de tabelas de monitoramento inter-relacionadas (mestre-detalhe) estaro sempre consistentes.A consulta completa das informaes de monitoramento s pode ser realizada pelo owner do banco de dados, ou pelo SYSDBA. Usurios normais s tm acesso s informaes relacionadas sua prpria conexo com o banco.As tabelas de monitoramento so: MON$DATABASE, MON$ATTACHMENTS, MON$TRANSACTIONS, MON$TRANSACTIONS, MON$STATEMENTS, MON$CALL_STACK, MON$IO_STATS, MON$RECORD_STATS. A tabela abaixo contm a estrutura das tabelas e uma breve descrio dos campos. Para informaes mais detalhadas, leia o release notes que acompanha a instalao do produto.MON$DATABASE (connected database)- MON$DATABASE_NAME (database pathname or alias)- MON$PAGE_SIZE (page size)- MON$ODS_MAJOR (major ODS version)- MON$ODS_MINOR (minor ODS version)- MON$OLDEST_TRANSACTION (OIT number)- MON$OLDEST_ACTIVE (OAT number)- MON$OLDEST_SNAPSHOT (OST number)- MON$NEXT_TRANSACTION (next transaction number)- MON$PAGE_BUFFERS (number of pages allocated in the cache)- MON$SQL_DIALECT (SQL dialect of the database)- MON$SHUTDOWN_MODE (current shutdown mode) 0: online, 1: multi-user shutdown, 2: single-user shutdown, 3: full shutdown- MON$SWEEP_INTERVAL (sweep interval)- MON$READ_ONLY (read-only flag)- MON$FORCED_WRITES (sync writes flag)- MON$RESERVE_SPACE (reserve space flag)- MON$CREATION_DATE (creation date/time)- MON$PAGES (number of pages allocated on disk)- MON$BACKUP_STATE (current physical backup state) 0: normal, 1: stalled, 2: merge- MON$STAT_ID (statistics ID)

MON$ATTACHMENTS (connected attachments)- MON$ATTACHMENT_ID (attachment ID)- MON$SERVER_PID (server process ID)- MON$STATE (attachment state) 0: idle, 1: active- MON$ATTACHMENT_NAME (connection string)- MON$USER (user name)- MON$ROLE (role name)- MON$REMOTE_PROTOCOL (remote protocol name)- MON$REMOTE_ADDRESS (remote address)- MON$REMOTE_PID (remote client process ID)- MON$REMOTE_PROCESS (remote client process pathname)- MON$CHARACTER_SET_ID (attachment character set)- MON$TIMESTAMP (connection date/time)- MON$GARBAGE_COLLECTION (garbage collection flag)- MON$STAT_ID (statistics ID)

MON$TRANSACTIONS (started transactions)- MON$TRANSACTION_ID (transaction ID)- MON$ATTACHMENT_ID (attachment ID)- MON$STATE (transaction state) 0: idle (state after prepare, until execution begins), 1: active (state during execution and fetch. Idle statereturns after cursor is closed)- MON$TIMESTAMP (transaction start date/time)- MON$TOP_TRANSACTION (top transaction)- MON$OLDEST_TRANSACTION (local OIT number)- MON$OLDEST_ACTIVE (local OAT number)- MON$ISOLATION_MODE (isolation mode) 0: consistency, 1: concurrency, 2: read committed record version, 3: read committed no record version- MON$LOCK_TIMEOUT (lock timeout) -1: infinite wait 0: no wait, N: timeout N- MON$READ_ONLY (read-only flag)- MON$AUTO_COMMIT (auto-commit flag)- MON$AUTO_UNDO (auto-undo

MON$STATEMENTS (prepared statements)- MON$STATEMENT_ID (statement ID)- MON$ATTACHMENT_ID (attachment ID)- MON$TRANSACTION_ID (transaction ID)- MON$STATE (statement state) 0: idle, 1: active- MON$TIMESTAMP (statement start date/time)- MON$SQL_TEXT (statement text, if appropriate)- MON$STAT_ID (statistics ID)

MON$CALL_STACK (call stack of active PSQL requests)- MON$CALL_ID (call ID)- MON$STATEMENT_ID (top-level DSQL statement ID)- MON$CALLER_ID (caller request ID)- MON$OBJECT_NAME (PSQL object name)- MON$OBJECT_TYPE (PSQL object type)- MON$TIMESTAMP (request start date/time)- MON$SOURCE_LINE (SQL source line number)- MON$SOURCE_COLUMN (SQL source column number)- MON$STAT_ID (statistics ID)

MON$IO_STATS (I/O statistics)- MON$STAT_ID (statistics ID)- MON$STAT_GROUP (statistics group) 0: database, 1: attachment, 2: transaction, 3: statement, 4: call- MON$PAGE_READS (number of page reads)- MON$PAGE_WRITES (number of page writes)- MON$PAGE_FETCHES (number of page fetches)- MON$PAGE_MARKS (number of pages with changes pending)

MON$RECORD_STATS (record-level statistics)- MON$STAT_ID (statistics ID)- MON$STAT_GROUP (statistics group) 0: database, 1: attachment, 2: transaction, 3: statement, 4: call- MON$RECORD_SEQ_READS (number of records read sequentially)- MON$RECORD_IDX_READS (number of records read via an index)- MON$RECORD_INSERTS (number of inserted records)- MON$RECORD_UPDATES (number of updated records)- MON$RECORD_DELETES (number of deleted records)- MON$RECORD_BACKOUTS (number of records where a new primary record version or a change to an existing primary recordversion is backed out due to rollback or savepoint undo)- MON$RECORD_PURGES (number of records where record version chain is being purged of versions no longer needed by OATor younger transactions)- MON$RECORD_EXPUNGES (number of records where record version chain is being deleted due to deletions by transactionsolder than OAT)

No exemplo abaixo, o select retorna as informaes sobre as transaes ativas no banco de dados, que no esto associadas com a conexo que est rodando o select de monitoramento (veja a clusula where).select mon$transaction_id, mon$attachment_id, mon$state, mon$timestamp, mon$top_transaction, mon$oldest_transaction, mon$oldest_active, mon$isolation_mode, mon$lock_timeout, mon$read_only, mon$auto_commit, mon$auto_undo, mon$stat_id, case mon$isolation_mode when 0 then 'Consistency' when 1 then 'Concurrency' when 2 then 'Read Committed Record Version' when 3 then 'Read Committed' else 'Unknown' end as Desc_Isolation, case MON$LOCK_TIMEOUT when -1 then 'Infinite Wait' when 0 then 'No wait' else 'Timeout ' || cast(MON$LOCK_TIMEOUT as varchar (20)) end as Desc_TimeOutfrom mon$transactionswhere (mon$attachment_id current_connection)order by 1Cancelando comandosAtravs das tabelas de monitoramento, possvel cancelar queries ou comandos que esto sendo executados. Para isso, basta abrir uma conexo com o banco de dados e dar um delete na tabela mon$statements, apagando o registro que representa o comando que voc quer cancelar. O comando abaixo cancela todos os comandos que esto sendo executados no banco de dados, e que no estejam associados conexo do SYSDBA (que est executando o cancelamento):delete from mon$statementswhere mon$attachment_id current_connection;Tabelas Globais Temporrias (GTT = Global Temporary Table)O recurso de tabelas temporrias foi implementado inicialmente no Fyracle (verso do Firebird que simula um SGBD Oracle) e agora foi integrado ao Firebird. As metadatas das tabelas temporrias ficam armazenadas no BD, e por isso so compartilhadas entre todas as conexes. Os dados contidos nestas tabelas so temporrios, e visveis apenas para a conexo que os originou. Atravs de isolamento transacional, podemos isolar os dados no nvel de transao, dentro de uma mesma conexo. possvel definir tabelas temporrias de forma que os dados existam apenas durante a durao da conexo que os originou, ou ento sejam apagados automaticamente quando a transao que os originou for encerrada. A especificao da durao dos dados feita durante a criao da tabela temporria. Caso seja especificada a clusula ON COMMIT PRESERVE ROWS, os dados existiro durante a durao da conexo. Caso seja especificado ON COMMIT DELETE ROWS, eles sero apagados to logo a transao seja encerrada. A sintaxe resumida para criao de tabelas temporrias segue o padro de um create table comum, diferenciado apenas pelas clusulas apropriadas:CREATE GLOBAL TEMPORARY TABLE...[ON COMMIT ROWS]Praticamente todos os recursos disponveis para uma tabela normal (ex: triggers, ndices, integridade referencial) esto disponveis para as tabelas temporrias, salvo as seguintes excees: No possvel criar referncias entre tabelas permanentes e temporrias. Uma tabela criada com a opo PRESERVE ROWS no pode referenciar outra tabela criada com a opo DELETE ROWS. Uma constraint definida para um domnio no pode fazer referncia a uma GTT.Nota: Os dados armazenados em tabelas temporrias ficam salvos em arquivos temporrios, fora do arquivo do banco de dados.Otimizao do protocolo de comunicaoO Firebird, quando utilizado no modelo duas camadas (cliente servidor) em redes de baixa velocidade (ex: Internet), se mostra bastante lento. O culpado, neste caso, o protocolo de comunicao responsvel pela conversa entre a aplicao cliente e o servidor Firebird, que no foi originalmente escrito para ser usado em redes com banda limitada. A soluo definitiva para este problema vir em alguma verso futura do Firebird, com a criao de um novo protocolo de comunicao. No entanto, isso quebrar a compatibilidade de comunicao com servidores antigos.No Firebird 2.1, algumas rotinas do atual protocolo de comunicao foram otimizadas, de forma a gerar menos conversa entre o cliente e o servidor, sem perder a compatibilidade com as verses anteriores do Firebird. Em alguns casos, um ganho de performance de cerca de 40% pde ser observado nas conexes via internet. Para ter total proveito das otimizaes realizadas, necessrio que a conexo esteja usando o fbclient.dll da verso 2.1, e que o servidor tambm seja 2.1 (ou superior).Nota: Drivers que acessam diretamente o servidor, sem passar pela fbclient.dll (ex: JayBird e .NET Provider) devero ter seus cdigos atualizados para que tirem proveito das otimizaes.Database TriggersEste um recurso criado pelo Adriano Fernandes, nico brasileiro atualmente a fazer parte da equipe de desenvolvimento do FB. Estes triggers especiais so disparados quando uma conexo ou transao iniciada/encerrada. A sintaxe de criao pode ser vista abaixo: ::={CREATE | RECREATE | CREATE OR ALTER}TRIGGER [ACTIVE | INACTIVE]ON [POSITION ]ASBEGIN...END ::=CONNECT | DISCONNECT | TRANSACTION START | TRANSACTION COMMIT | TRANSACTION ROLLBACKA seqncia de operaes realizadas durante uma conexo com o banco : A conexo com o banco estabelecida. A transao iniciada. Os triggers do tipo CONNECT so executados; excees que no forem tratadas faro um rollback da transao, encerraro a conexo e retornaro para o cliente. A transao commitadaDurante a desconexo: Uma transao iniciada Triggers so disparados. As excees que no forem tratadas ocasionaro um rollback da transao e encerraro a conexo, no sendo retornadas ao cliente. A transao commitada A conexo encerrada.Abertura de uma transao: Os triggers so disparados; excees no tratadas so enviadas para o cliente e a transao desfeita (rollback).Commit de uma transao: Os triggers so disparados; excees no tratadas faro com que as instrues executadas pelos triggers de transao sejam desconsideradas. O commit abortado e a exceo retornada para o cliente, para que ele d um rollback na transao toda, ou corrija o problema e tente um commit novamente.Nota: Para casos onde o commit em duas fases esteja sendo usado, o trigger ser executado no prepare e no no commit.RollBack de uma transao: Os triggers so disparados durante o rollback da transao. As alteraes feitas so descartadas junto com a transao. As excees so desconsideradas. Notas para os triggers de banco de dados: Os triggers no podem ter seus tipos alterados. A permisso de criar, alterar, recriar ou apagar os triggers limitada ao owner do banco ou ao SYSDBA.Nota: Parmetros de linha de comando foram criados para os utilitrios gbak, nbackup e isql, para que eles no disparem os database triggers. Bancos de dados em parties RAWEstamos acostumados a criar os bancos de dados em parties gerenciadas por um sistema de arquivos (ex: fat32, ntfs, ext3, etc). O Firebird permite criar os bancos de dados em parties RAW, ou seja, que no so gerenciadas por sistemas de arquivos. Isso pode aumentar consideravelmente a performance em bancos de dados configurados com forced writes on e que crescem rapidamente.Este recurso visa basicamente o Linux, visto que neste sistema operacional relativamente fcil trabalhar com parties no formatadas (diferente do que acontece no Windows).Forced Writes no Linux agora realmente funcionaSe voc costumava a ativar o recurso de forced writes nos bancos de dados armazenados no Linux, saiba que este recurso nunca funcionou! Recentemente, o problema foi descoberto e resolvido. Nota: O problema afetava somente a verso Linux do Firebird.Quando forced writes est ligado (on), os dados gravados no BD no permanecem no cache de disco, sendo gravados imediatamente, diminuindo muito a chance de ocorrer uma corrupo no banco de dados devido a fatores externos.Pr-alocao de espao no discoSabemos que o arquivo de um banco de dados Firebird cresce de acordo com a necessidade. O Firebird 2.1 introduz a possibilidade de pr-alocar espao, diminuindo...