none
Клонирование БД для тестов RRS feed

  • Вопрос

  • Приветствую!

    Подскажите, как правильно создать на том же SQL-сервере клон существующей базы данных для тестирования?

    Через резервные архивные (только для копирования) копии такое не проходит, так как система пытается затронуть файлы данных и журнала транзакций базы данных источника.

    Как правильно и просто сделать клон базы?

    10 июня 2018 г. 4:47

Ответы

  • CREATE DATABASE [Test]
     ON  PRIMARY 
    ( NAME = N'Test', FILENAME = N'S:\MSSQL13.SQL2016\MSSQL\DATA\test.mdf' , SIZE = 3072KB , FILEGROWTH = 65536KB )
     LOG ON 
    ( NAME = N'Test_log', FILENAME = N'S:\MSSQL13.SQL2016\MSSQL\DATA\test.ldf' , SIZE = 3072KB , FILEGROWTH = 65536KB )
    GO

    Commands completed successfully.

    BACKUP DATABASE [Test] TO  DISK = N'Q:\MSSQL13.SQL2016\MSSQL\Backup\Test.bak' WITH NOFORMAT, NOINIT,  NAME = N'Test-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    GO

    Processed 336 pages for database 'Test', file 'Test' on file 1.
    100 percent processed.
    Processed 3 pages for database 'Test', file 'Test_log' on file 1.
    BACKUP DATABASE successfully processed 339 pages in 0.057 seconds (93.869 MB/sec)

    USE [master]
    RESTORE DATABASE [TestClone] FROM  DISK = N'Q:\MSSQL13.SQL2016\MSSQL\Backup\Test.bak' WITH  FILE = 1,  MOVE N'Test' TO N'S:\MSSQL13.SQL2016\MSSQL\DATA\testclone.mdf',  MOVE N'Test_log' TO N'S:\MSSQL13.SQL2016\MSSQL\DATA\testclone.ldf',  NOUNLOAD,  STATS = 5
    GO
    
    100 percent processed.
    Processed 336 pages for database 'TestClone', file 'Test' on file 1.
    Processed 3 pages for database 'TestClone', file 'Test_log' on file 1.
    RESTORE DATABASE successfully processed 339 pages in 0.044 seconds (90.191 MB/sec).


    Проделал, проблем не обнаружил.

    15 июня 2018 г. 9:25

Все ответы

  • Добрый День.

    Как вариант Backup / Restore - не?


    Я не волшебник, я только учусь MCP CCNA. Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Пометить как ответ" или проголосовать "полезное сообщение". Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции работодателя. Вся информация предоставляется как есть без каких-либо гарантий. Блог IT Инженера, Twitter, YouTube, GitHub.

    10 июня 2018 г. 21:57
    Модератор
  • >Через резервные архивные (только для копирования) копии такое не проходит, так как система пытается затронуть файлы данных и журнала транзакций базы данных источника.

    Я говорю, затираются файлы, относящиеся к базу-источнику. Кто сталкивался? Может это вообще баг SQL сервера?

    13 июня 2018 г. 2:29
  • Добрый день! Пытались гуглить?
    13 июня 2018 г. 2:47
  • Мы так и сделали, но черт возьми, это костыль!

    Мне ей богу не понятно, почему когда указывается отличный от оригинала источник данных, задеваются файлы базы данных источник. Но это более чем не логично.

    13 июня 2018 г. 3:35
  • Вся проблема в том, что вам лень прописать правильные пути???
    14 июня 2018 г. 18:26
  • Так и не могу понять в чем проблема собственно?
    Сделайте бэкап, восстановите его в новую базу. В чем проблема?
    14 июня 2018 г. 18:34
  • Так и не могу понять в чем проблема собственно?
    Сделайте бэкап, восстановите его в новую базу. В чем проблема?Добрый День.

    Ранее об этом Автору писали...


    Я не волшебник, я только учусь MCP CCNA. Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Пометить как ответ" или проголосовать "полезное сообщение". Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции работодателя. Вся информация предоставляется как есть без каких-либо гарантий. Блог IT Инженера, Twitter, YouTube, GitHub.

    14 июня 2018 г. 19:08
    Модератор
  • Вы прежде чем это писать, проделайте сами.
    15 июня 2018 г. 2:50
  • CREATE DATABASE [Test]
     ON  PRIMARY 
    ( NAME = N'Test', FILENAME = N'S:\MSSQL13.SQL2016\MSSQL\DATA\test.mdf' , SIZE = 3072KB , FILEGROWTH = 65536KB )
     LOG ON 
    ( NAME = N'Test_log', FILENAME = N'S:\MSSQL13.SQL2016\MSSQL\DATA\test.ldf' , SIZE = 3072KB , FILEGROWTH = 65536KB )
    GO

    Commands completed successfully.

    BACKUP DATABASE [Test] TO  DISK = N'Q:\MSSQL13.SQL2016\MSSQL\Backup\Test.bak' WITH NOFORMAT, NOINIT,  NAME = N'Test-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    GO

    Processed 336 pages for database 'Test', file 'Test' on file 1.
    100 percent processed.
    Processed 3 pages for database 'Test', file 'Test_log' on file 1.
    BACKUP DATABASE successfully processed 339 pages in 0.057 seconds (93.869 MB/sec)

    USE [master]
    RESTORE DATABASE [TestClone] FROM  DISK = N'Q:\MSSQL13.SQL2016\MSSQL\Backup\Test.bak' WITH  FILE = 1,  MOVE N'Test' TO N'S:\MSSQL13.SQL2016\MSSQL\DATA\testclone.mdf',  MOVE N'Test_log' TO N'S:\MSSQL13.SQL2016\MSSQL\DATA\testclone.ldf',  NOUNLOAD,  STATS = 5
    GO
    
    100 percent processed.
    Processed 336 pages for database 'TestClone', file 'Test' on file 1.
    Processed 3 pages for database 'TestClone', file 'Test_log' on file 1.
    RESTORE DATABASE successfully processed 339 pages in 0.044 seconds (90.191 MB/sec).


    Проделал, проблем не обнаружил.

    15 июня 2018 г. 9:25
  • Евгений, мы говорим про работу с помощью средств Microsoft SQL Server Management Studio, которая при заливки архива в новую базу требует переименовывать файлы журнала и базы данных.
    28 июня 2018 г. 9:29
  • Мы так и сделали, но черт возьми, это костыль!

    Мне ей богу не понятно, почему когда указывается отличный от оригинала источник данных, задеваются файлы базы данных источник. Но это более чем не логично.


    NTFS не позволяет хранить в пределах одной директории два файла с одинаковым название.

    Что тут не понятного?

  • Так названия файлов меняешь, это не помогает, причем в 2012 все работает.

    Создать дополнительную директорию? Просто хотелось услышать ответ непосредственно специалиста от Микрософта, чтобы его не подвергать сомнению.

    4 июля 2018 г. 10:50
  • Все прекрасно работает, если изменить названия файлов.

    Выполните код для создания базы (подставив актуальные пути):

    CREATE DATABASE [Test]
     ON  PRIMARY 
    ( NAME = N'Test', FILENAME = N'S:\MSSQL13.SQL2016\MSSQL\DATA\test.mdf' , SIZE = 3072KB , FILEGROWTH = 65536KB )
     LOG ON 
    ( NAME = N'Test_log', FILENAME = N'S:\MSSQL13.SQL2016\MSSQL\DATA\test.ldf' , SIZE = 3072KB , FILEGROWTH = 65536KB )
    GO

    Сделайте бэкап базы. Далее в SMS заполните окно восстановления базы и сгенерируйте код. После этого выложите сюда сгенерированный код. 

    Не хотите так: делайте скриншоты (так чтобы было видно пути и имена файлов)


    4 июля 2018 г. 12:21
  • Так названия файлов меняешь, это не помогает, причем в 2012 все работает.

    Создать дополнительную директорию? Просто хотелось услышать ответ непосредственно специалиста от Микрософта, чтобы его не подвергать сомнению.

    не судьба тут услышать официальную позицию, так как форум - место помощи силами сообщества.

    The opinion expressed by me is not an official position of Microsoft

    4 июля 2018 г. 12:31
    Модератор
  • В общем, проделал аналогичным образом:

    BACKUP DATABASE [dbOmega1] TO  DISK = N'C:\Omega\SQL\Omega1_20180705-1526.bak' WITH NOFORMAT, NOINIT,  NAME = N'dbOmega1-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    GO

    10 проц. обработано.
    20 проц. обработано.
    30 проц. обработано.
    40 проц. обработано.
    50 проц. обработано.
    60 проц. обработано.
    70 проц. обработано.
    80 проц. обработано.
    90 проц. обработано.
    Обработано 368432 страниц для базы данных "dbOmega1", файл "OMEGA" для файла 1.
    100 проц. обработано.
    Обработано 3 страниц для базы данных "dbOmega1", файл "OMEGA_log" для файла 1.
    BACKUP DATABASE успешно обработал 368435 страниц за 89.392 секунд (32.199 MБ/сек).

    USE [master]
    --BACKUP LOG [dbOmega1]
    --	TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\dbOmega1_LogBackup_2018-07-06_15-31-00.bak' WITH NOFORMAT,
    --	NOINIT,
    --	NAME = N'dbOmega1_LogBackup_2018-07-06_15-31-00',
    --	NOSKIP,
    --	NOREWIND,
    --	NOUNLOAD,
    --	NORECOVERY,
    --	STATS = 5
    RESTORE DATABASE [dbOmegaTest]
    	FROM  DISK = N'C:\Omega\SQL\Omega1_20180705-1526.bak' WITH  FILE = 1,
    	MOVE N'OMEGA' TO N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\dbOmegaTest.mdf',
    	MOVE N'OMEGA_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\dbOmegaTest_log.ldf',
    	NOUNLOAD,
    	STATS = 5
    GO

    5 проц. обработано.
    10 проц. обработано.
    15 проц. обработано.
    20 проц. обработано.
    25 проц. обработано.
    30 проц. обработано.
    35 проц. обработано.
    40 проц. обработано.
    45 проц. обработано.
    50 проц. обработано.
    55 проц. обработано.
    60 проц. обработано.
    65 проц. обработано.
    70 проц. обработано.
    75 проц. обработано.
    80 проц. обработано.
    85 проц. обработано.
    90 проц. обработано.
    95 проц. обработано.
    100 проц. обработано.
    Обработано 368432 страниц для базы данных "dbOmegaTest", файл "OMEGA" для файла 1.
    Обработано 3 страниц для базы данных "dbOmegaTest", файл "OMEGA_log" для файла 1.
    RESTORE DATABASE успешно обработал 368435 страниц за 222.164 секунд (12.956 MБ/сек).

    Но как только выполняешь сценарий, предлагаемый утилитой восстановления:

    USE [master]
    BACKUP LOG [dbOmega1]
    	TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\dbOmega1_LogBackup_2018-07-06_15-31-00.bak' WITH NOFORMAT,
    	NOINIT,
    	NAME = N'dbOmega1_LogBackup_2018-07-06_15-31-00',
    	NOSKIP,
    	NOREWIND,
    	NOUNLOAD,
    	NORECOVERY,
    	STATS = 5
    RESTORE DATABASE [dbOmegaTest]
    	FROM  DISK = N'C:\Omega\SQL\Omega1_20180705-1526.bak' WITH  FILE = 1,
    	MOVE N'OMEGA' TO N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\dbOmegaTest.mdf',
    	MOVE N'OMEGA_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\dbOmegaTest_log.ldf',
    	NOUNLOAD,
    	STATS = 5
    GO
    


    Так сразу обе базы переходят в режим восстановления:

    И после восстановления тестовой базы, рабочая остаётся висеть:

    6 проц. обработано.
    10 проц. обработано.
    17 проц. обработано.
    20 проц. обработано.
    27 проц. обработано.
    31 проц. обработано.
    38 проц. обработано.
    41 проц. обработано.
    45 проц. обработано.
    52 проц. обработано.
    55 проц. обработано.
    62 проц. обработано.
    65 проц. обработано.
    72 проц. обработано.
    76 проц. обработано.
    83 проц. обработано.
    86 проц. обработано.
    90 проц. обработано.
    97 проц. обработано.
    100 проц. обработано.
    Обработано 3686 страниц для базы данных "dbOmega1", файл "OMEGA_log" для файла 1.
    BACKUP LOG успешно обработал 3686 страниц за 0.879 секунд (32.756 MБ/сек).
    5 проц. обработано.
    10 проц. обработано.
    15 проц. обработано.
    20 проц. обработано.
    25 проц. обработано.
    30 проц. обработано.
    35 проц. обработано.
    40 проц. обработано.
    45 проц. обработано.
    50 проц. обработано.
    55 проц. обработано.
    60 проц. обработано.
    65 проц. обработано.
    70 проц. обработано.
    75 проц. обработано.
    80 проц. обработано.
    85 проц. обработано.
    90 проц. обработано.
    95 проц. обработано.
    100 проц. обработано.
    Обработано 368432 страниц для базы данных "dbOmegaTest", файл "OMEGA" для файла 1.
    Обработано 3 страниц для базы данных "dbOmegaTest", файл "OMEGA_log" для файла 1.
    RESTORE DATABASE успешно обработал 368435 страниц за 212.838 секунд (13.523 MБ/сек).

    Не создавать резервную копию журнала транзакций?