DB zur Always On Availability Group hinzufügen – Anleitung

Hier wird gezeigt, wie man eine MS-SQL Datenbank zu einer (schon vorhandenen) Verfügbarkeitsgruppe hinzufügt.

Vollsicherung der neuen DBs erstellen

Die Datenbanken können erst dann zu Always On availability groups hinzugefügt werden, nachdem diese mit einem Full Backup (irgendwohin) gesichert wurden. Es ist dem SQL-Server egal mit welchem System oder wohin die DBs gesichert werden, Hauptsache, man hat eine Vollsicherung für die DBs durchgeführt.

Anderenfalls kann man die DBs nicht auswählen und als „Status“ wird

„Full backup is required“ angezeigt.

In den Details steht:

„This database lacks a full database backup. Before you can add this database to an availability group, you must perform a full database backup.“

This database lacks a full database backup. Before you can add this database to an availability group, you must perform a full database backup.

Man kann also eine vorhandene Backup-Lösung benutzen, oder DB-Dumps per SQL oder PowerShell erstellen.

Mit folgendem PowerShell-Skript kann man alle DBs sichern. Alle DB der SQL-Instanz, außer die in der „ExcludeList“ werden gesichert. D.h. die, die man sichern will, müssen aus der Exclude-Liste entfernt werden.

# SQL DBs Backup (DB-Dump im "Copy-Only"-Modus)
# ------------------------------------------------------------------
# Macht einen DB-Dump im "Copy-Only"-Modus und kann problemlos und im laufenden Betrieb ausgeführt werden.
# Ausführen im PS
# Zeilen mit BackupFolder, LogFile, SQLInstance UND ExcludeList anpassen.

function Write-LogFile
{
	param (
		$Message,
		[Parameter(Mandatory = $true)]
		[string]$LogFileLocation,
		[Parameter(ParameterSetName = 'WriteError')]
		[switch]$AsFailure,
		[Parameter(ParameterSetName = 'WriteInformation')]
		[switch]$AsInformation,
		[Parameter(ParameterSetName = 'WriteDebug')]
		[switch]$AsDebug
	)
	
	$TimeStampNow = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
	$ServerName = $ENV:COMPUTERNAME
	if ($AsFailure)
	{
		if ($Message)
		{
			$CustomErrorMessage = "$TimeStampNow `t ERROR `t $ServerName `t $Message"
			$CustomErrorMessage | Out-File -FilePath $LogFileLocation -Append
			Write-Host $CustomErrorMessage -ForegroundColor Red
		}
		else
		{
			$TMP_ErrorMessage = $GLOBAL:Error[0].Exception.Message
			$ErrorMessage = "$TimeStampNow `t ERROR `t $ServerName `t $($TMP_ErrorMessage)"
			$ErrorMessage | Out-File -FilePath $LogFileLocation -Append
			Write-Host $ErrorMessage -ForegroundColor Red
		}
	}
	elseif ($AsInformation)
	{
		$InformationMessage = "$TimeStampNow `t INFOR `t $ServerName `t $Message"
		$InformationMessage | Out-File -FilePath $LogFileLocation -Append
		Write-Output $InformationMessage
	}
	elseif ($AsDebug)
	{
		$DebugMessage = "$TimeStampNow `t DEBUG `t $ServerName `t $Message"
		$DebugMessage | Out-File -FilePath $LogFileLocation -Append
		Write-Output $DebugMessage
	}
}

# Anpassen !!!
# ================================

$BackupFolder = "B:\Backup"   #Net Share funktioniert auch
$LogFile = "$($BackupFolder)\$(Get-Date -Format 'yyyyMMdd-HHmm')_BackupLogfile.log"
$SQLInstance = "ServerName\Instance"

$ExcludeList = 'master', 'tempdb', 'model', 'msdb'

# Alle DBs ausgeben in SSMS: SELECT * FROM master.dbo.sysdatabases

# Zeitstempel im Dateinamen
$timeStamp = Get-Date -format yyyyMMdd
#$timeStamp = Get-Date -format yyyyMMdd-HHmmss

# ================================


[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null

$srv = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $SQLInstance
$srv.ConnectionContext.StatementTimeout = 0
$dbs = New-Object Microsoft.SqlServer.Management.Smo.Database
$dbs = $srv.Databases

Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "Starting SQL Backup..."
Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "   loaded $($dbs.count) databases"
Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "   Excluding the following databases:"
Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "   $($ExcludeList)"
Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "   Saving backups to $($BackupFolder)"


$counter = 0
$DBCount = $dbs.count
foreach ($Database in $dbs)
{
	$counter++
	Write-Progress -Activity 'Backup' -Status "[$($Counter)/$($DBCount)] - $($Database.name)" -PercentComplete ((100/$DBCount)*$counter)
	if ($ExcludeList -contains $Database.name)
	{
		Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "Database $($Database.name) is in the exclude list and will be skipped"
		continue;
	}
		
	$bk = New-Object ("Microsoft.SqlServer.Management.Smo.Backup")
	$bk.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database
	$bk.BackupSetName = $Database.Name + "_backup_" + $timeStamp
	$bk.Database = $Database.Name
	$bk.CopyOnly = $true
	$bk.CompressionOption = 1
	$bk.MediaDescription = "Disk"
	$bk.Devices.AddDevice($BackupFolder + "\" + $Database.Name + "_" + $timeStamp + ".bak" , "File")
	
	TRY
	{
		Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "Starting Backup of database $($Database.name) with estimated DB size of $([Math]::Round($Database.Size,2))MB"
		Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "   Destination path: $($BackupFolder + '\' + $Database.Name + '_' + $timeStamp + '.bak')"
		$bk.SqlBackup($srv)
		Write-LogFile -LogFileLocation $LogFile -AsInformation -Message "   Successfully finished backup of database $($Database.name)" 
	}
	CATCH
	{
		Write-LogFile -LogFileLocation $LogFile -AsFailure -Message "$($Database.Name) backup failed!" 
		Write-LogFile -LogFileLocation $LogFile -AsFailure -Message "$($_.Exception.Message)" 
		Write-LogFile -LogFileLocation $LogFile -AsFailure
	}
}

Datenbanken hinzufügen

Wizard in SSMS starten

  1. SSMS (SQL Server Management Studio) auf dem primären Cluster-Knoten starten.
  2. Sich mit der SQL Instanz verbinden.
  3. Im Baum auf der linken Seite navigieren:
    1. Instanz > Always On High Availability > Availability Groups
      1. Rechte Maustaste auf den Namen der Gruppe. Hier „HA_GROUP (Primary)“
        1. Add Database…

SSMS - Always On High Availability - Availability Groups - Add Database

Wizard durchgehen

  1. Tab „Introduction“
    1. Next
  2. Tab „Select Databases“
    1. DBs auswählen, die hinzugefügt werden sollen
    2. Next
  3. Tab „Connect to Replicas“
    1. Button „Connect…“
    2. Im Fenster „Connect to Server“ noch einmal „Connect“ (mit den aktuellen Zugangsdaten).
    3. Next
  4. Tab „Select Data Synchronization“
    1. Option „Automatic seeding“ auswählen.
    2. Next
  5. Tab „Validation“
    1. Alle vier Haken sind grün und als Result steht überall „Success“
    2. Next
  6. Tab „Summary“
    1. Aufgelisteten DBs, die zur HA hinzugefügt werden, überprüfen.
    2. Button „Finish“
  7. Tab „Results“
    1. Meldung: „The wizard completed successfully“
    2. Result: Success
    3. Button „Close“

Prüfen & Warten

Dashboard öffnen

Um den Status besser sehen zu können, kann man das Dashboard öffnen. Dieses aktualisiert sich normalerweise automatisch.

  1. Im Baum auf der linken Seite navigieren:
    1. Instanz > Always On High Availability > Availability Groups
      1. Rechte Maustaste auf den Namen der Gruppe. Hier „HA_GROUP (Primary)“
        1. Show Dashboard…

Status beobachten

  • Ganz oben links ist noch ein roter Kreis mit einem ❌
    • Availability group state: Critical (1), Warnings (2)
    • Details im Link
      • ❌Availability group is not ready for automatic failover.
      • ⚠ Some availability replicas are not synchronizing data.
      • ⚠ Some synchronous replicas are not synchronized.
  • Availability replica:
    • ⚠ Die „Role“ Secondary steht mit „Synchronization State“ auf „Not Synchronizing“ und zeigt in der Spalte „Issues“ ein „Warning“
  • Einzelne neue (noch nicht synchronisierte) DBs stehen mit dem gelben Dreieck und Ausrufezeichen ⚠
    • Spalte Synchronization steht steht auf „Not Synchronizing“
    • Spalte „Failover Readi…“ steht auf „Data Loss“. In Details steht:
      • „Data synchronization state of availability database is not healthy.“
      • „Secondary database is not joined.“
        SSMS - Availability group state: Critical (1), Warnings (2)
    • Nach und nach kriegen die neuen DBs den grünen Kreis mit dem Häkchen ✅ und sind repliziert und in HA eingebunden.

 

provider: TCP Provider, error: 0 – The specified network name is no longer available.

System.Data.SqlClient.SqlException: A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 – The specified network name is no longer available.)

In diesem Artikel beschreibe ich eine mögliche Lösung der Fehlermeldung

System.Data.SqlClient.SqlException: A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 – The specified network name is no longer available.)

und

Es kann keine Verbindung mit dem „LobSystem“ (externes System) hergestellt werden. Ursache: „Es konnte eine Verbindung mit dem Server hergestellt werden, doch während des Anmeldevorgangs trat ein Fehler auf. (provider: TCP Provider, error: 0 – Der angegebene Netzwerkname ist nicht mehr verfügbar.)“

und Ähnlichen.

provider: TCP Provider, error: 0 – The specified network name is no longer available. weiterlesen

Dokumentenversionen auflisten und löschen per PowerShell

Alle Dokumentenversionen einer Dokumentenbibliothek inklusive Dateigrößen per PowerShell anzeigen und löschen

Manchmal fällt es auf, dass die SharePoint-Seiten bzw. Dokumentenbibliotheken viel Speicherplatz belegen, obwohl die Summe der eigentlichen Dateien viel geringer ist.

Der Speicherplatzverbrauch ist evtl. durch verbrauchte Speicher-Quota oder durch das Betrachten der Speichermetriken (Websiteeinstellungen > Websitesammlungsverwaltung > Speichermetriken) aufgefallen.

Storage Metrics - Speichermetriken - _layouts-storman.aspx - SharePoint 2013

Die echten Dateigrößen kann man sich anzeigen lassen, indem man die Dokumentenbibliotheks- oder Dateieigenschaften im Windows-Explorer per WebDav-Protokoll öffnet.
(Dokumentenbibliothek im IE > Reiter „Bibliothek“ > „Mit Explorer öffnen“). SharePoint Bibliothek - Reiter BIBLIOTHEK - Menü lang - Mit Explorer öffnen Button - SharePoint 2013

Falls die in Speichermetriken angezeigten Datengrößen von den Tatsächlichen Dateigrößen abweichen, dann könnte es sein, dass die Speicherbelegung durch die Dokumentenversionen zustande kommt. Denn auch wenn nur geringe Änderungen in einem (großen) Dokument durchgeführt werden, wird (bei eingeschalteter Versionierung) jedes mal eine komplette Kopie dieser großen Datei erstellt.

Mehrere Probleme bei aktivierter Versionierung

Deaktivieren der Versionierung löscht die Versionen nicht

Nach dem Deaktivieren der Versionierung bzw. Begrenzung der Anzahl der Versionen werden bereits vorhandene Dokumentenversionen nicht gelöscht bzw. nicht bereinigt, somit wird der bereits belegte Speicher nicht freigegeben.

Dokumentenversionen auflisten und löschen per PowerShell weiterlesen

SharePoint Unterseiten Liste – PowerShell Skript

SharePoint Unterseiten Liste (inklusive „SiteAdministrators“, „Created“ Date, „LastItemModifiedDate“, „Author“, „URL“, „ID“) per PowerShell Skript generieren

Das PowerShell-Skript in diesem Artikel erstellt eine SharePoint Unterseiten Liste. Diese Liste der Unterseiten (SubSites) enthält natürlich auch die dazugehörigen Websitesammlungen (Sitecollections) und die wichtigsten Informationen wie „ServerRelativeUrl“, „Title“, „SiteAdministrators“, „Created“ Date, „LastItemModifiedDate“, „Author“, „URL“, „ID“ und „ParentWebId“.

Beispielausgabe:

ServerRelativeUrl           Title          	SiteAdministrators         Created            	LastItemModifiedDate	Author                     Url                                                         ID                                  				ParentWebId
-----------------           -----          	------------------         -------            	--------------------	------                     ---                                                         --                                  				-----------
/                           Homepage		i:0#.w|domain\SiteAdmin1   20.02.2013 11:29:28	07.10.2017 01:00:04 	i:0#.w|domain\author1      https://sharepoint.domain.de                                c9176007-424f-4d03-a4f9-695b8df0a0f5				00000000-0000-0000-0000-000000000000
/Sitecollection1           	Projekte1  		i:0#.w|domain\SiteAdmin2   01.08.2013 09:03:34	14.06.2017 21:56:11 	i:0#.w|domain\author2      https://sharepoint.domain.de/Sitecollection1                a109b1e2-72be-4e55-bff6-e5612790d9d8				b9e00a9a-7822-488d-8289-049fe91f919b
/Sitecollection1/SubSite1   Projekt1   		i:0#.w|domain\SiteAdmin2   28.03.2014 09:18:13	17.06.2017 09:56:22 	i:0#.w|domain\author3      https://sharepoint.domain.de/Sitecollection1/SubSite1       6d392a7f-3c7d-43b1-9ad5-b9a0411a5c04				36f95aa9-31fc-4170-b87f-d78210832fab
/Sitecollection1/SubSite2   Projekt2   		i:0#.w|domain\SiteAdmin2   03.02.2016 12:09:28	14.06.2017 09:58:12 	i:0#.w|domain\author4      https://sharepoint.domain.de/Sitecollection1/SubSite2       6de69a56-3460-49e9-83f1-36a9fa3b1fe9				36f95aa9-31fc-4170-b87f-d78210832fab
/Sitecollection2           	Projekte2  		i:0#.w|domain\SiteAdmin3   28.03.2014 09:18:13	17.06.2017 09:56:22 	i:0#.w|domain\author5      https://sharepoint.domain.de/Sitecollection2                5055d2d7-50f4-43c8-aea8-165942e6631c				b9e00a9a-7822-488d-8289-049fe91f919b
/Sitecollection2/SubSite1   Projekt1   		i:0#.w|domain\SiteAdmin4   03.02.2016 12:09:28	14.06.2017 09:58:12 	i:0#.w|domain\author6      https://sharepoint.domain.de/Sitecollection2/SubSite1       5db93ed7-4b54-4517-879c-dd976daff3b8				ff0cd1e8-f640-4569-8ccd-feabe124c9ae

 

Diese SharePoint Unterseiten Liste wird in der PowerShell-Konsole ausgegeben. Außerdem wird die Tabelle in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und bei Bedarf per Mail verschickt. Die Erstellung bzw. den Versand kann man per Windows-Task z.B. einmal pro Woche automatisieren.

Das Skript könnte, zusammen mit den anderen Skripten aus unserer Artikelreihe „Inventarisierung„, dem SharePoint-Admin dabei helfen, seine SharePoint-Umgebung zu erfassen und den Überblick über Sitecollections, Datenbanken und andere Sharepointfarmkomponenten zu behalten und Reporting-Anfragen schnell beantworten zu können.

SharePoint Unterseiten Liste – PowerShell Skript weiterlesen

SharePoint Dienste Tabelle inklusive Status – PowerShell Skript

SharePoint Dienste Tabelle inklusive Dienst-Status per PowerShell Skript generieren

Das PowerShell-Skript in diesem Artikel erstellt eine SharePoint Dienste Tabelle. In dieser Tabelle werden alle SharePoint-Dienste, die in der Farm vorhanden sind, mit dem Status auf den SharePoint-Servern der SharePoint-Farm ausgegeben.

Beispielausgabe:

Service Server01 Server02 Server03 Server04
Server Suche Online Online Disabled Disabled
Verteilter Cache Online Online
Zentraladministration Online Online Disabled Disabled
. . . . . . . . . . . . . . .

Diese Tabelle der SharePoint Dienste inklusive Dienst-Status wird in der PowerShell-Konsole ausgegeben. Zusätzlich wird die Tabelle in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und per Mail verschickt. Die Erstellung bzw. den Versand kann man per Windows-Task z.B. einmal pro Woche automatisieren.

Das Skript könnte, zusammen mit den anderen Skripten aus unserer Artikelreihe „Inventarisierung„, dem SharePoint-Admin dabei helfen, seine SharePoint-Umgebung zu erfassen und den Überblick über Sitecollections, Datenbanken und andere Sharepointfarmkomponenten zu behalten.

SharePoint Dienste Tabelle inklusive Status – PowerShell Skript weiterlesen

SharePoint DB Liste nach Größe sortiert – PowerShell Skript

SharePoint DB Liste (nach Größe) sortiert per PowerShell Skript generieren

Das folgende PowerShell-Skript generiert eine SharePoint DB Liste, die nach Größe sortiert ist. Am Ende wird auch die Summe dieser Datenbanken berechnet.

Diese Liste wird in der PowerShell-Konsole ausgegeben. Zusätzlich wird die Liste in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und per Mail verschickt. Die Erstellung bzw. den Versand der SharePoint DBs Liste kann man per Windows-Task z.B. einmal pro Woche automatisieren.

Das Skript könnte, zusammen mit den anderen Skripten aus unserer Artikelreihe „Inventarisierung„, dem SharePoint-Admin dabei helfen, seine SharePoint-Umgebung zu erfassen und Überblick über Sitecollections, Datenbanken und andere Sharepointfarmkomponenten zu behalten.

SharePoint DB Liste nach Größe sortiert – PowerShell Skript weiterlesen

SharePoint AAM – Alternate Access Mapping – Liste – PowerShell Skript

SharePoint AAM (Alternate Access Mapping) Liste per PowerShell generieren

Das folgende PowerShell-Skript generiert eine Liste von SharePoint AAM (Alternate Access Mapping).

Diese Liste wird in der PowerShell-Konsole ausgegeben. Zusätzlich wird die Liste in eine Text-Datei (TXT) und eine CSV-Datei geschrieben und per Mail verschickt. Die Erstellung bzw. den Versand der SharePoint AAM Liste kann man per Windows-Task z.B. einmal pro Woche automatisieren.

Das Skript könnte, zusammen mit den anderen Skripten aus unserer Artikelreihe „Inventarisierung„, dem SharePoint-Admin dabei helfen, seine SharePoint-Umgebung zu erfassen und Überblick über Sitecollections, Datenbanken und andere Sharepointfarmkomponenten zu behalten.

SharePoint AAM – Alternate Access Mapping – Liste – PowerShell Skript weiterlesen

Nintex Workflows auflisten (Statusabhängig) – Tipp

Nintex Workflows auflisten (je nach Workflow-Status)

In diesem kurzen Tipp-Artikel zeige ich, wie man Nintex-Workflows nach Status (Running, Completed, Cancelled, Error) gefiltert, auflisten kann.

Das könnte z.B. dann hilfreich sein, wenn ein Workflow eine Mail verschickt, und man herausfinden will, welcher Workflow denn das nun genau tut.

Nintex Workflows auflisten (Statusabhängig) – Tipp weiterlesen