Отключение пользователей, установка блокировки начала сеансов и архивация клиент-серверных баз силами PowerShell

22.11.13

База данных - Архивирование (backup)

1) Отключение работающих пользователей;
2) Установка блокировки начала сеансов (устанавливается на 2 часа);
3) Архивация баз;
4) Удаление старых архивов.

Все это в одном скрипте на PowerShell.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Backup 1C.ps1
.ps1 9,60Kb
42
42 Скачать (1 SM) Купить за 1 850 руб.

За основу взята данная публикация.

Скрипт позволяет провести все указанные выше операции, снабжен комментариями и, благодаря тому, что PowerShell является неотъемлемой компонентой системы начиная с Win7 (так же доступен и в более ранних ОС), может быть легко и быстро адаптирован под нужды каждого.

В данном случае приведен пример архивации одной базы и удаление ее архивов старше 60 дней. В случае аварийного завершения скрипта блокировка начала сеансов будет снята через 2 часа.

# Описание функций

function PerformBackup([string]$IBConnectionString, [string]$IBName ,[string]$User, [string]$Pass = "", [string]$BackupDirectory, [string]$ClasterUser = "", [string]$ClasterPass = "")
{
    # Удалим сессии 
    # Аутентификация к выбранному кластеру
    # если у пользователя под которым будет выполняться сценарий нет прав на кластер,
    # можно прописать ниже имя пользователя и пароль администратора кластера
    $ServerAgent.Authenticate($Claster, $ClasterUser, $ClasterPass) 

    # Получаем список сессий кластера и прерываем их
    $Sessions = $ServerAgent.GetSessions($Claster)
    if (!($Sessions.Count -eq 0))
    {
    	write-host "Разрывается" $Sessions.Count "сессий базы" $InfoBaseName
        foreach ($Session in $Sessions)
        {
        	$ServerAgent.TerminateSession($Claster, $Session)
        }
    }

    # Устанавливаем блокировку начала сеансов
    write-host "Установлена блокировка начала сеансов к базе $IBName";
    ChangeConnectDenied $IBName $True $User $Pass
	
    # Создаем бэкап
    write-host "Создание бэкапа базы $IBName";
    $curtime = Get-Date -Format 'dd.MM.yyyy';
    $arglist = "CONFIG /s """+$IBConnectionString+$IBName+"""  /N """+$User+""" /P """+$Pass+""" /DisableStartupMessages /Out """+$BackupDirectory+"log_"+$curtime+".txt"" /DumpIB """+$BackupDirectory+$curtime+".dt"" /UC ""GodMode = On""";
	Start-Process -wait (Get-Alias -name exe82).definition -ArgumentList $arglist;
	
	write-host "Архив базы $IBName успешно скопирован в файл $BackupDirectory$curtime.dt";
    
    # Снимаем блокировку начала сеансов
    write-host "Блокировка начала сеансов к базе $IBName снята";
    ChangeConnectDenied $IBName $False $User $Pass
}

function ChangeConnectDenied([string]$InfoBaseName, [bool]$ConnectDenied, [string]$User = "", [string]$Pass = "")
{
	# Получаем список рабочих процессов кластера
	$WorkingProcesses = $ServerAgent.GetWorkingProcesses($Claster)

	foreach ($WorkingProcess in $WorkingProcesses)
	{                    
		if (!($WorkingProcess.Running -eq 1))
		{
			continue
		}
			
		$CWPAddr = "tcp://"+$WorkingProcess.HostName+":"+$WorkingProcess.MainPort
		$CWP = $V82Com.ConnectWorkingProcess($CWPAddr)
		$CWP.AddAuthentication($User, $Pass) 

		$InfoBases = $CWP.GetInfoBases()

		foreach ($InfoBase in $InfoBases)
		{
			if ($InfoBase.Name -eq $InfoBaseName)
			{
				$InfoBaseFound = $TRUE    
				break
			}
		}
		
		if (!($InfoBaseFound))
		{
			write-host "Не найдена указанная в параметрах запуска ИБ..."
			break
		}

		# Устанавливаем/снимаем блокировку соединений ИБ
		$InfoBase.ConnectDenied = $ConnectDenied
        $InfoBase.PermissionCode = "GodMode = On";
        $InfoBase.DeniedFrom = Get-Date -Format "yyyy-MM-dd HH:mm:ss";
        $InfoBase.DeniedTo = (Get-Date).AddHours(2).ToString("yyyy-MM-dd HH:mm:ss") # Блокировка автоматически будет снята через 2 часа
		$CWP.UpdateInfoBase($InfoBase)
	}
}

function DeleteOldArchives([string]$BackupFolderPath, [int]$StorageDays)
{
    $AbsStorageDays = [Math]::Abs($StorageDays)
    $CurrentDate = Get-Date
    $OldDate = $CurrentDate.AddDays($StorageDays)
    write-host "Удаление архивов из $BackupFolderPath за последние $AbsStorageDays дней"
    Get-ChildItem $BackupFolderPath | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
}

#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

# По версии стартера определяем путь к 1С последней версии (это позволяет не заморачиваться с перепиской скрипта при обновлении платформы)
if (Test-Path -path "C:\Program Files (x86)\1cv82") 
{
	$PathTo1C = "C:\Program Files (x86)\1cv82\";
}
else 
{
	$PathTo1C = "C:\Program Files\1cv82\";
}
$Version1C = (Get-Command ($PathTo1C+"common\1cestart.exe")).FileVersionInfo.FileVersion;
Set-Alias exe82 ($PathTo1C+$Version1C+"\bin\1cv8.exe");

# Параметры запуска сценария: адрес сервера, основной порт кластера, количество дней хранения архивов, путь к папке с архивами
$SrvAddr = "tcp://localhost:1540"
$MainPort = "1541"
$StorageDays = -60 # знак "-" обязателен, иначе дата увеличится на указанное количество дней
$BackupFolderPath = "d:\Backup\"

$V82Com = New-Object -COMObject "V82.COMConnector"

# Подключение к агенту сервера
$ServerAgent = $V82Com.ConnectAgent($SrvAddr)
$ClusterFound = $FALSE
$InfoBaseFound = $FALSE

# Получим массив кластеров сервера
$Clasters = $ServerAgent.GetClusters()

foreach ($Claster in $Clasters)
{
	if ($Claster.MainPort -eq $MainPort)
    {
		$ClusterFound = $TRUE    
		break
    }
}

if (!($ClusterFound))
{
	break
}

# Выполнение архивации базы InfoBase и удаление старых архивов
PerformBackup "localhost\" "InfoBase" "Администратор" "" $BackupFolderPath;
DeleteOldArchives $BackupFolderPath $StorageDays
 
$V82Com = "";

backup PowerShell Архивация создание архивов

См. также

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73530    629    45    

88

Архивирование (backup) Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Программа позволяет выполнять автоматическое создание копий файловых и серверных информационных баз 1С Предприятие 8 и размещение копий в облаке Яндекс.Диск, локальном или сетевом ресурсе.

1200 руб.

03.09.2014    15919    21    6    

27

Архивирование (backup) Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Платные (руб)

Расширение поможет настроить резервное копирование баз SQL в стандартный файл выгрузки баз 1С (*.dt).

2400 руб.

27.08.2024    1457    1    6    

1

HighLoad оптимизация Администрирование СУБД Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    3377    1CUnlimited    9    

6

Архивирование (backup) Администрирование СУБД Системный администратор Россия Бесплатно (free)

Постараюсь объяснить, зачем нужно резервное копирование именно журнала транзакций, а не только базы данных, и почему я словно сбросил груз, настроив его - как, покажу, естественно. Кстати, будут скрипты T-SQL (с подробными комментариями) - отличный способ сделать администрирование базы более уютным.

04.12.2023    10289    n_mezentsev    15    

27

Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной инструкции будет описано, как с помощью pgAdmin, bat-файлов и планировщика заданий Windows организовать резервное копирование, восстановление и хранение копий баз данных.

07.10.2022    30762    sapervodichka    37    

147
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 3.14159 94 07.10.13 16:03 Сейчас в теме
# Создаем бэкап


фирма 1С не рекомендует таким образом бэкапы делать
2. cheburashka 44 07.10.13 18:53 Сейчас в теме
(1)На этот счет уже достаточно различных мнений. Думаю, удобство использования *.dt Вы оспаривать не будете?
3. 3.14159 94 07.10.13 20:23 Сейчас в теме
(2) в чем удобство использования *.dt в клиент-серверном варианте?
4. cheburashka 44 07.10.13 20:33 Сейчас в теме
(3)Например, такой архив легко можно развернуть на любой другой машине для отладки.
20. sssss_aaaaa_2011 22.09.17 11:32 Сейчас в теме
(4)Только надо пользователей выгонять. Очень удобно.
TeMochkiN; +1 Ответить
5. Serj1C 483 08.10.13 07:08 Сейчас в теме
6. TrinitronOTV 16 08.10.13 09:42 Сейчас в теме
извиняюсь конечно, но я что-то не увидел, где надо прописывать свои пути к базе данных и архивам, ткинте меня, пожалуйста...
8. cheburashka 44 08.10.13 10:42 Сейчас в теме
(6) TrinitronOTV, (7) xbic, 3-я и 4-я строки снизу:

PerformBackup "localhost\" "InfoBase" "Администратор" "" $BackupFolderPath;
DeleteOldArchives $BackupFolderPath $StorageDays
7. xbic 16 08.10.13 10:00 Сейчас в теме
Опишите в комментариях где нужно указать параметры скрипта, либо опишите пример...
9. DoctorRoza 09.10.13 08:24 Сейчас в теме
Оренбургу привет! :)
Данный скрипт может выгнать из файловой БД или из серверной? Или обеих?

Плюсануть не могу, забанили видимо, но скрипт скачал!
10. cheburashka 44 09.10.13 09:06 Сейчас в теме
(9) DoctorRoza, только из серверной.
11. bdsmka 11.12.14 10:49 Сейчас в теме
Очень интересный скрипт, спс за труд.
Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть? Или все таки можно только из конкретной базы?
Возможно ли указать несколько кластеров?
Что должно быть в этой переменной $IBConnectionString ?
12. cheburashka 44 11.12.14 13:58 Сейчас в теме
(11) bdsmka,
Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть?

Да, так и должно быть в данной реализации скрипта. Недавно сам понял, что это не очень удобно. Необходимо изменить скрипт, чтобы он выкидывал пользователей только из архивируемой базы.
Что должно быть в этой переменной $IBConnectionString ?

В данном случае здесь указано "localhost\", что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.
18. advanter 43 22.09.17 11:07 Сейчас в теме
19. advanter 43 22.09.17 11:10 Сейчас в теме
(12)
Недавно сам понял, что это не очень удобно. Необходимо изменить скрипт, чтобы он выкидывал пользователей только из архивируемой базы.

function BlockCluster([string]$IBConnectionString, [string]$IBName ,[string]$User, [string]$Pass = "", [string]$ClusterUser = "", [string]$ClusterPass = "")
{
    $ServerAgent.Authenticate($Cluster, $ClusterUser, $ClusterPass) 
	$InfoBasesInCluster= $ServerAgent.GetInfoBases($Cluster)
	if (!($InfoBasesInCluster.Count -eq 0))
    {
        foreach ($InfoBaseInCluster in $InfoBasesInCluster)
        {
            if ($InfoBaseInCluster.Name -eq $IBName)
            {
                $Sessions = $ServerAgent.GetInfoBaseSessions($Cluster, $InfoBaseInCluster)
				if (!($Sessions.Count -eq 0)) 
				{
					foreach ($Session in $Sessions)
					{
                          $ServerAgent.TerminateSession($Cluster, $Session)						
					}
				}		
            }
        }
    }

	write-host "Started blocking sessions to base $IBName";
    ChangeConnectDenied $IBName $True $User $Pass
    
}
Показать

Подробнее
13. bdsmka 11.12.14 14:41 Сейчас в теме
В данном случае здесь указано "localhost\", что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.


А если база на MSSQL?
14. cheburashka 44 11.12.14 15:56 Сейчас в теме
(13) bdsmka, моя база тоже на MSSQL, но сервер баз данных и сервер приложения 1С находится на одном компе, поэтому "localhost\".
15. DigitalMan 7 11.06.15 06:46 Сейчас в теме
PermissionCode = "GodMode = On"
Вы сделали мой день! :)
16. pallid 273 19.11.15 11:57 Сейчас в теме
строка
$InfoBase.ConnectDenied = $ConnectDenied


актуальна же только для 8.2, в 8.3 надо же вроде указывать
$InfoBase.SessionsDenied  = $ConnectDenied
$InfoBase.ScheduledJobsDenied   = $ConnectDenied


Правильно я понимаю???

17. cheburashka 44 19.11.15 20:16 Сейчас в теме
(16) white_sochi, насчет SessionsDenied точно сказать не могу, по идее ConnectDenied тоже должен работать. А ScheduledJobsDenied должно и в 8.2 работать, т.к. это флажок "Блокировка регламентных заданий включена", который и в 8.2 был. Скрипт разрабатывался и тестировался для 8.2.
21. пользователь 02.10.17 04:47
Сообщение было скрыто модератором.
...
Оставьте свое сообщение