Как переименовать физические файлы базы данных - PullRequest
8 голосов
/ 21 января 2011

Я использовал tsql для отсоединения базы данных следующим образом:

EXEC sp_detach_db @dbname = 'my_db'

Затем я использовал PHP для переименования физических файлов.Мне удалось переименовать файл mdf, но не файл ldf!Я даже попробовал команду dos REN, но она не сработала и для файла ldf!

Я хотел спросить, есть ли что-то особенное в физических файлах журнала, которые позволяют его не переименовывать?

Есть ли лучший способ сделать это?

Спасибо всем

Ответы [ 5 ]

10 голосов
/ 29 августа 2015

Отсоедините базу данных, переименуйте файлы, присоедините ее снова.

9 голосов
/ 21 января 2011

Вы можете сделать это, используя оператор ALTER DATABASE, например:

ALTER DATABASE database_name
   MODIFY FILE ( NAME = logical_file_name, 
                 FILENAME = ' new_path/os_file_name_with_extension ' )

Вам необходимо изменить каждый файл отдельно, например, если у вас есть несколько файлов данных, вам нужно изменить каждый из них.

Подробнее см. В документации Technet по этой теме .

8 голосов
/ 27 июня 2013

Команда «Изменить файл базы данных (ваша база данных) MODIFY FILE» будет переименовывать только логические имена.В этом посте показано, как использовать xp_cmdshell для переименования физических файлов: http://www.mssqltips.com/sqlservertip/1891/best-practice-for-renaming-a-sql-server-database/

Обратите внимание на следующее:
1. xp_cmdshell будет выполняться под пользователем, от имени которого запускается процесс SQL Server, и можетне имеют разрешений файловой системы, необходимых для переименования файлов базы данных
2. В целях безопасности не забудьте отключить xp_xmdshell

Ниже приведен пример того, как переименование может быть выполнено на основе упомянутого сообщения в блоге.Он заменит базу данных MyDB на базу данных NewMyDB.Исходная MyDB (переименованная в MyDB_OLD) будет оставлена ​​отсоединенной.

-- Enable xp_cmdshell:
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

-- Get physical file names:
declare @MyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB')
declare @MyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB_log')
declare @NewMyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB')
declare @NewMyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB_log')
declare @Command nvarchar(500)
declare @Sql nvarchar(2000)

IF (EXISTS (select * from sys.databases where name = 'NewMyDB') 
AND EXISTS (select * from sys.databases where name = 'MyDB'))
BEGIN
    USE master

    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    ALTER DATABASE NewMyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

        -- Set new database name
        ALTER DATABASE MyDB MODIFY NAME = MyDB_OLD
        ALTER DATABASE NewMyDB MODIFY NAME = MyDB

        -- Update logical names
        ALTER DATABASE MyDB_OLD MODIFY FILE (NAME=N'MyDB', NEWNAME=N'MyDB_OLD')
        ALTER DATABASE [MyDB] MODIFY FILE (NAME=N'NewMyDB', NEWNAME=N'MyDB')

        EXEC master.dbo.sp_detach_db @dbname = N'MyDB_Old'
        EXEC master.dbo.sp_detach_db @dbname = N'MyDB'

        -- Rename physical files
        SET @Command = 'RENAME "' + @MyDBOriginalFileName + '" "MyDB_OLD.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @MyDBLogOriginalFileName + '" "MyDB_OLD_log.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @NewMyDBOriginalFileName + '" "MyDB.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @NewMyDBLogOriginalFileName + '" "MyDB_log.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command

        -- Attach with new file names
        declare @NewMyDBFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB',  'MyDB')
        declare @NewMyDBLogFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB_log',  'MyDB_log')
        SET @Sql = 'CREATE DATABASE MyDB ON ( FILENAME = ''' + @NewMyDBFileNameAfterRename + '''), ( FILENAME = ''' + @NewMyDBLogFileNameAfterRename + ''') FOR ATTACH'
        PRINT @Sql
        EXEC (@Sql)

    ALTER DATABASE MyDB SET MULTI_USER 

END

-- Disable xp_cmdshell for security reasons:
GO
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
GO
3 голосов
/ 13 ноября 2018
  1. Архивация исходной базы данных
  2. Удаление исходной базы данных
  3. Восстановление исходной базы данных из резервной копии, но с другим именем;файлы восстановленной базы данных также будут автоматически именоваться с учетом имени новой базы данных.
3 голосов
/ 25 ноября 2016

Самый простой способ переименовать SQL server physical database files это:

  1. Откройте и подключитесь к SQL server, где находится база данных, которую вы хотите переименовать.
  2. Выполните следующий скрипт в окне запроса, чтобы изменить физические и логические имена. Не забудьте заменить все "OldDatabaseName" новым именем базы данных ("NewDatabaseName"), на которую вы хотите изменить ее имя. Замените все NewDatabaseName новым именем, которое вы хотите установить для своей базы данных

use OldDatabaseName

ALTER DATABASE OldDabaseName MODIFY FILE (NAME='OldDatabaseName', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName.mdf');

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME='OldDatabaseName_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName_log.ldf');

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName, NEWNAME = NewDatabaseName);
ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName_log, NEWNAME = NewDatabaseName_log);
  1. А затем щелкните правой кнопкой мыши на OldDatabaseName, выберите Tasks, а затем выберите Take Offline

  2. Перейдите в местоположение (C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\...), где находятся физические файлы, и переименуйте их в NewDatabaseName, указанное в номере 2. Не забудьте проверить абсолютный путь к этим файлам, который будет использоваться на вашем компьютере.
  3. Вернитесь к Microsoft SQL Server Management Studio. Щелкните правой кнопкой мыши на OldDatabaseName, выберите Tasks, а затем выберите Bring Online.
  4. Наконец, продолжайте и переименуйте ваш OldDatabaseName в NewDatabaseName. Вы сделали: -)
...