Estou migrando um banco de dados do SQL Server 2019 para o SQL Server 2017. Para isso, estou utilizando o recurso "Gerar scripts" no banco de dados de origem para gerar o esquema e os dados separadamente. (Provavelmente precisarei dividir a importação de dados em vários arquivos para evitar erros de memória.)
Quando tento executar o script de esquema no servidor de destino, o script falha com esta resposta:
Msg 5133, Level 16, State 1, Line 4
Directory lookup for the file "E:\SqlData\my-db-test.mdf" failed with the operating system error 21(The device is not ready.).
Nenhuma das instruções que vi menciona a necessidade de copiar esse arquivo .mdf do servidor de origem para o destino, mas parece que o servidor de destino espera que o arquivo esteja presente. O início do script é assim:
USE [master]
GO
/****** Object: Database [my-db-test] Script Date: 2/9/2024 8:14:49 AM ******/
CREATE DATABASE [my-db-test]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'my-db-dev8b', FILENAME = N'E:\SqlData\my-db-test.mdf' , SIZE = 794624KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'my-db-dev8b_log', FILENAME = N'E:\SqlData\my-db-test_log.ldf' , SIZE = 5971968KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [my-db-test] SET COMPATIBILITY_LEVEL = 140
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
Preciso copiar os arquivos .mdf e .ldf do servidor de origem para o destino para executar este script? É possível alterar o script para não precisar do arquivo .ldf?
Não sei por que o script faz referência a my-db-dev8b, que é um nome antigo para o banco de dados. Não sei se esses nomes antigos no roteiro vão complicar as coisas.
Os arquivos .mdf e .ldf são necessários para migrar o banco de dados do SQL Server 2019 para o SQL Server 2017? Posso ajudar minha causa editando manualmente o script de alguma forma?
Parece que eu só precisava que E:\SqlData estivesse presente no novo servidor. Depois de criar o diretório necessário, consegui executar o script e os arquivos .mdf e .ldf foram gerados automaticamente.
No meu caso, não há unidade E no servidor de destino, então criei o diretório SqlData em minha unidade D e editei o script para fazer referência a D:\SqlData:
Criar banco de dados criará os arquivos referenciados, mas a estrutura de pastas deve existir e ser gravável.
Você pode verificar os locais através das propriedades do servidor (ou da GUI)
Consulte https://learn.microsoft.com/en-us/sql/t-sql/functions/serverproperty-transact-sql?view=sql-server-ver16
Para bancos de dados futuros, você pode alterar o local padrão (se tiver permissão) através das propriedades do servidor (Configurações do banco de dados) ou gravando o registro:
Isso exigirá uma reinicialização para ativar a nova configuração.
Observe que isso afeta apenas o padrão usado na GUI. A criação de scripts de banco de dados ainda exigirá um caminho totalmente qualificado.