Arquivos SQLite Explicados: Estrutura, Casos de Uso e Limites Principais

Um arquivo SQLite é um único arquivo de disco que contém um banco de dados relacional inteiro — tabelas, índices e esquema juntos. A própria documentação do SQLite o chama de "arquivo de banco de dados principal" e observa que "o estado completo de um banco de dados SQLite geralmente está contido" nele. A palavra geralmente está fazendo um trabalho importante nessa frase.
Se você já recebeu um arquivo .db, .sqlite ou .sqlite3 e se perguntou se recebeu todos os dados, este é o formato que você precisa entender corretamente.
O que realmente é um arquivo SQLite
O SQLite se descreve como "uma biblioteca em processo que implementa um mecanismo de banco de dados SQL transacional, autônomo, sem servidor e de configuração zero". A mesma página afirma que o SQLite "não possui um processo de servidor separado". Um aplicativo vincula a biblioteca e lê o arquivo.
Duas consequências decorrem disso. Primeiro, o banco de dados viaja como um único artefato, e é por isso que tantos aplicativos distribuem seus dados dessa forma. Segundo, o formato precisa ser extremamente estável, porque esses arquivos sobrevivem ao software que os gravou. O SQLite lista "formato de arquivo estável e duradouro" entre seus principais recursos. Também afirma que o código está em domínio público, "livre para uso para qualquer finalidade, comercial ou privada".
A escala é fácil de subestimar. A própria página de apresentação do SQLite diz que ele "é o banco de dados mais amplamente implantado no mundo, com mais aplicativos do que podemos contar".
O que há dentro do arquivo
O cabeçalho de 100 bytes
Os primeiros bytes identificam o formato. No deslocamento 0, o arquivo carrega uma string de cabeçalho de 16 bytes: SQLite format 3\000. Essa assinatura é como as ferramentas reconhecem o arquivo, independentemente de sua extensão.
O próximo campo importa mais do que parece. No deslocamento 16 fica um número inteiro de 2 bytes que contém "o tamanho da página do banco de dados em bytes". A documentação afirma que ele "deve ser uma potência de dois entre 512 e 32768 inclusive, ou o valor 1 representando um tamanho de página de 65536". Todos os campos multibyte no cabeçalho são armazenados com o byte mais significativo primeiro.
Mais dois bytes seguem nos deslocamentos 18 e 19: a versão de gravação e a versão de leitura do formato do arquivo. A documentação observa que o valor é "1 para legado; 2 for WAL".
Páginas, não linhas
Abaixo do cabeçalho, o arquivo é uma pilha de páginas de tamanho fixo. A especificação é explícita: "O arquivo de banco de dados principal consiste em uma ou mais páginas. O tamanho de uma página é uma potência de dois entre 512 e 65536 inclusive. Todas as páginas dentro do mesmo banco de dados têm o mesmo tamanho."
As páginas são numeradas a partir de 1, e o número máximo de páginas é 4.294.967.294. Tabelas e índices vivem dentro dessas páginas como estruturas B-tree, e é por isso que um editor de texto mostra muito pouco.
Os arquivos auxiliares que ninguém menciona
Esta é a parte que pega as pessoas de surpresa. A documentação diz que o estado completo "geralmente" está em um único arquivo. Em seguida, ela nomeia a exceção. Durante uma transação, o SQLite "armazena informações adicionais em um segundo arquivo chamado 'rollback journal'". No modo WAL, esse segundo arquivo é um log de gravação antecipada (write-ahead log).
Portanto, uma cópia feita enquanto o aplicativo está no meio de uma gravação pode não conter dados confirmados que ainda vivem no arquivo auxiliar. Se um colega lhe enviar um arquivo .db e nada mais, e os números parecerem um pouco desatualizados, essa é a primeira coisa a verificar.
Como abrir um arquivo SQLite
Existem três caminhos, e o correto depende do que você pretende fazer a seguir.
Leia com um visualizador. Visualizadores de SQLite para desktop e baseados em navegador abrem o arquivo, listam as tabelas e permitem que você navegue pelas linhas. Essa é a maneira mais rápida de responder "o que realmente tem aqui dentro", e geralmente é o suficiente para uma primeira olhada.
Consulte-o com a linha de comando ou uma biblioteca. O shell do sqlite3 e as integrações da biblioteca padrão em Python, Node e na maioria das outras linguagens leem o formato diretamente. Este é o caminho quando você já conhece o esquema e deseja um número específico.
Exporte uma tabela e analise-a em outro lugar. Exporte uma tabela para CSV e leve-a para qualquer ferramenta que sua equipe já use. Você perde os relacionamentos entre as tabelas, que é justamente o que o formato estava protegendo. Sempre que possível, exporte o resultado combinado (join) em vez das tabelas brutas.
Por que uma ferramenta pode dizer que o arquivo não é um banco de dados
A especificação explica isso. Todo arquivo válido começa com uma string de cabeçalho de 16 bytes, SQLite format 3\000. Um leitor que abre um arquivo e não encontra essa assinatura no deslocamento 0 não recebeu um banco de dados SQLite.
Três causas comuns cobrem a maioria dos casos. O arquivo foi transferido de forma incompleta, então o cabeçalho está lá, mas o restante está truncado. O arquivo está criptografado ou envelopado por um aplicativo, então os primeiros bytes são outra coisa. Ou a extensão é enganosa, e o que você realmente recebeu foi uma exportação simples renomeada por alguém tentando ajudar.
Qual o tamanho máximo que um arquivo SQLite pode atingir
Maior do que a pergunta geralmente sugere. A página de limites do SQLite afirma que o tamanho máximo de um arquivo de banco de dados é de 4.294.967.294 páginas. No tamanho máximo de página de 65.536 bytes, isso representa um tamanho máximo de banco de dados de cerca de 281 terabytes.
A página é incrivelmente honesta sobre esse número. Ela observa que o limite superior "não foi testado, pois os desenvolvedores não têm acesso a hardware capaz de atingir esse limite".
La contagem de linhas é limitada pela mesma barreira. O máximo teórico é de 2^64 linhas em uma tabela. A documentação aponta que esse limite "é inalcançável, pois o tamanho máximo do banco de dados de 281 terabytes será atingido primeiro".
Para o trabalho prático, a lição útil é o oposto de um limite. Se alguém lhe entregar um arquivo .db e avisar que ele é grande, o formato quase certamente não será o que vai te impedir. O tamanho da página escolhido quando o arquivo foi criado, e se ele carrega índices, afetará a experiência muito mais do que qualquer teto documentado.
Onde você encontra arquivos SQLite
- Exportações de aplicativos. Aplicativos desktop e móveis frequentemente armazenam histórico, configurações e logs de mensagens em um arquivo SQLite que você pode copiar.
- Entregas de análises. Engenheiros enviam um snapshot como um único arquivo em vez de conceder acesso ao banco de dados.
- Dispositivos e telemetria. Sistemas embarcados gravam localmente porque não há servidor para se comunicar.
- Arquivos. A estabilidade de longo prazo do formato o torna uma escolha comum para conjuntos de dados que devem permanecer legíveis por anos.
- Componentes internos de navegadores e ferramentas. Muitas ferramentas locais mantêm o estado dessa forma, e é por isso que a extensão aparece em chamados de suporte.
Para que servem os arquivos WAL e journal
Você pode ter copiado um arquivo .db e encontrado um arquivo -wal ou -journal ao lado dele. Esses são os arquivos auxiliares que a especificação descreve, e excluí-los é a forma como as pessoas perdem dados.
O rollback journal é o mecanismo mais antigo. Antes de alterar uma página, o SQLite grava a versão original dessa página no journal. Se a gravação for interrompida, a original pode ser restaurada, que é o que faz uma transação sobreviver a uma falha.
O log de gravação antecipada (write-ahead log) inverte a organização. As alterações vão primeiro para o log e o arquivo principal é atualizado mais tarde. O cabeçalho sinaliza em qual modo o banco de dados está. A versão de gravação do formato do arquivo no deslocamento 18 é "1 para legado; 2 para WAL".
A regra prática decorre diretamente da frase sobre o estado completo. Suponha que o banco de dados esteja no modo WAL e alguém lhe entregue apenas o arquivo principal. As alterações confirmadas mais recentes ainda podem estar no log que você não recebeu.
Portanto, quando lhe derem um arquivo de banco de dados, faça duas perguntas. O aplicativo foi fechado corretamente quando a cópia foi feita e algo mais veio com ele? Ambas as respostas geralmente são sim, e a única vez em que não são é quando os números silenciosamente discordam da produção.
Arquivo SQLite vs CSV vs Parquet
| Arquivo SQLite | CSV | Parquet | |
|---|---|---|---|
| Formato | Múltiplas tabelas, um arquivo | Uma tabela, um arquivo | Uma tabela, um arquivo ou pasta |
| Tipos | Armazenados com os dados | Inferidos pelo leitor | Armazenados com os dados |
| Relacionamentos | Mantidos, via chaves e índices | Perdidos | Perdidos |
| Legível por humanos | Não | Sim | Não |
| Escrito para ser consultado | Sim, com SQL | Não | Sim, por mecanismos de análise |
| Falha comum | Ausência do arquivo auxiliar journal ou WAL | Adivinhação de tipo e delimitador | Suporte da cadeia de ferramentas (toolchain) |
Se você trabalha com esses formatos regularmente, nossos guias explicativos sobre arquivos Parquet e arquivos TSV cobrem o mesmo assunto para esses dois.
Por que as equipes escolhem o formato
Nada para executar. Como o SQLite "não possui um processo de servidor separado", uma entrega é apenas uma cópia de arquivo, em vez de um ticket de provisionamento.
Os tipos sobrevivem à viagem. Uma coluna de data chega como uma data. Qualquer pessoa que já tenha visto um leitor de CSV transformar um identificador em notação científica entende o valor disso.
Os relacionamentos também sobrevivem. Várias tabelas relacionadas permanecem juntas em um único artefato, de modo que os joins que davam sentido aos dados continuam disponíveis.
A durabilidade faz parte do design. O SQLite lista transações "mesmo após perda de energia" entre seus principais recursos, e é por isso que tantos softwares embarcados dependem dele.
Limites que vale a pena conhecer
Um arquivo, um gravador por vez. O mecanismo é embarcado em vez de servido, portanto, o modelo de concorrência é diferente de um banco de dados cliente-servidor. Essa é uma escolha de design, não um defeito, mas molda para o que o arquivo é adequado.
O tamanho da página é fixado na criação. Cada página em um banco de dados tem o mesmo tamanho, e esse tamanho é registrado no cabeçalho. Você o escolhe uma única vez.
A regra do arquivo auxiliar novamente. Qualquer rotina de cópia, backup ou upload que pegue apenas o arquivo principal pode perder o que quer que estivesse no journal ou no log de gravação antecipada (write-ahead log).
Opacidade. Um arquivo SQLite não permite uma leitura rápida visual como um CSV. Lê-lo exige uma ferramenta, que é exatamente a fricção que atrasa muitas análises.
Como obter respostas de um arquivo SQLite
O caminho tradicional é instalar um cliente, abrir o arquivo, aprender o esquema e começar a escrever SQL. Isso funciona bem quando você já conhece as tabelas. É lento quando você recebeu o arquivo hoje de manhã e a reunião é hoje à tarde.
O caminho mais curto é fazer a pergunta diretamente. Powerdrill Bloom permite que você trabalhe com seus dados em linguagem natural e retorna uma resposta com sua fonte anexada. A página inicial promete que "cada número retorna com a página, la linha e o dado por trás dele". A partir daí, o mesmo espaço de trabalho pode produzir gráficos, planilhas ou uma breve apresentação.
Vale a pena conhecer duas páginas relacionadas se este for o seu fluxo de trabalho regular. Chat with Database cobre o caminho conversacional para dados estruturados, e Text to SQL cobre o caso em que você deseja a consulta em si. Se a sua entrega chegar como uma exportação simples, a página do CSV AI assistant cobre esse caminho.
Mais uma coisa que o cabeçalho te diz
Como o tamanho da página fica em um deslocamento fixo, você pode aprender algo útil sobre um arquivo antes de abri-lo corretamente. Um banco de dados criado com uma página de 4.096 bytes se comporta de maneira diferente de um criado com páginas de 65.536 bytes. Essa escolha foi feita uma única vez, quando o arquivo foi criado.
Não é um número que você altera casualmente depois. Ele pertence à mesma categoria mental de uma decisão de esquema, e não de uma simples configuração.
Conclusão
Um arquivo SQLite é um banco de dados inteiro em um único artefato. Ele contém uma assinatura de 16 bytes, um tamanho de página registrado no deslocamento 16 e uma pilha de páginas de tamanho fixo que carregam suas tabelas e índices. Ele viaja bem, mantém seus tipos e permanece legível por anos.
Lembre-se da única ressalva com a qual a especificação é cuidadosa. O estado completo geralmente está nesse arquivo. Durante uma transação, parte dele vive em um rollback journal ou em um log de gravação antecipada (write-ahead log) ao lado dele. Verifique a existência do arquivo auxiliar antes de confiar na cópia.
Quando você tiver o arquivo e precisar da resposta em vez do esquema, experimente o Powerdrill Bloom e faça sua pergunta diretamente aos dados.
Perguntas frequentes
Qual é a diferença entre .db, .sqlite e .sqlite3?
Nada estrutural. Todos os três são extensões convencionais para o mesmo formato, e o identificador real é a string de cabeçalho de 16 bytes SQLite format 3\000 no início do arquivo.
Como sei qual tamanho de página um arquivo SQLite usa?
Está registrado no cabeçalho. Um número inteiro de 2 bytes no deslocamento 16 contém o tamanho da página em bytes. Deve ser uma potência de dois entre 512 e 32768, ou o valor 1 representando 65536.
Um arquivo SQLite é o banco de dados completo?
Geralmente, mas nem sempre. A documentação afirma que, durante uma transação, o SQLite mantém informações adicionais em um rollback journal. No modo WAL, essas informações vão para um log de gravação antecipada (write-ahead log).
Posso abrir um arquivo SQLite no Excel?
Não diretamente, porque o arquivo armazena páginas B-tree em vez de linhas de texto. O caminho comum é exportar uma tabela para CSV primeiro, ou usar uma ferramenta que leia o formato do banco de dados e retorne os resultados.
O SQLite é gratuito para uso comercial?
Sim. O SQLite afirma que seu código está em domínio público e é "livre para uso para qualquer finalidade, comercial ou privada".