AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 259510
Accepted
Ronaldo
Ronaldo
Asked: 2020-02-13 04:25:59 +0800 CST2020-02-13 04:25:59 +0800 CST 2020-02-13 04:25:59 +0800 CST

É possível que master, tempdb, model e msdb tenham um database_id diferente de 1,2,3,4 respectivamente?

  • 772

Bancos de dados do sistema SQL Server , que eu saiba, sempre possuem esses mesmos IDs e já vi muitos scripts de manutenção na internet contando com o predicado WHERE database_id > 4para excluí-los das ações do script.

Além disso, se eu executar SELECT name, schema_id FROM sys.schemas;em um novo banco de dados de usuário, recebo:

name                 schema_id
dbo                  1
guest                2
INFORMATION_SCHEMA   3
sys                  4
db_owner             16384
db_accessadmin       16385
db_securityadmin     16386
db_ddladmin          16387
db_backupoperator    16389
db_datareader        16390
db_datawriter        16391
db_denydatareader    16392
db_denydatawriter    16393

Executei essa consulta em duas instâncias diferentes, uma no SQL Server 2016 e a outra no SQL Server 2005, e ambas retornaram o mesmo resultado.

Perguntas:

  1. Existe alguma situação (ou versão do sql server) em que os bancos de dados do sistema master, tempdb, model e msdb teriam um database_id diferente de 1,2,3,4 respectivamente?
  2. Posso realmente confiar no fato de que os esquemas listados sempre terão os mesmos IDs em qualquer instância do SQL Server para que eu possa escrever scripts de manutenção com base nesses IDs?
sql-server system-databases
  • 3 3 respostas
  • 1295 Views

3 respostas

  • Voted
  1. Best Answer
    Randi Vertongen
    2020-02-13T05:01:07+08:002020-02-13T05:01:07+08:00

    Em teoria

    As ações abaixo são apenas para fins de teste. Não tente nada disso se você não estiver bem com sua instância de banco de dados se tornando inutilizável, sem resposta e/ou seus dados sendo perdidos

    Desanexar o masterbanco de dados para tentar reutilizar seu database_id não é possível.

    A desanexação model resultará na falha da instância e você não poderá anexá-la novamente. Isso resulta na necessidade de reconstruir todos os bancos de dados do sistema . Este processo remove todas as informações como logins, trabalhos, .... E seus bancos de dados de usuários são desanexados.

    Desanexar Tempdbpara tentar reutilizar seu database_id, anexando-o novamente com um nome diferente, resultou no database_id 2 não sendo reutilizado e tempdbnão funcionando.

    name    database_id
    master  1
    model   3
    msdb    4
    test3_2__   5
    test3_2_    6
    tempdb  7
    

    Consegui alterar o nome de volta para tempdb, mas a instância estava bastante confusa e não consegui iniciá-la normalmente.

    Não foi possível encontrar o ID 2 do banco de dados. O banco de dados pode ainda não estar ativado ou estar em transição. Emita novamente a consulta assim que o banco de dados estiver disponível.

    ---> Reconstrua todos os bancos de dados do seu sistema .

    Mas, em teoria , existem 2 (ou mais) opções para alterar o msdbID do banco de dados do sistema:

    Você pode alterar o msdbID do banco de dados desanexando msdb, criando um novo banco de dados de usuário e, finalmente, criando um novo msdbbanco de dados enquanto segue as etapas documentadas para criar um novo banco de dados msdb .

    Você pode alterar o msdbid do banco de dados desanexando msdb, reanexando-o com um nome diferente e alterando o nome de volta para msdb. NÃO SUPORTADO, por favor, não faça isso

    Primeiro inicie o servidor sql no 'modo de recuperação somente mestre'

    NET START MSSQL$InstanceName /f /T3608"
    

    Desanexar msdb e criar um novo banco de dados

    EXEC sp_detach_db msdb;
    GO
    CREATE DATABASE test3;
    GO
    

    Altere os nomes dos arquivos msdb, reinicie a instância normalmente

    Inicialize o msdb:

    SQLCMD -E -S<servername> -i"C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Install\instmsdb.sql" -o"C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Install\instmsdb.out"£
    

    Veja os IDs do banco de dados:

    SELECT name,database_id 
    FROM sys.Databases;
    
    name    database_id
    master  1
    tempdb  2
    model   3
    test3   4
    ...
    msdb    12
    

    Método não compatível

    Os 2 procedimentos normais de anexação sp_attach_dbe create database ... for attachnão funcionam ao tentar anexar msdb.

    Mensagem de erro:

    As opções de banco de dados FILESTREAM não podem ser definidas em bancos de dados do sistema, como 'msdb

    O que você pode fazer, apenas para fins de teste, é criar um banco de dados de usuários,msdb2

    CREATE DATABASE msdb2  
        ON (FILENAME = N'X:\MSSQL\DATA\MSDBData.mdf'),   
        (FILENAME = N'X:\MSSQL\DATA\MSDBLog.ldf')   
        FOR ATTACH;  
    

    Renomeie o banco de dados paramsdb

    ALTER DATABASE msdb2 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    ALTER DATABASE msdb2 MODIFY NAME = msdb ;
    GO  
    ALTER DATABASE msdb SET MULTI_USER
    

    Reinicie a instância normalmente

    NET STOP MSSQL$InstanceName
    NET START MSSQL$InstanceName
    

    e veja o database_id's:

    SELECT name, database_id 
    FROM sys.databases;
    

    Resultado

    name    database_id
    master  1
    tempdb  2
    model   3
    test    4
    ...
    msdb    10
    

    Na prática

    Felizmente, não vi isso em nenhum lugar, mas database_id 4 poderia, em teoria, ser reutilizado por bancos de dados de usuários. Se isso acontecesse, filtrar os bancos de dados do sistema em minhas consultas provavelmente seria o menor dos meus problemas.

    Dito isto, usar WHERE DB_NAME(database_id) NOT IN ('master','tempdb','model','msdb','distribution','ssisdb')é a escolha certa.

    • 16
  2. AMtwo
    2020-02-13T04:46:49+08:002020-02-13T04:46:49+08:00

    Praticamente falando, esses IDs serão os mesmos para todas as versões atualmente lançadas do SQL Server.

    Observe que os bancos de dados distribution& SSISDBtambém são bancos de dados do sistema, mas não terão um database_id previsível.

    No entanto, não há garantias de que este será sempre o caso, ou que continuará a ser o caso no futuro. A Microsoft não fornece documentação nem garante que esses IDs sejam sempre os mesmos. Há garantias de que alguém entrou em um banco de dados e mexeu com esses esquemas de sistema.

    Na próxima versão do SQL Server, a equipe do Produto pode decidir fazer uma alteração no esquema de números de identificação. Essa alteração pode ser retroportada para versões existentes em um Service Pack ou atualização cumulativa.

    Isso pode ser improvável em um futuro próximo, então você pode não se preocupar com isso. Mas se você escrever um código incrível, seu código ainda poderá estar em uso daqui a uma ou duas décadas, quando isso acontecer. E então, seus sucessores terão um ninho de rato para desembaraçar, e seu código deixará de ser "código incrível".

    Alterações futuras à parte, o código que depende de valores de ID enigmáticos e codificados não é legível. Nem todo mundo sabe que isso schema_id > 16384indica uma série de esquemas especiais. (Estou usando o SQL Server desde a virada do século e ficaria confuso com essa linha de código.)

    Faça com que seu código seja lido como prosa e você terá um código melhor e mais sustentável.

    • 10
  3. FreeText
    2020-02-13T13:34:40+08:002020-02-13T13:34:40+08:00

    Esses bancos de dados são criados na instalação e são especificados como 1,2,3,4 conforme você escreveu. Você sempre pode quebrar um sistema se interferir nele, e a Microsoft pode alterar esses bancos de dados, tanto em IDs quanto em propósito. A MS pode criar um segundo modelbanco de dados para diferentes propósitos chamado model2, ou adicionar um segundo tempdbbanco de dados para dividir diferentes tipos de tabelas temporárias ou por qualquer motivo.

    Meu conselho é: tenha certeza de que nas versões atuais do SQL Server esses IDs de banco de dados são consistentes (na instalação). Eu também nunca os vi de outra forma. Se você está particularmente preocupado ou simplesmente não consegue se livrar dessa sensação incômoda, verifique esses fatos no início do seu programa/script, especificamente ID # = db name string.

    Gosto de rastrear as suposições que faço no código enquanto o escrevo. Para código interno, essas suposições de nome e ID do banco de dados são bastante seguras. Para clientes externos, prefiro verificar tudo. Isso ajuda a) tirar isso da sua cabeça, seja essa suposição de nome/ID do banco de dados ou outra coisa, eb) se uma dessas suposições quebrar, você poderá encontrá-la muito rapidamente. Poupa muitos arranhões na cabeça e é reconfortante saber com o que você pode contar.

    Quando você acertar essas perguntas, apenas verifique e siga em frente (embora não haja mal nenhum em postar a pergunta também, como você fez). Dessa forma, seu tempo é melhor gasto em questões reais e você pode limpar sua cabeça dessas perguntas irritantes. E dá confiança quando as coisas falham, não é uma dessas perguntas verificadas.

    Nesse caso específico, nunca senti a necessidade de verificar esses IDs de banco de dados; Eu sempre os acessei por meio de sua funcionalidade, não diretamente. No entanto, se eu estivesse escrevendo um script para operar nesses bancos de dados, sabendo que as ramificações poderiam ser graves se o ambiente não fosse o que eu esperava, eu definitivamente verificaria minhas suposições.

    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve