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

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

Есть несколько больших баз (в общей сложности около 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

Откуда: Торонто
Сообщений: 177
Критик
Да можно бакапить/восстанавливать на уровне файловых групп.
Приймары файловоая группа ваосстанавливается первой, т.е. праймару не может быть частью честичного восстановления.
Вот дока:
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

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

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

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

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

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

Откуда:
Сообщений: 461
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

Откуда: Торонто
Сообщений: 177
Критик
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]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
ApXyC
Member

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

RESTORE DATABASE DB FILEGROUP = 'Secondary' WITH RECOVERY

Хоть бы где про это написано... в одном месте только нашел.


Из всего этого я так и не понял - можно ли будет выполнять запросы на всю таблицу, без ошибок?
Ошибка типа:
One of the partitions of index 'PK61' for table 'dbo.TblMixed'(partition ID 72057594039107584) resides on a filegroup ("FGReadOnly") that cannot be accessed because it is offline, restoring, or defunct. This may limit the query result.
вчера, 10:53    [22065813]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2317
ApXyC,

To avoid this error, you need to specifically limit the query to look only in the partitions that are online. This means you need to provide another search argument, and there needs to be an index on the table that lets the query processor match the search argument against one or more partitions. This process is called partition elimination.

In this case, I’ll add a date search argument, which matches against the cluster key I chose (and is also the partition key), using the following code:

SELECT COUNT (*) FROM SalesDB.dbo.Sales
WHERE CustomerID = 1440
AND SalesDate > '2010-01-01';
(С)
вчера, 11:49    [22065876]     Ответить | Цитировать Сообщить модератору
 Re: Частичное восстановление БД  [new]
ApXyC
Member

Откуда: Пенза
Сообщений: 75
StarikNavy, да, эту статью я уже видел. Собственно вопрос в том, что можно ли на 2012м сделать так, чтобы SQL Server откинул эти группы?
вчера, 12:13    [22065896]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить