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

22.11.13

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

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

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

Скачать файлы

Наименование Файл Версия Размер
Backup 1C.ps1
.ps1 9,60Kb
41
.ps1 9,60Kb 41 Скачать

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

Скрипт позволяет провести все указанные выше операции, снабжен комментариями и, благодаря тому, что 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 Архивация создание архивов

См. также

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

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

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42521    10    24    

38

BackUPv8 - система резервного копирования баз 1С

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

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

1200 руб.

03.09.2014    14732    13    6    

18

Резервное копирование журнала транзакций, наконец-то!

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

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

04.12.2023    5868    n_mezentsev    15    

24

Резервное копирование и восстановление 1С баз на PostgreSQL в Windows с помощью pgAdmin, bat-файлов и планировщика

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

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

07.10.2022    19820    sapervodichka    36    

142

Архивирование базы в dt и дамп postgres

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

Захотелось клиентам выгрузку архива баз, и выгрузку в дт, готовые скрипты с сети не заработали. Может, кому-то поможет. Релиз 8.3.18.1741.

1 стартмани

25.08.2022    4716    2    Gnom-Gluck    6    

6

Утилита копирования баз данных 1С

Архивирование (backup) Платформа 1С v8.3 Абонемент ($m)

Небольшая утилита для копирования файловых баз данных 1С.

1 стартмани

02.06.2022    4236    3    Giblarium    12    

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


фирма 1С не рекомендует таким образом бэкапы делать
2. cheburashka 41 07.10.13 18:53 Сейчас в теме
(1)На этот счет уже достаточно различных мнений. Думаю, удобство использования *.dt Вы оспаривать не будете?
3. 3.14159 94 07.10.13 20:23 Сейчас в теме
(2) в чем удобство использования *.dt в клиент-серверном варианте?
4. cheburashka 41 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 14 08.10.13 09:42 Сейчас в теме
извиняюсь конечно, но я что-то не увидел, где надо прописывать свои пути к базе данных и архивам, ткинте меня, пожалуйста...
8. cheburashka 41 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 41 09.10.13 09:06 Сейчас в теме
(9) DoctorRoza, только из серверной.
11. bdsmka 11.12.14 10:49 Сейчас в теме
Очень интересный скрипт, спс за труд.
Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть? Или все таки можно только из конкретной базы?
Возможно ли указать несколько кластеров?
Что должно быть в этой переменной $IBConnectionString ?
12. cheburashka 41 11.12.14 13:58 Сейчас в теме
(11) bdsmka,
Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть?

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

В данном случае здесь указано "localhost\", что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.
18. advanter 42 22.09.17 11:07 Сейчас в теме
19. advanter 42 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 41 11.12.14 15:56 Сейчас в теме
(13) bdsmka, моя база тоже на MSSQL, но сервер баз данных и сервер приложения 1С находится на одном компе, поэтому "localhost\".
15. DigitalMan 7 11.06.15 06:46 Сейчас в теме
PermissionCode = "GodMode = On"
Вы сделали мой день! :)
16. pallid 270 19.11.15 11:57 Сейчас в теме
строка
$InfoBase.ConnectDenied = $ConnectDenied


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


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

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