J'ai une procédure pour sauvegarder les bases de données SSAS .
Cela fonctionne comme un charme.
Maintenant, mon serveur remplit avec des sauvegardes SSAS et je souhaite supprimer les fichiers de sauvegarde de plus de 2 jours.
pour y parvenir, j'utilise le script PowerShell suivant:
#-------------------------------------------------------------------------------
# Script to delete old SSAS backup files
#
# Marcelo Miorelli
#
# 19-novembre-2014 Wed
#-------------------------------------------------------------------------------
#-- connect to the remote server -- SQLBILON1
#
ENTER-PSSESSION sqlbilon1
#-- set the Path where the backup files (.abf) are located
#
$path = 'H:\SQLBackups'
#-- set the number of days backups should be deleted -- in this case 2
#
$NumberOfDays = 2
#-- calculate the date of the backup files - if they are older than $days they will be deleted
#
$days = (Get-Date).AddDays(-$NumberOfDays)
#--get the list of the backup files to be deleted and delete them
#
Get-ChildItem $Path -Recurse '*.abf' | ? {$_.CreationTime -lt $days} | Remove-Item
Le problème avec ce script est que j'utilise MySQLServer1 Server pour sauvegarder les bases de données sur SQLBILON1 Server. Les fichiers de sauvegarde sont sur le dossier H:\sqlbackups de SQLBILON1.
Le travail échoue avec le message d'erreur suivant:
The job script encountered the following errors. These errors did not stop the script:
A job step received an error at line 13 in a PowerShell script.
The corresponding line is 'ENTER-PSSESSION sqlbilon1'.
Correct the script and reschedule the job. The error information returned by PowerShell is:
'Connecting to remote server failed with the following error message :
Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.'
Question, comment puis-je exécuter un script PowerShell sur un serveur distant? Ce script fonctionne à partir d'un travail SQL Server.
Puis-je créer un proxy et l'utiliser pour se connecter au serveur distant?
Si vous êtes dans un environnement de domaine, vous pouvez configurer un compte proxy contenant des autorisations sur SQLBILON1
. Cependant, l'utilisation de PowerShell distant est un peu surkill et ajoute une couche inutile pour résoudre le problème. Si vous n'avez pas de PowerShell distant activé sur les deux serveurs et l'accès au pare-feu entre les serveurs configurés correctement, il aura des problèmes.
Je voudrais simplement utiliser des chemins UNC sur le serveur. Si vous utilisez l'administrateur partage comme \\SQLBILON1\H$\SQLBackups
ou créer des actions directement à \\SQLBILON1\SQLBackups
. Sauf si vous voulez donner au service d'agent SQL sur MYSQLSERVER1
Autorisations à ce répertoire de sauvegarde dont vous aurez besoin pour créer un compte proxy ayant les autorisations appropriées.
Votre script sera beaucoup plus simplement si vous allez simplement aller cet itinéraire:
#-------------------------------------------------------------------------------
# Script to delete old SSAS backup files
#
# Marcelo Miorelli
#
# 19-novembre-2014 Wed
#-------------------------------------------------------------------------------
#-- set the Path where the backup files (.abf) are located
#
$path = '\\SQLBILON1\H$\SQLBackups' # OR \\SQLBILON1\SQLBackups
#-- set the number of days backups should be deleted -- in this case 2
#
$NumberOfDays = 2
#-- calculate the date of the backup files - if they are older than $days they will be deleted
#
$days = (Get-Date).AddDays(-$NumberOfDays)
#--get the list of the backup files to be deleted and delete them
#
Get-ChildItem $Path -Recurse '*.abf' | ? {$_.CreationTime -lt $days} | Remove-Item
Basé sur la réponse de @shawn Melton ci-dessus
J'ai créé un proxy dans SQL Server en utilisant ce code:
-- script for creating a proxy in order to run a set of POWERSHELL commands
-- this is to delete backups older than 2 days
-- marcelo miorelli
-- 19-nov-2014
--==============================================================================================
-- server is MySQLServer1
-- and this script deletes old backup files that are located on SQLBILON1
PRINT @@SERVERNAME
--==============================================================================================
--Script #1 - Creating a credential to be used by proxy
USE MASTER
GO
--Drop the credential if it is already existing
IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = N'PowerShell_Credentials')
BEGIN
DROP CREDENTIAL [PowerShell_Credentials]
END
GO
CREATE CREDENTIAL [PowerShell_Credentials]
WITH IDENTITY = N'MYCOMPANY\SQLAgent_DW',
SECRET = N'zd(8A1(7m5=xSC%mTsDw<4V)6@vQfp+f'
GO
--Script #2 - Creating a proxy account
USE msdb
GO
--Drop the proxy if it is already existing
IF EXISTS (SELECT 1 FROM msdb.dbo.sysproxies WHERE name = N'PowerShell_Proxy')
BEGIN
EXEC dbo.sp_delete_proxy
@proxy_name = N'PowerShell_Proxy'
END
GO
--Create a proxy and use the same credential as created above
EXEC msdb.dbo.sp_add_proxy
@proxy_name = N'PowerShell_Proxy',
@credential_name=N'PowerShell_Credentials',
@enabled=1
GO
--To enable or disable you can use this command
EXEC msdb.dbo.sp_update_proxy
@proxy_name = N'PowerShell_Proxy',
@enabled = 1 --@enabled = 0
GO
--Script #3 - Granting proxy account to SQL Server Agent Sub-systems
USE msdb
GO
--You can view all the sub systems of SQL Server Agent with this command
--You can notice for SSIS Subsystem id is 11
EXEC sp_enum_sqlagent_subsystems
GO
--Grant created proxy to SQL Agent subsystem
--You can grant created proxy to as many as available subsystems
EXEC msdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name=N'PowerShell_Proxy',
@subsystem_id=11 --subsystem 11 is for SSIS as you can see in the above image
GO
EXEC msdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name=N'PowerShell_Proxy',
@subsystem_id=12 --subsystem 12 is for PowerShellStart
GO
EXEC msdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name=N'PowerShell_Proxy',
@subsystem_id=10 --subsystem 10 is for ANALYSISCOMMAND
go
--View all the proxies granted to all the subsystems
EXEC dbo.sp_enum_proxy_for_subsystem
--Script #4 - Granting proxy access to security principals
USE msdb
GO
--Grant proxy account access to security principals that could be
--either login name or fixed server role or msdb role
--Please note, Members of sysadmin server role are allowed to use any proxy
EXEC msdb.dbo.sp_grant_login_to_proxy
@proxy_name=N'PowerShell_Proxy'
,@login_name=N'MYCOMPANY\SQLAgent_DW'
--,@fixed_server_role=N''
--,@msdb_role=N''
GO
--View logins provided access to proxies
EXEC dbo.sp_enum_login_for_proxy
GO
et après cela, j'ai changé mon script PowerShell sur ce qui suit: (qui est un peu différent de @ Shawnmelton, mais cela fonctionne bien), les commentaires appréciés.
set-location -Path Microsoft.PowerShell.Core\FileSystem::"\\SQLBILON1\H$\sqlBackups\"
#-- set the number of days backups should be deleted -- in this case 2
#
$NumberOfDays = 2
#-- calculate the date of the backup files - if they are older than $days they will be deleted
#
$days = (Get-Date).AddDays(-$NumberOfDays)
#--get the list of the backup files to be deleted and delete them
#
Get-ChildItem -Recurse '*.abf' | ? {$_.CreationTime -lt $days} | Remove-Item