powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Частичное восстановление БД
19 сообщений из 19, страница 1 из 1
Частичное восстановление БД
    #39544873
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги,

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

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

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

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
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

...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544886
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик
Да можно бакапить/восстанавливать на уровне файловых групп.
Приймары файловоая группа ваосстанавливается первой, т.е. праймару не может быть частью честичного восстановления.
Вот дока:
https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/back-up-files-and-filegroups-sql-server
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544918
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Col,

я и хочу восстановить только PRIMARY , а о остальных забыть,
а вот забыть не получается
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544921
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик
Ну ежели совсем забыть :)
В 2016 появилась возможность транкейтить по партишрнам.
Ну и кроме того мне непонятно почему после полного восстановления нельзя переместить "ненужные" группы в отдельные таблицы и уже их трнконуть?
PTF тут самое то:
https://ptf.codeplex.com/
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544924
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Col,

все это потребует длительного шринка, который не закончится до момента следующего восстановления базы
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544927
andrey odegov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544932
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик,
Наверное, на все подобные секционированные таблицы можно сделать дубликаты с такой же схемой, переключить все секции кроме 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
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544933
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик,
Не уверен, что прокатит переключение секций, которые попадают в FG в состояние RECOVERY_PENDING. Но если недостающие строки как бы улетят в таблицу аналогичной структуры, за исключением PRIMARY, а потом новую таблицу удаляем - то в старой остаются в явном виде только строки из PRIMARY и drop/create кластерного должен пройти нормально.
В общем, нужно экспериментировать.
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39544965
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КритикCol,

все это потребует длительного шринка, который не закончится до момента следующего восстановления базы
Какой шриньк?
Слайд в сторону, транкейт, удаление файлов и группы если надо.
Все делается за одну секунду.
Или у Вас там "коктейль молотова" из разных партишен функций смотрящих на разные группы?
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39587889
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
Критик, восстановление только первичной группы прямо в новую базу
RESTORE database NewDatabase filegroup = 'PRIMARY' FROM disk = 'C:\backup\PRIMARY.bak' with RECOVERY;
работает замечательно. База доступна, за исключением файловых групп.

А вот как восстановить в новую базу часть групп, но не только первичную (например, Primary + FG1) - никак не пойму. Возможно ли это вообще???
Или вторичная группа не выводится из восстановления или вся база (
Прошу помощи зала в этом вопросе.
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39588078
sdgfyhku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39588519
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
sdgfyhku, вас ист дас? тоже самое по-русски есть?

Пробежал глазами - не нашел чтобы был разобран случай восстановления отдельных группы в новую базу.
Рассматривается только восстановление битых файлов в текущей базе.
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39588597
sdgfyhku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39588603
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
sdgfyhku, фантастика. То что нужно. Все получилось. Спасибо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Частичное восстановление БД
    #39848945
Kuzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nvv,

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

name state_desc
Secondary RECOVERY_PENDING

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

В принципе, Secondary можно и удалить, таблицы из этой группы я могу и пустыми Create.
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39849234
Kuzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Трое суток не прошли даром!
Просто нужно дать команду, вывести в работу файловую группу...

RESTORE DATABASE DB FILEGROUP = 'Secondary' WITH RECOVERY

Хоть бы где про это написано... в одном месте только нашел.
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39918249
ApXyC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39918296
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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';
(С)
...
Рейтинг: 0 / 0
Частичное восстановление БД
    #39918310
ApXyC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StarikNavy, да, эту статью я уже видел. Собственно вопрос в том, что можно ли на 2012м сделать так, чтобы SQL Server откинул эти группы?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Частичное восстановление БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]