Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Microsoft SQL SERVER

Автор: CrazyMax80
Дата сообщения: 05.08.2014 13:01
Небольшой скрипт для подчистки резервных копий. Может кому пригодится.
[more=Читать дальше..]

Код:
--*****************************************************************************
--Обход всех не нужных копий с удалением файлов и данных из истории копирования
--*****************************************************************************
--Разрешаем команды ОС
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

USE msdb
--Переменные определяющие горизонт хранения для полных копий
DECLARE
    @DailyCopies int = 30, -- сколько дней хранить ежедневные полные копии
    @MonthCopies int = 365, --сколько дней хранить копии на первые числа месяцев которые старше @DailyCopies
    @QuarterCopies int = 365*5, --сколько дней хранить квартальные копии которые старше @MonthCopies
    @physical_device_name nvarchar(260),
    @BackupSize2Save numeric(20,0),
    @BackupSize2Del numeric(20,0),
    @FilesSize2Save numeric(20,0),
    @FilesSize2Del numeric(20,0),
    @TotalBackupSize numeric(20,0),
    @TotalFilesSize numeric(20,0)
    
--Переменные-таблицы для хранения данных истории резервного копирования
DECLARE @saved_backup_set_id TABLE (backup_set_id INT)
DECLARE @backup_set_id TABLE (backup_set_id INT)
DECLARE @media_set_id TABLE (media_set_id INT)
DECLARE @restore_history_id TABLE (restore_history_id INT)

--Получаем список сохраняемых полных копий (для 30-ти дневных сохраняем разностные и журналы)
--копии не старше @DailyCopies
INSERT INTO @saved_backup_set_id (backup_set_id)
    SELECT backup_set_id
    FROM backupset
    WHERE [type] = 'D' AND DATEDIFF(DAY, backup_finish_date, GETDATE()) <= @DailyCopies
--разностные копии и журналы транзакций    не старше @DailyCopies
INSERT INTO @saved_backup_set_id (backup_set_id)
    SELECT backup_set_id
    FROM backupset
    WHERE database_backup_lsn IN
        (
            SELECT checkpoint_lsn
            FROM backupset
            WHERE backup_set_id IN (SELECT backup_set_id FROM @saved_backup_set_id)
        ) AND [type] <> 'D' --нужно чтобы дважды не выбрать запись о полной копии
--копии старше @DailyCopies и не старше @MonthCopies на 1-е числа месяцев
INSERT INTO @saved_backup_set_id (backup_set_id)
    SELECT MIN(backup_set_id) AS backup_set_id
    FROM backupset
    WHERE [type] = 'D' AND DATEDIFF(DAY, backup_finish_date, GETDATE()) > @DailyCopies
        AND DATEDIFF(DAY, backup_finish_date, GETDATE()) <= @MonthCopies
    GROUP BY DATEPART(MONTH, backup_finish_date), DATEPART(YEAR, backup_finish_date), database_name
--копии старше @MonthCopies и не старше @QuarterCopies на первые числа кварталов    
INSERT INTO @saved_backup_set_id (backup_set_id)
    SELECT MIN(backup_set_id) AS backup_set_id
    FROM backupset
    WHERE [type] = 'D' AND DATEPART(MONTH, backup_finish_date) IN (1,4,7,10)
        AND DATEDIFF(DAY, backup_finish_date, GETDATE()) > @MonthCopies
        AND DATEDIFF(DAY, backup_finish_date, GETDATE()) <= @QuarterCopies
    GROUP BY DATEPART(MONTH, backup_finish_date), DATEPART(YEAR, backup_finish_date), database_name

--Получаем список удаляемых резервных копий
INSERT INTO @backup_set_id (backup_set_id)
    SELECT backup_set_id
    FROM backupset bs
    WHERE backup_set_id NOT IN (SELECT backup_set_id FROM @saved_backup_set_id)

--Получаем усписок удаляемых устройств
INSERT INTO @media_set_id (media_set_id)
    SELECT DISTINCT media_set_id FROM msdb.dbo.backupset WHERE backup_set_id IN (SELECT backup_set_id FROM @backup_set_id)

--Получаем удаляемую историю восстановления
INSERT INTO @restore_history_id (restore_history_id)
    SELECT DISTINCT restore_history_id FROM msdb.dbo.restorehistory WHERE backup_set_id IN (SELECT backup_set_id FROM @backup_set_id)

--Подсчитываем размеры копий
SELECT @BackupSize2save = SUM(backup_size), @FilesSize2Save = SUM(compressed_backup_size) FROM backupset WHERE backup_set_id IN (SELECT backup_set_id FROM @saved_backup_set_id)
SELECT @BackupSize2Del = SUM(backup_size), @FilesSize2Del = SUM(compressed_backup_size) FROM backupset WHERE backup_set_id IN (SELECT backup_set_id FROM @backup_set_id)
SELECT @TotalBackupSize = SUM(backup_size), @TotalFilesSize = SUM(compressed_backup_size) FROM backupset

PRINT 'Total ' + CAST(@TotalBackupSize As nvarchar(20)) + ' ('+ CAST(@TotalFilesSize As nvarchar(20)) + ' compressed)'
PRINT 'Save ' + CAST(@BackupSize2Save As nvarchar(20)) + ' ('+ CAST(@FilesSize2Save As nvarchar(20)) + ' compressed)'
PRINT 'Delete ' + CAST(@BackupSize2Del As nvarchar(20)) + ' ('+ CAST(@FilesSize2Del As nvarchar(20)) + ' compressed)'

/*
--Запрос для посмотреть, что будет сохранено
SELECT backup_set_id, name, [type], backup_finish_date FROM backupset WHERE backup_set_id IN
(SELECT backup_set_id FROM @saved_backup_set_id) AND database_name = '...'
*/

--Удаляем устройства
DECLARE #backups CURSOR FORWARD_ONLY
FOR
SELECT physical_device_name FROM backupmediafamily WHERE media_set_id IN (SELECT media_set_id FROM @media_set_id)

OPEN #backups

FETCH NEXT FROM #backups
INTO @physical_device_name

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @physical_device_name = N'del /F /Q ' + @physical_device_name
    EXEC xp_cmdshell @physical_device_name, no_output
    FETCH NEXT FROM #backups
    INTO @physical_device_name
END

CLOSE #backups
DEALLOCATE #backups

--теперь чистим таблицы
BEGIN TRANSACTION

DELETE FROM backupfile WHERE backup_set_id IN (SELECT backup_set_id FROM @backup_set_id)

DELETE FROM backupfilegroup WHERE backup_set_id IN (SELECT backup_set_id FROM @backup_set_id)

DELETE FROM restorefile WHERE restore_history_id IN (SELECT restore_history_id FROM @restore_history_id)

DELETE FROM restorefilegroup WHERE restore_history_id IN (SELECT restore_history_id FROM @restore_history_id)

DELETE FROM restorehistory WHERE restore_history_id IN (SELECT restore_history_id FROM @restore_history_id)

DELETE FROM backupset WHERE backup_set_id IN (SELECT backup_set_id FROM @backup_set_id)

DELETE backupmediafamily FROM backupmediafamily bmf WHERE bmf.media_set_id IN (SELECT media_set_id FROM @media_set_id)
                                                AND ((SELECT COUNT(*) FROM backupset WHERE media_set_id = bmf.media_set_id) = 0)

DELETE backupmediaset FROM backupmediaset bms WHERE bms.media_set_id IN (SELECT media_set_id FROM @media_set_id)
                                                AND ((SELECT COUNT(*) FROM backupset WHERE media_set_id = bms.media_set_id) = 0)

COMMIT TRANSACTION

--Отключаем команды ОС
EXEC sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO



Автор: bsd9
Дата сообщения: 06.08.2014 13:44
Добрый день! Я новичок в sql server, у меня возникли вопросы относительно журнала транзакций. Вот у меня есть база на 300 ГБ, журнал 30 гб.
1) В случае повреждения журнала транзакций я потеряю данные какие ? Изменения сделанные за какой период ?

2) В свойствах единственного файла лога, атрибут ‘изменен’ - 31.07.2014, автоувелечение 10 %, не ограничено, но почему размер этого файла не меняется и атрибут тоже ? Я так понимаю файл лога должен расти. Модель восстановления полная.

Заранее спасибо за ответы.
Автор: econ2
Дата сообщения: 06.08.2014 14:28

Цитата:
В случае повреждения журнала транзакций я потеряю данные какие ?


Потеряются все незакрытые (незакомиченные) транзакции. Данные за какой-то период потеряны не будут.


Цитата:
В свойствах единственного файла лога, атрибут ‘изменен’ - 31.07.2014, автоувелечение 10 %, не ограничено, но почему размер этого файла не меняется и атрибут тоже ? Я так понимаю файл лога должен расти. Модель восстановления полная


1) Значит, вы делаете операрции, которые не приводят к его быстрому росту. Сгенерируйте таблицу на миллион записей, сделайте truncate и заново заполните при помощи insert - лог вспухнет как на дрожжах -)

2) Значит вы делаете полный бакап базы, которая очищает лог транзакций при полной модели
Автор: bsd9
Дата сообщения: 06.08.2014 16:42
econ2

Цитата:

1) Значит, вы делаете операрции, которые не приводят к его быстрому росту

Ну не знаю, база используется очень активно. В среднем 50 000 по счетчику Batch Requests/sec.


Цитата:
Значит вы делаете полный бакап базы

Да, фулл бакап. Усечение лога при этом - это дефолтный параметр ? Я не помню, чтобы я что-то особое выставлял при бакапе.

И все же, не совсем понял, почему если данные внутри файла лога меняются, то атрибут "изменен" стоит не сегодняшний.
Автор: bigsloth
Дата сообщения: 07.08.2014 05:54
econ2
не вводите людей в заблуждение

Цитата:
Значит вы делаете полный бакап базы, которая очищает лог транзакций при полной модели


При полном бэкапе журнал транзакций не очищается, не усекается и вообще ничего с ним не происходит.

Журнал транзакций может не расти если настроено регулярное резервное копирование журналов транзакций (backup log).
Автор: bsd9
Дата сообщения: 07.08.2014 20:39

Цитата:
Журнал транзакций может не расти если настроено регулярное резервное копирование журналов транзакций (backup log).

И такого у меня нет, с регулярным бекапированием чего либо у меня вообще напряженка (но это уже отдельный вопрос будет). Но я заметил, что лог вроде все таки растет. Минимальный его размер выставлен в настройках 27 670, а в свойствах системы это файл на диске занимает 29 013 639 168 байт. Странная ситуация какая то вообще. Может у меня зря в настройках такой минимальный размер стоит ?
Автор: Paromshick
Дата сообщения: 07.08.2014 21:08
bigsloth
Смотря чем бэкапить.
bsd9
А вас что собственно беспокоит? Места не хватает? Да и вы бы хоть марку движка озвучили... Какого года выпуска хотя бы
Автор: bsd9
Дата сообщения: 07.08.2014 21:39

Цитата:
А вас что собственно беспокоит?

Пытаюсь разобраться в тонкостях, места то хватает. Беспокоит, медленно выполняются бекапы, часа три на 300 гб базу, и потом они парализуют работу бизнес-приложения, но сдается мне, это особенность конкретно моего приложения. С этим надо что-то решать, так дальше нельзя, бекапы у меня делаются крайне редко. Но сдается мне, я копаю не туда.

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
Автор: bigsloth
Дата сообщения: 08.08.2014 04:25
Paromshick
Не важно чем бэкапить. Полный бэкап sql server, чем бы вы его не делали, не приведёт к тому, что журнал транзакций будет "очищаться".
bsd9
что вернёт запрос?
select recovery_model_desc, log_reuse_wait_desc
from sys.databases
where name = 'имя вашей БД'

скопируйте результат выполнения вот этого запроса:
dbcc sqlperf(logspace)
отсюда так же интересует только строка с вашей бд
Автор: bsd9
Дата сообщения: 08.08.2014 07:25

Цитата:
что вернёт запрос?


FULL NOTHING


Цитата:
dbcc sqlperf(logspace)
отсюда так же интересует только строка с вашей бд


Log Size (MB) Log Space Used (%) Status
27669,55     0,3008722     0

Автор: bigsloth
Дата сообщения: 08.08.2014 07:31
bsd9
значит есть 3 варианта:
1. в базу не пишется ничего вообще - журнал транзакций заполнен на 0,3% и вообще нет ни одной активной не забэкапленной транзакции (Log_reuse_wait_desc = nothing)
2. бэкапы журнала транзакций делаются на регулярной основе, либо такой бэкап был сделан перед выполнением запросов
3. перед выполнением запросов модель восстановления менялась на простую и обратно

смотрите job'ы, что-то должно быть.
Автор: bsd9
Дата сообщения: 08.08.2014 10:45

Цитата:
в базу не пишется ничего вообще - журнал транзакций заполнен на 0,3%

Как это ? А куда же данные деваются ?


Цитата:
либо такой бэкап был сделан перед выполнением запросов

Но у меня запросы выполняются ежесекундно.


Цитата:
смотрите job'ы, что-то должно быть.

Проведу анализ.
Автор: bigsloth
Дата сообщения: 08.08.2014 11:03

Цитата:
Как это ? А куда же данные деваются ?  
Но у меня запросы выполняются ежесекундно.  

select from записей никаких в журнале транзакций не оставит, но, при этом всё равно останется запросом. Я имел в виду, что бэкап был сделан перед выполнением запросов которые написал я постом выше.

Если в базе есть операции insert/update/delete - у вас 100% либо вариант 2, либо 3.
Автор: bsd9
Дата сообщения: 08.08.2014 14:51
bigsloth


Цитата:
Если в базе есть операции insert/update/delete

Полно. Они будут записываться в лог ?


Цитата:
в базу не пишется ничего вообще

Вы имеете ввиду в лог ? У меня службы льют данные в базу. Не нашел где в джобе делается бекап лога пока.

Сейчас посмотрел, Log space уже 0,2272918, усекся видимо.
Автор: Vxd2000
Дата сообщения: 17.08.2014 16:36
Возможно ли в Sql 2008 R2 "разнести" при установке полностью программные файлы, базы, логи по совершенно разнеым папкам ?
То есть, например: установочные файлы и Binn для instances в Program files на диске C, а data и log, вообще на другой диск в папку sql\data и sql\log ?
Автор: vikkiv
Дата сообщения: 17.08.2014 17:45
Vxd2000 - Можно при установке разносить от уровня компонентов {64/86} (т.е. на выборе "Features to install") установки, самой "instance", и до уровня Temp/Log/Data/Backup.
После установки есть возможность менять последнее тоже. Так-же можно разносить расположение логов и базы для индивидуальных баз модифицировать существующие или при их восстановлении/создании. (скриптами или через интерфейс1, .. интерфейс2)
Автор: Vxd2000
Дата сообщения: 17.08.2014 18:47
vikkiv, это знаю, даже скрипт сделал.
Спасибо.
Просто нужно было еще более детальное разнесение и выделение "начальных" компонент.

Автор: vikkiv
Дата сообщения: 17.08.2014 19:42
Vxd2000 что-то не ясно, вопрос решен или нет =), начальное расположение по умолчанию и задаётся при установке или при создании базы (скриптами/интерфейсом), изменяется когда уже создана (ALTER) или при восстановлении (тоже данные/логи : mdf/ldf).
При желании можно разнести данные в несколько файлов, причём каждый в разных местах (тоже относится и к TempDB). Это можно делать на уровне конкретных баз или изменить параметры по умолчанию через Server->Properties->DatabaseSettings (Data/Log/Backup)
Автор: Vxd2000
Дата сообщения: 17.08.2014 21:34
vikkiv, к сожалению не решен.
Суть в том, что кода 1 раз запускается установщик он "подготовительные" файлы "кладет" в Program Files\Misrosoft SQL и в Program Files (x86)\Misrosoft SQL.
Затем для каждой "ветки" (instance) , насколько помню, не разнести по совершенно разным папкам Binn (где сама служба "ветки" ) и Data (где данные) .

Задача - все файлы НЕ с данными и с логами в одну папку (например Program Files\Sql для x64) , а, соответственно файлы с БД и логами совсем на другой диск и в одну папку (Sql\Data и Sql\Log) . Причем для всех "веток" , либо для ветки abc: sql\data\abc, sql\log\abc, для ветки xyz аналогично: sql\data\xyz, sql\log\xyz. На крайняк: sql\abc\data, sql\abc\log и sql\xyz\data и sql\xyz\log.

И, еще, возможно при первоначальной установке не создавать default instace, а создать сразу 3 именованных instances с разными именами за 1 раз ?

Не сталкивались с Sql БД для MS TMG 2010 ?

Автор: vikkiv
Дата сообщения: 17.08.2014 22:57
Vxd2000 - так в чём проблема-то? если баз десяток то можно вручную, если больше - скриптами, EXEC xp_create_subdir @path+@соответственнаяdbname для каждой базы и туда уже alter или создание новой как в примере Б

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

нет, с доп.средствами не сталкивался и наверняка ни-за-что не буду, ресурса не хватает, только на документированную часть и встроеные инструменты с трудом время есть =))
Автор: Vxd2000
Дата сообщения: 17.08.2014 23:27
Чего-то меня "торкнул" вопрос: а все. что есть в каком-то отдельном instance можно выгрузить в txt (.sql) файл одной машины и загрузить на совсем другой машине, только с разницей редакций: выгрузка с 2008 r2 express, загрузка в 2008 r2 standart/ enterprise ?
Автор: vikkiv
Дата сообщения: 17.08.2014 23:59
вверх легко, а вниз могут возникнуть проблемы если используется более высокая функциональность.
сами данные вообще без заморочек - что с ними станется.
можно и .sql/.bak, не лучше-ли detach/attach? или перекинуть только структуры и залить данные напрямую с сервера на сервер по сети, в конце концов linked server / openrowset
Автор: qwertEHOK
Дата сообщения: 18.08.2014 11:22
Vxd2000
у вас же везде 2008 - тут и bak файл прокатит

Автор: Vxd2000
Дата сообщения: 18.08.2014 14:06
Суть в том, блин, не написал, что на "машине загрузки" нет такого instance.
Его нужно создать перед загрузкой из bak файла или она автоматом создастся ?
И, нужно делать bak "служебных" таблиц master и прочее резервируемой instance ?
Автор: Vxd2000
Дата сообщения: 19.08.2014 14:53
Какие должны быть "default" разрешения на папку с instance и с папкой БД (если они разные) ?
При mixed authentication.
Работают instances от Network service.
У меня 5 ошибка (отказано в доступе) при загрузке базы из back, запарила уже.
Автор: Drakula13
Дата сообщения: 19.08.2014 16:27
Ребят... у меня возник такой вопрос... почему SQL server 2000 sp4 перестает работать после того, как я меняю имя компьютера либо вывожу его из домена в обычную рабочую группу? Может кто знает как от этого избавиться можно?
Автор: vikkiv
Дата сообщения: 19.08.2014 20:44
Vxd2000
Так зачем тебе дополнительный instance? Есть конечно случаи, но если куча простых БД то можно и одним обойтись, а туда уже базы скидывать сколько вздумается. Не знаю как резервное копирование для instance делать, только по базам делаю.
разрешения на instance:
-----------
ALL APPLICATION PACKAGES
SYSTEM
Administrators
Users
TrustedInstaller
CREATOR OWNER
-----------
Ну и на базы (Data & Bakup такие-же но уже на конкретных пользователей по группам Users/Administrators) плюс служебный пользователь/группа, но это автоматом - не ручная добавка.
Отказано в доступе при чтении? или при записи? От кого запускаются службы? И SSMS (у этого пользователя права есть? попробуй под админом).
Я если заморочки - делаю временную директорию и даю "full control" для всех, т.е. everyone, скидываю/копирую туда .bak, восстанавливаю - и директорию стираю.

Добавлено:
Drakula13
именно перестаёт работать (т.е. не запущен/-скается в сервисах)? или с подключением проблемы?
Автор: Vxd2000
Дата сообщения: 19.08.2014 22:13
vikkiv, мне их надо как минимум два.
Зачем - перенести БД Tmg 2010 с Sql Express и "грохнуть" его на Sql Enterprise.
Еще посмотрел по версиям: источник 2008 Sp2 x64 (префикс MSSQL10) , приемник 2008 r2 Sp2 (префикс MSSQL10_50) .
Через backup "покатит" ?
И возник вопрос (раньше не ставил SQL Server Reporting Services) .
В одной из 2 веток (Instance) есть ReportServer$.... и ReportServer$....Temp.
И есть служба с ReportServer$....
Как поставить в unattended этот ReportServer (какие опции устанавливать и во что) ?

Насчет разрешений на папки, вроде разобрался (почти полностью) .

Автор: Drakula13
Дата сообщения: 20.08.2014 10:07
vikkiv
он именно не запускается
Автор: econ2
Дата сообщения: 20.08.2014 10:10
Drakula13
Посмотри под какими учетками стартуют службы SQL Server'a.
Само переименование сервера в потере работоспособности SQL приводить не должно, требуется только скорректировать имя SQL при помощи команд

sp_dropserver 'old server name'
sp_addserver 'new server name'

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Измерение скорости сети LAN - все программы


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.