Pregunta

Tenemos unos cuantos enorme bases de datos (20 GB +) que en su mayoría contienen datos de búsqueda estáticas. Debido a que nuestros ejecuta la aplicación se une contra las tablas de estas bases de datos, tienen que ser parte de cada uno de los desarrolladores de SQL Server local (es decir, que no puede ser alojado en un servidor de base de datos central, compartida).

Estamos pensando en copiar un conjunto canónico de los archivos de base de datos SQL Server reales (* .mdf y .ldf *) y adjuntarlos a la base de datos local de cada desarrollador.

¿Cuál es la mejor manera de descubrir directorio de datos de la instancia local de SQL Server para que podamos copiar los archivos en el lugar correcto? Esto se hará a través de un proceso automatizado, así que tengo que ser capaz de encontrar y utilizarlo desde un script de construcción.

¿Fue útil?

Solución

Depende de si camino predeterminado se define para y ficheros de datos o no.

Si la ruta se establece explícitamente en Properties => Database Settings => Database default locations luego en el servidor SQL almacena en Software\Microsoft\MSSQLServer\MSSQLServer en valores DefaultData y DefaultLog.

Sin embargo, si estos parámetros no se establecen explícitamente, SQL Server utiliza rutas de datos y de registro de la base de datos maestra.

Fuelle es el script que cubre ambos casos. Esto se simplifica versión de la consulta que se ejecuta SQL Management Studio.

Además, tenga en cuenta que yo uso xp_instance_regread en lugar de xp_regread, por lo que este script a trabajar para cualquier instancia, predeterminada o con nombre.

declare @DefaultData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @DefaultData output

declare @DefaultLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @DefaultLog output

declare @DefaultBackup nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @DefaultBackup output

declare @MasterData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output
select @MasterData=substring(@MasterData, 3, 255)
select @MasterData=substring(@MasterData, 1, len(@MasterData) - charindex('\', reverse(@MasterData)))

declare @MasterLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output
select @MasterLog=substring(@MasterLog, 3, 255)
select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - charindex('\', reverse(@MasterLog)))

select 
    isnull(@DefaultData, @MasterData) DefaultData, 
    isnull(@DefaultLog, @MasterLog) DefaultLog,
    isnull(@DefaultBackup, @MasterLog) DefaultBackup

Puede conseguir el mismo resultado utilizando SMO. Abajo es C # muestra, pero se puede utilizar cualquier otro lenguaje .NET o PowerShell.

using (var connection = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
{
    var serverConnection = new ServerConnection(connection);
    var server = new Server(serverConnection);
    var defaultDataPath = string.IsNullOrEmpty(server.Settings.DefaultFile) ? server.MasterDBPath : server.Settings.DefaultFile;
    var defaultLogPath = string.IsNullOrEmpty(server.Settings.DefaultLog) ? server.MasterDBLogPath : server.Settings.DefaultLog;
}

Es mucho más simple en SQL Server 2012 y superior, suponiendo que se haya establecido rutas predeterminadas (que es probablemente siempre una cosa que hay que hacer):

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')

Otros consejos

A pesar de que este es un hilo muy antiguo, me siento como que necesito para aportar una solución simple. En cualquier momento en que usted sabe dónde en Management Studio un parámetro se encuentra que desea acceder a cualquier tipo de script automatizado, la forma más fácil es ejecutar una traza del analizador rápido en un sistema de prueba independiente y capturar lo Management Studio está haciendo en el backend .

En este caso, suponiendo que usted está interesado en encontrar los datos por defecto y ubicaciones registro, puede hacer lo siguiente:

SELECT
SERVERPROPERTY ( 'instancedefaultdatapath') AS [DefaultFile],
SERVERPROPERTY ( 'instancedefaultlogpath') AS [DefaultLog]

Me topé con esta solución en la documentación para la declaración Crear base de datos en la ayuda para SQL Server:

SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1

En la base de datos actual sólo se puede utilizar:

select physical_name from href="http://msdn.microsoft.com/en-us/library/ms174397.aspx" rel="noreferrer"> sys.database_files;

para especificar otra base de datos, por ejemplo, 'Modelo', de uso sys.master_files

select physical_name from sys.master_files where database_id = DB_ID(N'Model');

A partir de SQL Server 2012, puede utilizar la siguiente consulta:

SELECT SERVERPROPERTY('INSTANCEDEFAULTDATAPATH') as [Default_data_path], SERVERPROPERTY('INSTANCEDEFAULTLOGPATH') as [Default_log_path];

(Esto fue tomado de un comentario en http://technet.microsoft.com/en-us /library/ms174396.aspx , y probado.)

Varios componentes de SQL Server (datos, registros, SSAS, SSIS, etc) tienen un directorio predeterminado. El escenario de este se puede encontrar en el registro. Lee más aquí:

http://technet.microsoft.com/ en-us / library / ms143547% 28SQL.90% 29.aspx

Así que si ha creado una base de datos utilizando sólo CREATE DATABASE MyDatabaseName que se crearía en la ruta especificada en una de las configuraciones anteriores.

Ahora, si el administrador / instalador cambió la ruta predeterminada, a continuación, la ruta predeterminada para la instancia se almacena en el registro en

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[INSTANCENAME]\Setup

Si conoce el nombre de la instancia a continuación, puede consultar el registro. Este ejemplo es específico de SQL 2008 -. Hágamelo saber si necesita la ruta SQL2005 así

DECLARE @regvalue varchar(100)

EXEC master.dbo.xp_regread @rootkey='HKEY_LOCAL_MACHINE',
        @key='SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.MSSQLServer\Setup',
        @value_name='SQLDataRoot',
        @value=@regvalue OUTPUT,
        @output = 'no_output'

SELECT @regvalue as DataAndLogFilePath

Cada base de datos se puede crear controlando el sistema de servidor de una su propia ubicación cuando se emite la declaración CREATE DATABASE DBName con los parámetros adecuados. Puede averiguarlo mediante la ejecución de sp_helpdb

exec sp_helpdb 'DBName'

Mantener sencillo:

use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id

esto devolverá todas las bases de datos con los archivos asociados

Desde la GUI:. Abra las propiedades del servidor, vaya a Propiedades de la base , y ver ubicaciones predeterminadas de base de datos

Tenga en cuenta que se puede soltar los archivos de base de datos donde quiera, aunque parece más limpio para mantenerlos en el directorio predeterminado.

Puede encontrar datos por defecto y los lugares de registro para la instancia actual de SQL Server utilizando el siguiente T-SQL:

DECLARE @defaultDataLocation nvarchar(4000)
DECLARE @defaultLogLocation nvarchar(4000)

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'DefaultData', 
    @defaultDataLocation OUTPUT

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'DefaultLog', 
    @defaultLogLocation OUTPUT

SELECT @defaultDataLocation AS 'Default Data Location',
       @defaultLogLocation AS 'Default Log Location'

Pequeño nitpick:. No hay ninguna carpeta de datos, sólo un por defecto carpeta de datos

De todos modos, para encontrarlo, suponiendo que desea instalar por primera instancia predeterminada:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ Setup \ SQLDataRoot

Si hay una instancia con nombre, MSSQL.1 se convierte en algo así como MSSQL10.INSTANCENAME.

La expansión de "bits" salpicado respuesta, aquí es un guión completo que lo hace:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

SET _baseDirQuery=SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) ^
 FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1;
ECHO.
SQLCMD.EXE -b -E -S localhost -d master -Q "%_baseDirQuery%" -W >data_dir.tmp
IF ERRORLEVEL 1 ECHO Error with automatically determining SQL data directory by querying your server&ECHO using Windows authentication.
CALL :getBaseDir data_dir.tmp _baseDir

IF "%_baseDir:~-1%"=="\" SET "_baseDir=%_baseDir:~0,-1%"
DEL /Q data_dir.tmp
echo DataDir: %_baseDir%

GOTO :END
::---------------------------------------------
:: Functions 
::---------------------------------------------

:simplePrompt 1-question 2-Return-var 3-default-Val
SET input=%~3
IF "%~3" NEQ "" (
  :askAgain
  SET /p "input=%~1 [%~3]:"
  IF "!input!" EQU "" (
    GOTO :askAgain
  ) 
) else (
  SET /p "input=%~1 [null]: "
)   
SET "%~2=%input%"
EXIT /B 0

:getBaseDir fileName var
FOR /F "tokens=*" %%i IN (%~1) DO (
  SET "_line=%%i"
  IF "!_line:~0,2!" == "c:" (
    SET "_baseDir=!_line!"
    EXIT /B 0
  )
)
EXIT /B 1

:END
PAUSE

Me he hecho una copia de seguridad restaurar simplemente becuase su fácil control de versiones y soporte. Los índices de referencia necesita especialmente para ser versionado con el fin de saber cuando se comenzó a tomar efecto. Un dettach adjuntar no le dará esa capacidad. También con las copias de seguridad se puede seguir proporcionando copias actualizadas sin tener que cerrar la base de datos.

de Alex respuesta es la correcta, pero para la posteridad aquí hay otra opción: crear una nueva base de datos vacía. Si utiliza CREATE DATABASE sin especificar un directorio de destino que recibe los datos por defecto ... / directorios de registro. Fácil.

En lo personal, sin embargo lo que probablemente sea:

  • Restaurar la base de datos a la PC del desarrollador, en lugar de copiar / unir (copias de seguridad se pueden comprimir, expuesta en un UNC), o
  • Usar un servidor vinculado a evitar hacer esto en primer lugar (depende la cantidad de datos alto unirse a)

ps:. 20gb no es enorme, incluso en 2015. Pero todo es relativo

SELECT DISTINCT dbo.GetDirectoryPath(filename) AS InstanceDataPaths
FROM sys.sysaltfiles WHERE filename like '%.mdf' and filename not like '%\MSSQL\Binn\%'

SELECT DISTINCT dbo.GetDirectoryPath(filename) AS InstanceLogPaths
FROM sys.sysaltfiles WHERE filename like '%.ldf' and filename not like '%\MSSQL\Binn\%'

introducir descripción de la imagen aquí

Puede descargar secuencia de comandos SQL detalle de cómo encontrar el directorio de datos para una instancia de SQL Server

Usted recibirá ubicación predeterminada si la base de datos de usuario mediante esta consulta:

declare @DataFileName nVarchar(500)

declare @LogFileName   nVarchar(500)


set @DataFileName = (select top 1 RTRIM(LTRIM(name)) FROM master.sys.master_files where database_id >4 AND file_id = 1)+'.mdf'
set @LogFileName =   (select top 1 RTRIM(LTRIM(name)) FROM master.sys.master_files where database_id >4 AND file_id = 2)+'.ldf'

select  
( SELECT top 1 SUBSTRING(physical_name, 1, CHARINDEX(@DataFileName, LOWER(physical_name)) - 1) 
FROM master.sys.master_files
WHERE database_id >4 AND file_id = 1) as 'Data File'
,

(SELECT top 1 SUBSTRING(physical_name, 1, CHARINDEX(@LogFileName, LOWER(physical_name)) - 1)
FROM master.sys.master_files
WHERE database_id >4 AND file_id = 2)  as 'Log File'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top