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

MissingSetupFile – Missing Server Side Dependencies – Fix

MissingSetupFile

MissingSetupFile – File is referenced [1] times in the database, but is not installed on the current farm

MissingSetupFile – File [Features\Brandysoft.SharePoint.ADSelfService\ADSelfService.dwp] is referenced [1] times in the database [WSS_Content], but is not installed on the current farm. Please install any feature/solution which contains this file.

MissingSetupFile – Auf die Datei wird in der Datenbank [1] Mal verwiesen, sie ist jedoch für die aktuelle Farm nicht installiert

MissingSetupFile – Auf die Datei ‚[Features\Brandysoft.SharePoint.ADSelfService\ADSelfService.dwp]‘ wird in der Datenbank [‚WSS_Content‘] [1] Mal verwiesen, sie ist jedoch für die aktuelle Farm nicht installiert. Installieren Sie ein Feature oder eine Lösung, das bzw. die diese Datei enthält. Auf mindestens eine nicht in der aktuellen Farm installierte Setupdatei wird in der Datenbank [‚WSS_Content‘] verwiesen. Installieren Sie die Features oder Lösungen, die diese Dateien enthalten.

Serverseitige Abhängigkeiten fehlen

Title
Serverseitige Abhängigkeiten fehlen.

[MissingSetupFile] Auf die Datei ‚[Features\Brandysoft.SharePoint.ADSelfService\ADSelfService.dwp]‘ wird in der Datenbank [‚WSS_Content‘] [1] Mal verwiesen, sie ist jedoch für die aktuelle Farm nicht installiert. Installieren Sie ein Feature oder eine Lösung, das bzw. die diese Datei enthält. Auf mindestens eine nicht in der aktuellen Farm installierte Setupdatei wird in der Datenbank [‚WSS_Content‘] verwiesen. Installieren Sie die Features oder Lösungen, die diese Dateien enthalten. MissingSetupFile – Missing Server Side Dependencies – Fix weiterlesen

SpShellAdmin – Benutzer für die PowerShell-Verwaltung der SharePoint-Farm berechtigen

Damit ein Benutzer die PowerShell-CMDlets zur Verwaltung der SharePoint-Farm verwenden kann, muss dieser zuerst dafür mit dem CMDlet Add-SPShellAdmin berechtigt werden.

Hier zeige ich kurz wie das gemacht wird, was dabei im Hintergrund passiert und was die Voraussetzungen für die Durchführung sind.

SpShellAdmin – Benutzer für die PowerShell-Verwaltung der SharePoint-Farm berechtigen weiterlesen

SiteOrphan – Database contains a site that is not found in the site map

SiteOrphan – Database contains a site that is not found in the site map

Die Datenbank enthält eine Website, die in der Websiteübersicht nicht gefunden wurde

Folgende Fehlermeldung wird nach dem Update durch den SharePoint-Assistenten (bzw. durch das Kommandozeilentool PsConfig) angezeigt:

. . .
Fehler beim Ausführen des Upgrades für SharePoint-Produkte.

Eine Ausnahme vom Typ ‚Microsoft.SharePoint.Upgrade.SPUpgradeException‘ wurde ausgelöst. Weitere Ausnahmeinformationen:
Die Datenbank [‚<SP_Database>‚] enthält eine Website (ID = [‚<ID>‚], URL = [‚/managedpath/site‚]), die in der Websiteübersicht nicht gefunden wurde. Trennen Sie die Datenbank, und fügen Sie sie dann erneut an. (EventID:ajxkz)

Das Upgrade wurde mit Fehlern abgeschlossen. Überprüfen Sie die Upgradeprotokolldatei unter ‚C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS\Upgrade-<Date>-<Time>-169.log‘. Die Anzahl der Fehler und Warnungen ist am Ende der Updateprotokolldatei aufgeführt.

Folgen Sie diesem Link, um weitere Informationen zur Behandlung von Upgradefehlern zu erhalten:
http://go.microsoft.com/fwlink/?LinkId=259653

Database contains a site that is not found in the site map

Database [<SP_Database>] contains a site (Id = [<ID>], Url = [/managedpath/site]) that is not found in the site map. Consider detach and reattach the database which contains the orphaned sites.
Restart upgrade if neccesary.

SiteOrphan – Database contains a site that is not found in the site map weiterlesen

Websitesammlung in eine neue Inhaltsdatenbank verschieben – Kurzanleitung

Vorhandene Websitesammlung in eine neue Inhaltsdatenbank verschieben

Es gibt einige Gründe, um eine zusätzliche Inhaltsdatenbank für SharePoint zu erstellen. Zum einen kann z.B. die maximal empfohlene Größe der Content-DB erreicht sein, zum anderen kann der Wunsch nach etwas mehr Performance-Gewinn die Aufteilung der Inhaltsdatenbanken rechtfertigen.

Man sollte aber nach Möglichkeit nicht einfach die Option „Inhaltsdatenbank hinzufügen“ (Add a content database) in der Zentraladministration benutzen, da die Einstellungen noch optimiert werden sollten.

Websitesammlung in eine neue Inhaltsdatenbank verschieben - Nicht benutzen - Inhaltsdatenbank hinzufügen - No - Add a content database - SharePoint 2013

In diesem Artikel zeige ich, wie man eine neue Inhaltsdatenbank für den SharePoint anlegt, konfiguriert und die vorhandene Websitesammlung (Sitecollection) in diese neue Datenbank verschiebt.

Websitesammlung in eine neue Inhaltsdatenbank verschieben – Kurzanleitung weiterlesen

SQL Server Setup – Empfehlungen für SharePoint

Die Standardeinstellungen eines SQL-Servers sind alles andere als Optimal für die SharePoint Umgebung. In diesem Artikel habe ich versucht das für den SharePoint optimale SQL Server Setup und die Einstellungen des SQL-Servers zusammenzutragen.

Das SQL Server Setup sollte nur als Orientierungshilfe (primär als Notizen für mich selbst) dienen, denn natürlich ist jede SharePoint-Umgebung sehr individuell und erfordert auch angepasstes SQL-Server-Setup.

SQL Server Setup – Empfehlungen für SharePoint weiterlesen

System.Data.SqlClient.SqlException (0x80131904): The INSERT permission was denied on the object ‚Locks‘, database ‚‚, schema ‚dbo‘

Problem

System.Data.SqlClient.SqlException (0x80131904): The INSERT permission was denied on the object ‚Locks‘, database ‚<SharePoint Config DB>‘, schema ‚dbo‘

Exception: System.Data.SqlClient.SqlException (0x80131904): The INSERT permission was denied on the object ‚Locks‘, database ‚<SharePoint Config DB>‘, schema ‚dbo‘.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

Eine Ausnahme vom Typ ‚System.Data.SqlClient.SqlException‘ wurde ausgelöst. Weitere Ausnahmeinformationen: Die INSERT-Berechtigung wurde für das Locks-Objekt, SP_Configuration-Datenbank, dbo-Schema, verweigert.

Fehler beim Initialisieren der Konfiguration der SharePoint-Produkte.

Eine Ausnahme vom Typ ‚System.Data.SqlClient.SqlException‘ wurde ausgelöst. Weitere Ausnahmeinformationen: Die INSERT-Berechtigung wurde für das Locks-Objekt, <SharePoint Config DB>, dbo-Schema, verweigert.

Gesamtanzahl der ausgeführten Konfigurationseinstellungen: 1
Gesamtanzahl der erfolgreichen Konfigurationseinstellungen: 0
Gesamtanzahl der erfolglosen Konfigurationseinstellungen: 6
Die Konfiguration der SharePoint-Produkte wurde erfolgreich beendet.
Fehler bei der Konfiguration der SharePoint-Produkte. Die Konfiguration muss vor Verwendung der SharePoint-Produkte ausgeführt werden. Weitere Informationen finden Sie im Diagnoseprotokoll unter ‚C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS\PSCDiagnostics_1_10_2015_10_6_57_509_1008856628.log‘ und im Anwendungsereignisprotokoll.

System.Data.SqlClient.SqlException (0x80131904): Die INSERT-Berechtigung wurde für das Locks-Objekt, SP_Configuration-Datenbank, dbo-Schema, verweigert.

In der Log-Datei C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\LOGS\PSCDiagnostics_....log ist folgendes zu finden:

ERR Fehler beim Initialisieren der Konfiguration der SharePoint-Produkte.
Eine Ausnahme vom Typ 'System.Data.SqlClient.SqlException' wurde ausgelöst. Weitere Ausnahmeinformationen: Die INSERT-Berechtigung wurde für das Locks-Objekt, <SharePoint Config DB>, dbo-Schema, verweigert.
System.Data.SqlClient.SqlException (0x80131904): Die INSERT-Berechtigung wurde für das Locks-Objekt, <SharePoint Config DB>, dbo-Schema, verweigert.
bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
bei System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
. . .

Event-ID: 5214

Unzureichende SQL-Datenbankberechtigungen für den Benutzer ‚Name: <Domain>\<User> SID: S-1-5-21-… ImpersonationLevel: None‘ in der Datenbank ‚<SharePoint Config DB>‚ für die SQL Server-Instanz ‚<SQL-Server>‚. Weitere Fehlerinformationen aus SQL Server finden Sie unten.

Die INSERT-Berechtigung wurde für das Locks-Objekt, <SharePoint Config DB>, dbo-Schema, verweigert.

System.Data.SqlClient.SqlException (0x80131904): The INSERT permission was denied on the object ‚Locks‘, database ‚‚, schema ‚dbo‘ 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