Introdução
O design do SQL Server implica um mapeamento de um para muitos entre o mecanismo de banco de dados (instância) e os bancos de dados hospedados na instância. Isso significa que você pode implantar vários bancos de dados em uma instância do servidor SQL. De acordo com a documentação da Microsoft, você pode ter até 32.767 bancos de dados em uma única instância do SQL Server. Obviamente, haverá limitações, como os recursos no servidor, gerenciamento de simultaneidade no TempDB, tráfego de rede etc.
Os bancos de dados implantados em uma instância do SQL Server podem ser Bancos de Dados do Sistema ou Bancos de Dados do Usuário. Os bancos de dados do sistema vêm instalados com a instância. Neste artigo, discutiremos a finalidade de cada banco de dados do sistema. Além disso, esclareceremos o que você precisa cuidar ao gerenciar bancos de dados do sistema no SQL Server.
Visão geral dos bancos de dados do sistema
Os bancos de dados do sistema fazem parte de muitos processos que ocorrem quando você instala uma instância do SQL Server. Por padrão, esses bancos de dados são criados nos seguintes caminhos:
%programfiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA
e
%programfiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log
O caminho pode ser diferente. Durante a instalação do SQL Server, você pode especificar a localização dos arquivos do banco de dados do sistema.
Para listar todos os bancos de dados do sistema em uma instância, você pode invocar o código na Listagem 1. A Listagem 2 pode ser usada para determinar a localização dos arquivos de dados associados aos bancos de dados do sistema. Observe que em ambos os scripts, usamos um filtro retornando bancos de dados com database_id de 5 ou superior a 5.
Os bancos de dados essenciais do sistema “visíveis” têm database_ids 1,2,3,4 – eles se referem a master, tempdb, model e msdb, respectivamente. Há também um banco de dados “invisível” chamado banco de dados de recursos e outros bancos de dados do sistema criados quando você habilita recursos como replicação.
-- Listing 1: System Databases
select
name
,database_id
,create_date
,state_desc
,recovery_model_desc
,log_reuse_wait_desc
,physical_database_name
,is_db_chaining_on
,is_broker_enabled
,is_mixed_page_allocation_on
from sys.databases
where database_id<5;
-- Listing 2: System Database Files
select
name
,database_id
,DB_NAME(database_id)
,name
,physical_name
,type_desc
from sys.master_files
where database_id<5;
Figura 1:Bancos de dados do sistema
O banco de dados mestre
O banco de dados mestre é o primeiro banco de dados aberto na inicialização do SQL Server, contendo os seguintes dados:
- Os registros da estrutura/configuração da instância e todos os outros bancos de dados.
- As visualizações de gerenciamento mais dinâmicas necessárias para monitorar a instância.
Assim, possui as informações necessárias para a abertura de todos os outros bancos de dados. É por isso que tem que ser o primeiro a abrir. A questão é como fazê-lo.
Os parâmetros de inicialização do SQL Server contêm duas entradas, que definem os locais dos dados do banco de dados mestre e dos arquivos de log. Os parâmetros de inicialização padrão incluem apenas três linhas – a terceira é o local do arquivo de log de erros. Quando o SQL Server é inicializado, ele deve ser capaz de gravar nesse arquivo de log de erros.
O banco de dados mestre é aberto primeiro. As informações armazenadas no banco de dados mestre, incluindo as configurações definidas usando sp_configure, se aplicam para abrir outros bancos de dados e concluir o processo de inicialização da instância.
Figura 3:parâmetros de inicialização do SQL Server
Há várias maneiras de aprender sobre objetos úteis do sistema SQL Server, como Exibições e Funções de Gerenciamento Dinâmico.
Por exemplo, expanda as visualizações ou nós de programação para o banco de dados mestre no explorador de objetos. Lá, revise os nomes desses objetos e obtenha mais detalhes nos Manuais Online.
Você também pode migrar logins de uma instância para outra. Para isso, restaure um backup do banco de dados mestre para a instância de destino. Descreveremos a técnica específica em um artigo separado.
Figura 4:Navegando em objetos do banco de dados mestre
O banco de dados tempDB
O banco de dados tempDB é responsável pelo armazenamento de dados temporários como resultados intermediários de operações pesadas. Ele pode conter recompilações de índice, versões de linha de bancos de dados configurados com níveis de isolamento e outros recursos que dependem do controle de versão de linha, como READ_COMMITTED_SNAPSHOT.
A maioria das pessoas consideraria o tempDB um potencial gargalo de desempenho, pois as funções de cada banco de dados do usuário em uma instância dependem do tempDB.
Ajustar o tempDB deve ser um exercício deliberado. No entanto, a partir do SQL Server 2016, você pode configurar o tempDB com precisão durante a instalação do SQL Server. Um artigo anterior descreve em detalhes como você deve configurar e monitorar o tempDB.
O banco de dados modelo
Você pode tratar o banco de dados modelo como um modelo. Cada banco de dados de usuário criado em uma instância do SQL Server assume a configuração do banco de dados modelo. Ele tem as mesmas configurações de tamanho e crescimento automático, os mesmos locais de arquivo, etc. No entanto, você pode especificar essas configurações deliberadamente de uma maneira diferente na instrução CREATE DATABASE.
Em essência, se você tiver um aplicativo criando um banco de dados por conta própria com configurações padrão, convém configurar o banco de dados modelo. Isso garante que você tenha algum controle sobre o resultado desses bancos de dados criados automaticamente.
Vamos experimentar um pouco, usando o código da Listagem 3.
-- Listing 3: Using the Model Database
select
name
,database_id
,DB_NAME(database_id) database_name
,name
,physical_name
,type_desc
,size/1024*8 [size (MB)]
,growth/1024*8 [size (MB)]
from sys.master_files
where DB_NAME(database_id)='model' or DB_NAME(database_id) like 'EXP%';
GO
create database EXP_BEFORE;
GO
USE [master]
GO
ALTER DATABASE [model] MODIFY FILE ( NAME = N'modeldev', SIZE = 102400KB , FILEGROWTH = 131072KB )
GO
ALTER DATABASE [model] MODIFY FILE ( NAME = N'modellog', SIZE = 102400KB )
GO
create database EXP_AFTER;
GO
select
name
,database_id
,DB_NAME(database_id) database_name
,name
,physical_name
,type_desc
,size/1024*8 [size (MB)]
,growth/1024*8 [size (MB)]
from sys.master_files
where DB_NAME(database_id)='model' or DB_NAME(database_id) like 'EXP%';
GO
O código executa as seguintes etapas:
- Consulte os sys.master_files para determinar as configurações usadas no banco de dados do modelo
- Criar um banco de dados
- Alterar as configurações de crescimento automático e crescimento do arquivo de banco de dados do modelo
- Criar outro banco de dados
- Consulte sys.master_files para novamente
Preste atenção à frase única para a criação do banco de dados – “CREATE DATABASE”. Desta forma, ele pega as configurações pertencentes ao banco de dados do modelo. Os resultados mostram que na segunda vez que emitimos o comando CREATE DATABASE, o banco de dados EXP_AFTER adquiriu um tamanho de arquivo de 96 GB e crescimento automático de 128 MB (veja a Figura 5).
Figura 5:usando o banco de dados do modelo
Também vale a pena mencionar que nem todas as configurações do banco de dados são selecionadas automaticamente do banco de dados do modelo. Por exemplo, MIXED_PAGE_ALLOCATION definido como OFF quando você cria um novo banco de dados, mesmo que esteja ON no modelo e em outros bancos de dados do sistema.
O banco de dados msdb
Você pode considerar o msdb como um banco de dados do SQL Server Agent. Ele armazena todos os dados relacionados a trabalhos, correio de banco de dados, operadores e automação. Os dados relacionados ao envio de logs de transações, replicação etc. também estão lá. Você pode verificar isso executando conjuntos de consultas na Listagem 4 em sua instância. Por exemplo, objetos relacionados à automação estão presentes no arquivo msdb.
-- Listing 4: Querying msdb Objects
-- Jobs, Alerts, Operators sit in the msdb database ...
select * from msdb..sysjobs
select * from msdb..sysalerts
select * from msdb..sysoperators
select * from msdb..sysmail_allitems
-- ... NOT in the master database
select * from master..sysjobs
select * from master..sysalerts
select * from master..sysoperators
select * from master..sysmail_allitems
Você pode aprender muito sobre objetos em bancos de dados msdb extraindo e investigando-os nos Manuais Online do SQL Server. A abordagem é a mesma do banco de dados mestre.
Você pode migrar trabalhos, operadores etc. de uma instância do SQL Server para outra. Para isso, faça o backup do banco de dados msdb da instância de origem e restaure-o na instância de destino. Trataremos disso em outro artigo.
Epílogo
Neste artigo, fornecemos uma visão geral rápida dos bancos de dados do sistema.
Os bancos de dados do sistema vêm com uma instalação do SQL Server por padrão. Compreender vários bancos de dados do sistema e suas funções é uma excelente ajuda para gerenciar sua instância do SQL Server.
Você pode obter mais informações sobre o que eles armazenam e entender como gerenciá-los em Books Online e outros artigos no CodingSight.
Referências
- Bancos de dados do sistema
- Bancos de dados e armazenamento do MS SQL Server
- Encadeamento de propriedade entre bancos de dados