Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Частичное восстановление БД  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32003
Блог
Коллеги,

Есть несколько больших баз (в общей сложности около 15 Тб) на 2014 сервере. Все большие таблицы там секционированы. Базы периодически нужно восстанавливать в DEV-TEST-средах. Это крайне долго, поэтому хотелось бы существенно сократить время восстановления, заодно сэкономить на месте.

У ФГ, которые содержат старые данные, есть возможность проставить признак "только чтение".

Можно ли восстановить только свежие ФГ, "забыв" про старые?
В тестовом примере ниже архивная ФГ у меня получает статус RECOVERY_PENDING или DEFUNCT, но есть ли возможность от нее вообще избавиться? Желательно без шаманства с перезапуском MS SQL и админского коннекта.

ps вариант восстановить и шринкануть не подходит, т.к. шринк будет выполняться неделями,
вариант с перекачкой данных тоже нежелателен, т.к. базы очень активно меняются-дорабатываются

+

CREATE DATABASE [test]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'test', FILENAME = N'E:\MSSQL\test.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB ), 
 FILEGROUP [ARCH] 
( NAME = N'test_arch', FILENAME = N'E:\MSSQL\test_arch.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'test_log', FILENAME = N'E:\MSSQL\test_log.ldf' , SIZE = 2048KB , FILEGROWTH = 10%)
GO


use [test]
GO
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS1  
AS PARTITION myRangePF1  
TO ([ARCH], [ARCH], [ARCH], [PRIMARY]);  
GO

create table dbo.test_table (a int)

create clustered index CIX on dbo.test_table (a)
ON myRangePS1 (a);

insert into dbo.test_table
select 0 union all 
select 50 union all 
select 500 union all 
select 5000


ALTER DATABASE [test] MODIFY FILEGROUP [ARCH] READONLY


use test
go
SELECT PA.OBJECT_ID, FG.name,*
FROM sys.filegroups FG
    INNER JOIN sys.allocation_units AU ON AU.data_space_id = FG.data_space_id
    INNER JOIN sys.partitions PA ON PA.partition_id = AU.container_id
WHERE PA.OBJECT_ID = OBJECT_ID('dbo.test_table')


BACKUP DATABASE [test] TO  DISK = N'Z:\test.bak'
WITH NOFORMAT, NOINIT, 
NAME = N'test-Full Database Backup', SKIP, NOREWIND, NOUNLOAD
GO

use [master]
go
RESTORE DATABASE [test_part] 
FILEGROUP = N'PRIMARY'
FROM  DISK = N'Z:\test.bak'
WITH  FILE = 1,
  MOVE N'test' TO N'Z:\test_part.mdf',
  MOVE N'test_arch' TO N'Z:\test_part_0.ndf',
  MOVE N'test_log' TO N'Z:\test_part_1.ldf',  NOUNLOAD,  REPLACE,  STATS = 10
GO

use [test_part]
go
select * from [dbo].[test_table]

-- ARCH в RECOVERY_PENDING
SELECT 
 f.name file_group, 
 d.name file_name, 
 d.state_desc file_state
FROM sys.filegroups f
JOIN sys.database_files d
 ON f.data_space_id = d.data_space_id;
GO



USE [test_part]
GO
ALTER DATABASE [test_part]  REMOVE FILE [test_arch]
GO
ALTER DATABASE [test_part] REMOVE FILEGROUP [ARCH]
GO


-- ARCH в DEFUNCT
SELECT 
 f.name file_group, 
 d.name file_name, 
 d.state_desc file_state
FROM sys.filegroups f
JOIN sys.database_files d
 ON f.data_space_id = d.data_space_id;
GO
30 окт 17, 20:50    [20913545]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Col
Member

Откуда: Торонто
Сообщений: 174
Критик
Да можно бакапить/восстанавливать на уровне файловых групп.
Приймары файловоая группа ваосстанавливается первой, т.е. праймару не может быть частью честичного восстановления.
Вот дока:
https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/back-up-files-and-filegroups-sql-server
30 окт 17, 21:19    [20913623]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32003
Блог
Col,

я и хочу восстановить только PRIMARY, а о остальных забыть,
а вот забыть не получается
30 окт 17, 22:34    [20913804]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Col
Member

Откуда: Торонто
Сообщений: 174
Критик
Ну ежели совсем забыть :)
В 2016 появилась возможность транкейтить по партишрнам.
Ну и кроме того мне непонятно почему после полного восстановления нельзя переместить "ненужные" группы в отдельные таблицы и уже их трнконуть?
PTF тут самое то:
https://ptf.codeplex.com/
30 окт 17, 22:52    [20913835]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32003
Блог
Col,

все это потребует длительного шринка, который не закончится до момента следующего восстановления базы
30 окт 17, 22:59    [20913844]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
andrey odegov
Member

Откуда:
Сообщений: 460
Piecemeal Restores?
30 окт 17, 23:08    [20913856]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Критик,
Наверное, на все подобные секционированные таблицы можно сделать дубликаты с такой же схемой, переключить все секции кроме PRIMARY, занулить и удалить, потом грохнуть схему секционирования - и удалени FG уже пройдет безболезненно.

create table dbo.test_table_double (a int)

create clustered index CIX_double on dbo.test_table_double (a)
ON myRangePS1 (a);

// ARCH], [ARCH], [ARCH], [PRIMARY]
ALTER TABLE dbo.test_table SWITCH PARTITION 1 TO dbo.est_table_double
ALTER TABLE dbo.test_table SWITCH PARTITION 2 TO dbo.est_table_double
ALTER TABLE dbo.test_table SWITCH PARTITION 3 TO dbo.est_table_double
truncate table dbo.test_table_double
drop table dbo.test_table_double
drop index CIX on dbo.test_table

create clustered index CIX on dbo.test_table (a) ON PRIMARY
// now already only rows in PRIMARY, this rows in this place, nothing move

drop PARTITION SCHEME myRangePS1 // NOW in FG is nothing


ALTER DATABASE [test_part] REMOVE FILE [test_arch]
GO
ALTER DATABASE [test_part] REMOVE FILEGROUP [ARCH]
GO
30 окт 17, 23:14    [20913864]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Критик,
Не уверен, что прокатит переключение секций, которые попадают в FG в состояние RECOVERY_PENDING. Но если недостающие строки как бы улетят в таблицу аналогичной структуры, за исключением PRIMARY, а потом новую таблицу удаляем - то в старой остаются в явном виде только строки из PRIMARY и drop/create кластерного должен пройти нормально.
В общем, нужно экспериментировать.
30 окт 17, 23:19    [20913868]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Col
Member

Откуда: Торонто
Сообщений: 174
Критик
Col,

все это потребует длительного шринка, который не закончится до момента следующего восстановления базы

Какой шриньк?
Слайд в сторону, транкейт, удаление файлов и группы если надо.
Все делается за одну секунду.
Или у Вас там "коктейль молотова" из разных партишен функций смотрящих на разные группы?
31 окт 17, 02:41    [20914009]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
nvv
Member

Откуда:
Сообщений: 54
Критик, восстановление только первичной группы прямо в новую базу
RESTORE database NewDatabase filegroup = 'PRIMARY' FROM disk = 'C:\backup\PRIMARY.bak' with RECOVERY;
работает замечательно. База доступна, за исключением файловых групп.

А вот как восстановить в новую базу часть групп, но не только первичную (например, Primary + FG1) - никак не пойму. Возможно ли это вообще???
Или вторичная группа не выводится из восстановления или вся база (
Прошу помощи зала в этом вопросе.
21 янв 18, 18:45    [21124627]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
sdgfyhku
Guest
http://download.microsoft.com/download/d/9/4/d948f981-926e-40fa-a026-5bfcf076d9b9/PartialDBAvailability.doc
22 янв 18, 09:22    [21125384]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
nvv
Member

Откуда:
Сообщений: 54
sdgfyhku, вас ист дас? тоже самое по-русски есть?

Пробежал глазами - не нашел чтобы был разобран случай восстановления отдельных группы в новую базу.
Рассматривается только восстановление битых файлов в текущей базе.
22 янв 18, 16:09    [21127595]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
sdgfyhku
Guest
http://www.itprotoday.com/microsoft-sql-server/avoiding-query-errors-partial-database-availability
22 янв 18, 17:42    [21127979]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
nvv
Member

Откуда:
Сообщений: 54
sdgfyhku, фантастика. То что нужно. Все получилось. Спасибо.
22 янв 18, 17:58    [21128014]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Частичное восстановление БД  [new]
Kuzen
Member

Откуда:
Сообщений: 2
nvv,

Прошу прощения, что поднимаю старую тему. Вам какая из ссылок помогла?
По последней, это восстановить 2 группы. Я пытаюсь восстановить, только Primary.
И у меня в этом случае

name state_desc
Secondary RECOVERY_PENDING

Я уже всю голову сломал. Нужно разбить пром среду на 2 файла и для разрабов разворачиать только Primary.
Разбить получается, путем переноса данных в новую табл. А вот Restore, нет.

В принципе, Secondary можно и удалить, таблицы из этой группы я могу и пустыми Create.
13 авг 19, 17:46    [21948456]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
Kuzen
Member

Откуда:
Сообщений: 2
Трое суток не прошли даром!
Просто нужно дать команду, вывести в работу файловую группу...

RESTORE DATABASE DB FILEGROUP = 'Secondary' WITH RECOVERY

Хоть бы где про это написано... в одном месте только нашел.
14 авг 19, 13:26    [21949175]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить