sql >> Database >  >> RDS >> Sqlserver

Failover implementeren in MS SQL Server 2017 Standard

Inleiding

Vaak moeten we fouttolerantie van MS SQL Server DBMS garanderen, vooral wanneer er geen Enterprise-editie is, maar alleen de Standard-editie.

We willen graag opmerken dat we de Express-editie niet gaan onderzoeken omdat er aanzienlijke beperkingen zijn voor deze instantie. Natuurlijk kunnen we er een aantal omzeilen. Om het probleem met de databasegrootte van 10 GB op te lossen, kunnen we bijvoorbeeld een grote database opsplitsen in kleinere. Om dit te doen, kunnen we een nieuwe database maken op basis van een bepaalde eigenschap en de selecties uit dezelfde tabellen van verschillende databases combineren in de views in de hoofddatabase. Fouttolerantie in de Express-editie wordt echter uitgevoerd door een systeembeheerder of door uw eigen software of software van derden te gebruiken.

In dit artikel gaan we alle bestaande standaard fouttolerantietechnologieën voor MS SQL Server 2017 onderzoeken en een voorbeeld van het implementeren van de meest geschikte uniforme standaard van fouttolerantie in de Standard-editie.

Korte recensie

  1. AlwaysOn

    Belastingverdeling over alle partijen, alle partijen moeten qua kenmerken vergelijkbaar zijn. De synchrone modus zorgt voor maximale betrouwbaarheid van gegevensoverdracht; de prestaties zullen echter gelijk zijn aan de snelheid van de langzaamste partij. De asynchrone modus zorgt voor de hoogste prestaties, maar er kunnen niet-overeenkomende gegevens tussen de partijen zijn, wat kan leiden tot een complexer onderhoud en de kans dat de laatste wijzigingen verloren gaan in het geval van een storing van de hoofdpartij. De snelheid van overschakelen naar een synchrone modus is bijna onmiddellijk en vereist geen systeembeheerder en DBA, terwijl het in de asynchrone modus afhangt van de huidige status van DB-duplicaten en gewoonlijk ongeveer 5 minuten duurt (u kunt het schakelproces ook automatiseren door één DBA zonder een systeembeheerder ).Microsoft raadt het gebruik van deze technologie voor een database aan. Het is beschikbaar in de Enterprise-editie vanaf versie 2012 en hoger en met beperkingen in de Standard-editie (raadpleeg voor meer informatie Top 5 vragen over basisbeschikbaarheidsgroepen).

  2. Clustering

    Ondanks de eenvoud van configuratie is deze oplossing onbetrouwbaar vanwege de bottleneck in de vorm van één datawarehouse. In het geval van een storing in het datawarehouse, duurt het meer dan 1 uur om het te herstellen. Deze technologie is beschikbaar in de Standard-editie van versie 2008 en hoger.

  3. Replicatie

    Elke replicatie omvat het maken van systeemtriggers voor elke deelnemende tabel, terwijl snapshotreplicatie de hoofddatabase zwaar belast. Daarom kan snapshotreplicatie alleen worden uitgevoerd tijdens de daluren van de databasebelasting (bijvoorbeeld 's nachts), wat onaanvaardbaar is, omdat een hot-standby nodig is. Samenvoegreplicatie is moeilijk te onderhouden door sommige systemen (bijvoorbeeld CRM, NAV).
    Transactionele replicatie is mogelijk in de Enterprise-editie. Beschikbaar in de Standard-editie (samenvoegen en database-snapshots) en de Enterprise-editie (transacties) tot versie 2008 en hoger.

  4. Spiegelen

    Het is mogelijk in elke modus. De synchrone modus zorgt echter voor maximale betrouwbaarheid en snel schakelen, terwijl de asynchrone modus gebruikers de maximale prestatiesnelheid van de hoofddatabase biedt. Het is echter mogelijk dat gegevens tussen partijen niet overeenkomen en het overstappen kan langzaam gaan.

    Hier zorgt een getuige-server of DBA voor de automatische omschakeling op databaseniveau (bijvoorbeeld wanneer de CPU-belasting meer dan 50% is op de hoofdserver). Een systeembeheerder verleent de verbinding met de andere server. Een back-updatabase voor elk type spiegeling bevindt zich in een continue herstelmodus en is dus niet toegankelijk.

    Een herstelmodus van de database is vol.

    Microsoft beschouwt het als een verouderde databasetechnologie. Het is beschikbaar in de Standard-editie (in de synchrone modus) en in de Enterprise-editie (in de asynchrone modus) tot versie 2008 en hoger.

  5. Verzending transactielogboek

    Er zijn twee modi:continu herstel op een standby-server of herstel met vertraging. De eerste modus schakelt een back-updatabase naar een continue herstelmodus en in dit geval hebben we er geen toegang toe.

    De tweede modus schakelt de back-updatabase regelmatig naar een herstelmodus tijdens het implementeren van updates (de back-updatabase is beschikbaar tussen implementaties, maar dit is mogelijk op voorwaarde dat MS SQL Server-instanties van dezelfde versie zijn).

    Hoe het werkt:

    1. Soms wordt er een reservekopie van het databasetransactielogboek opgeslagen in een openbare map op de bron- en stand-byserver (de directory en het schema worden standaard elke 15 minuten geconfigureerd).
    2. De standby-server kopieert periodiek de back-up van het transactielogboek van de database naar een lokale map (de directory en het schema worden standaard elke 15 minuten geconfigureerd).
    3. De standby-server herstelt het transactielogboek vanaf de back-up van het transactielogboek (het schema wordt standaard elke 15 minuten geconfigureerd).

    Databasebeheerders kunnen het schakelproces op databaseniveau automatiseren, terwijl een systeembeheerder dit kan doen op het niveau van verbinding met de server.

    Er moet ook worden opgemerkt dat deze methode altijd werkt in de asynchrone modus. U kunt meerdere back-updatabases configureren.

    De databaseherstelmodus is vol of bulksgewijs geregistreerd.

    Het is beschikbaar in de Standard-editie tot de versie 2008 en hoger.

    Er zijn twee modi:continu herstel op een standby-server of herstel met vertragingen.

Samenvatting

De meeste voorkeur gaat uit naar verzending van transactielogboeken in de Standard-editie, omdat het handig is om het te gebruiken voor een soepele overgang van de ene server naar de andere, bijvoorbeeld bij het bijwerken van de omgeving. Bovendien is de verzending van het transactielogboek eenvoudig en gebruiksvriendelijk en werkt het altijd in de asynchrone modus, die de database niet veel laadt, in tegenstelling tot de synchrone spiegelmodus. In ieder geval is spiegelen acceptabel, als het mogelijk is om zijn eigen automatische schakeling te configureren; anders is valse omschakeling mogelijk (bijvoorbeeld wanneer de CPU van de hoofdserver voor meer dan 50% wordt belast).

Gebruik voor de Enterprise-editie de AlwaysOn-technologie.

Failover configureren bij verzending van transactielogboek

U kunt hier meer gedetailleerde informatie vinden over het configureren van de verzending van het transactielogboek. Bovendien is het mogelijk om dit proces te automatiseren door uw eigen hulpprogramma te ontwikkelen voor herhaald meervoudig gebruik, evenals voor terugkeer naar de hoofdserver nadat deze is gerepareerd in het geval van een failover.

Laten we eens kijken naar een van de mogelijke opties voor het debuggen van failover bij verzending van transactielogboeken op DBMS-niveau.

Opgemerkt moet worden dat deze methode geschikt is voor een server die is gereserveerd voor slechts één exemplaar van MS SQL Server-instantie, aangezien er voor meerdere gevallen een probleem is bij het bepalen welke taken moeten worden uitgevoerd en welke niet.

Laten we de volgorde van stappen beschrijven:

  1. Voer alle taken uit om de nieuwste bestanden van de bron te kopiëren (met een goed doordachte architectuur moet de map toegankelijk zijn, zelfs als de hoofdserver niet beschikbaar is)
  2. Schakel alle taken uit om bestanden van de bron te kopiëren
  3. Voer alle taken uit om een ​​database te herstellen met de nieuwste bestanden van de bron
  4. Schakel alle databasehersteltaken uit met de nieuwste bestanden van de bron
  5. Maak de database hersteld en de belangrijkste voor de verzending van het log, maar zonder een ontvanger
  6. Maak volledige back-ups van de database
  7. Taken maken om transactielogboeken te back-uppen

Hieronder ziet u een voorbeeld van het implementeren van de bovengenoemde volgorde als een opgeslagen procedure.

Opgemerkt moet worden dat het belangrijk is om een ​​login (bij voorkeur een domein login) te configureren waaronder de taken zullen worden uitgevoerd om back-ups van transactielogboeken te maken.

Een voorbeeld van het debuggen van de failover van de verzending van het transactielogboek

CREATE PROCEDURE [srv].[RunLogShippingFailover]
	@isfailover			bit=1,
	@login				nvarchar(255)=N'LOGIN', -- a domain login under which the tasks will be performed run to create backups of transaction logs.
	@backup_directory	nvarchar(255)=N'DIRECTORY'—public directory to send backups of transaction logs between MS SQL Server instances (for example, 'D:\Shared')
AS
	/*
	Moving the standby server to the main mode when the principal server is down if @ isfailover = 1 is fully automated
        when @isfailover equals 0, nothing happens - here we need to create anew the shipping log from the standby to the principal one,
        and then we need to switch to the principal server and then to configure the transaction log shipping again.
        this standby server is believed to receive backups of transaction logs from one server 
        */
BEGIN
	--if there is a shift switch to a standby server, you need to perform all the tasks to copy the latest files from the source
	if(@isfailover=1)
	begin
		select [job_id]
		into #jobs
		from [msdb].[dbo].[sysjobs]
		where [name] like 'LSCopy%';
	
		declare @job_id uniqueidentifier;
	
		while(exists(select top(1) 1 from #jobs))
		begin
			select top(1)
			@job_id=[job_id]
			from #jobs;
	
			begin try
				EXEC [msdb].dbo.sp_start_job @[email protected]_id;
			end try
			begin catch
			end catch
	
			delete from #jobs
			where [job_id][email protected]_id;
		end
		
		drop table #jobs;
	end
	
	--disable all the tasks for copying files from the source when switching to the backup server
	--enable all the tasks for copying files from the source when returning to the production server
	update [msdb].[dbo].[sysjobs]
	set [enabled]=case when (@isfailover=1) then 0 else 1 end
	where [name] like 'LSCopy%';
	
	--if we shift to a standby server, we need to perform all the tasks to restore databases by using the latest files from the source
	if(@isfailover=1)
	begin
		select [job_id]
		into #jobs2
		from [msdb].[dbo].[sysjobs]
		where [name] like 'LSRestore%';
	
		while(exists(select top(1) 1 from #jobs2))
		begin
			select top(1)
			@job_id=[job_id]
			from #jobs2;
	
			begin try
				EXEC [msdb].dbo.sp_start_job @[email protected]_id;
				EXEC [msdb].dbo.sp_start_job @[email protected]_id;
			end try
			begin catch
			end catch
	
			delete from #jobs2
			where [job_id][email protected]_id;
		end
		drop table #jobs2;
	end
	
	--disable all the tasks to restore databases using the latest files from the source when switching to a standby server
	--enable all the tasks to restore databases using the latest files when returning to the production server 
	update [msdb].[dbo].[sysjobs]
	set [enabled]=case when (@isfailover=1) then 0 else 1 end
	where [name] like 'LSRestore%';
	
	--when switching to a standby server, we make the database restorable and principal for log shipping without a recipient
	if(@isfailover=1)
	begin
		select [secondary_database] as [name]
		into #dbs
		from msdb.dbo.log_shipping_monitor_secondary
		where [secondary_server][email protected]@SERVERNAME;
	
		declare @db nvarchar(255);
	
		while(exists(select top(1) 1 from #dbs))
		begin
			select top(1)
			@db=[name]
			from #dbs;
	
			begin try
				RESTORE DATABASE @db WITH RECOVERY;
			end try
			begin catch
			end catch
	
			delete from #dbs
			where [name][email protected];
		end
	
		drop table #dbs;
	
		select [secondary_database] as [name]
		into #dbs2
		from msdb.dbo.log_shipping_monitor_secondary
		where [secondary_server][email protected]@SERVERNAME;
	
		declare @jobId BINARY(16);
		declare @command nvarchar(max);
	
		declare @dt nvarchar(255)=cast(YEAR(GetDate()) as nvarchar(255))
							  +'_'+cast(MONTH(GetDate()) as nvarchar(255))
							  +'_'+cast(DAY(GetDate()) as nvarchar(255))
							  +'_'+cast(DatePart(hour,GetDate()) as nvarchar(255))
							  +'_'+cast(DatePart(minute,GetDate()) as nvarchar(255))
							  +'.trn';
	
		declare @backup_job_name		nvarchar(255);
		declare @schedule_name			nvarchar(255);
		declare @disk					nvarchar(255);
		declare @uid					uniqueidentifier;
	
		while(exists(select top(1) 1 from #dbs2))
		begin
			select top(1)
			@db=[name]
			from #dbs2;
	
			set @[email protected]_directory+N'\'[email protected]+N'.bak';
			set @backup_job_name=N'LSBackup_'[email protected];
			set @schedule_name=N'LSBackupSchedule_'[email protected]@SERVERNAME+N'_'[email protected];
			set @command=N'declare @disk nvarchar(max)='+N''''[email protected]_directory+N'\'[email protected]+'_'[email protected]+N''''
						+N'BACKUP LOG ['[email protected]+'] TO DISK = @disk
							WITH NOFORMAT, NOINIT,  NAME = '+N''''[email protected]+N''''+N', SKIP, NOREWIND, NOUNLOAD,  STATS = 10;';
			set @uid=newid();
			
			begin try
				BACKUP DATABASE @db TO  DISK = @disk 
				WITH NOFORMAT, NOINIT,  NAME = @db, SKIP, NOREWIND, NOUNLOAD,  STATS = 10;
				
				EXEC msdb.dbo.sp_add_job @[email protected]_job_name, 
				@enabled=1, 
				@notify_level_eventlog=0, 
				@notify_level_email=0, 
				@notify_level_netsend=0, 
				@notify_level_page=0, 
				@delete_level=0, 
				@description=N'No description available.', 
				@category_name=N'[Uncategorized (Local)]', 
				@[email protected], @job_id = @jobId OUTPUT;
		
				EXEC msdb.dbo.sp_add_jobstep @[email protected], @[email protected]_job_name, 
				@step_id=1, 
				@cmdexec_success_code=0, 
				@on_success_action=1, 
				@on_success_step_id=0, 
				@on_fail_action=2, 
				@on_fail_step_id=0, 
				@retry_attempts=0, 
				@retry_interval=0, 
				@os_run_priority=0, @subsystem=N'TSQL', 
				@[email protected], 
				@database_name=N'master', 
				@flags=0;
	
				EXEC msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1;
	
				EXEC msdb.dbo.sp_add_jobschedule @[email protected], @[email protected]_job_name, 
				@enabled=1, 
				@freq_type=4, 
				@freq_interval=1, 
				@freq_subday_type=4, 
				@freq_subday_interval=5, 
				@freq_relative_interval=0, 
				@freq_recurrence_factor=0, 
				@active_start_date=20171009, 
				@active_end_date=99991231, 
				@active_start_time=0, 
				@active_end_time=235959, 
				@[email protected];
	
				EXEC msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)';
			end try
			begin catch
			end catch
	
			delete from #dbs2
			where [name][email protected];
		end
	
		drop table #dbs2;
	end
END

Om terug te keren naar de hoofdserver, is het noodzakelijk om de verzending van het transactielogboek van de standby-server naar de hoofdserver te configureren en vervolgens de foutopsporing van een failover uit te voeren. Vervolgens wordt de hoofdserver de productieserver. Daarna moet u de verzending van het transactielogboek configureren van de productieserver naar de stand-byserver.

Automatische aanpassing configureren voor het bewaken van de verzending van het transactielogboek

Gebruik de taak LSAlert_ en een rapport op de monitoringserver om de verzending van het transactielogboek te controleren. Om dit te doen, klikt u met de rechtermuisknop op de instantie op de monitoringserver en selecteert u vervolgens Rapporten/Standaardrapport/transactielogboek verzendstatus.

Heel vaak neemt de monitoringserver (als het geen productieserver is) na verloop van tijd ten onrechte de recente tijd voor het maken van een back-up van het databasetransactielogboek op de productieserver. Als gevolg hiervan krijgen we te maken met valse waarschuwingen.

Het is mogelijk om het probleem op te lossen met het volgende script:

Een voorbeeld van het configureren van de aanpassing voor het bewaken van verzending van transactielogboeken

CREATE PROCEDURE [srv].[AutoCorrectMonitorLogShipping] 
AS
BEGIN
	/*
		Adjustment of monitoring the transaction log shipping
	*/
	SET NOCOUNT ON;

    update t2
	set
	    t2.[last_backup_date]=t1.[BackupFinishDate]
	    ,t2.[last_backup_date_utc]=DateAdd(hour,-DateDiff(hour,GetUTCDate(),GetDate()),t1.[BackupFinishDate])
		,t2.[last_backup_file]=
RIGHT(t1.[PhysicalDeviceName], CHARINDEX('\',REVERSE(t1.[PhysicalDeviceName]),1)-1)

	from [PRODUCTION_INSTANCE_NAME].[SRV].[inf].[vServerLastBackupDB] as t1
	inner join [msdb].[dbo].[log_shipping_monitor_primary] as t2 on t1.[DBName] collate SQL_Latin1_General_CP1_CI_AS=t2.[primary_database] collate SQL_Latin1_General_CP1_CI_AS
	where t1.[BackupType]=N'log';
END

We kunnen een oproep voor een opgeslagen procedure automatiseren op tijd. We kunnen bijvoorbeeld een passende taak aanmaken in de Agent en deze elke 5 minuten inplannen. Natuurlijk moet de productieserver zijn gekoppeld aan de back-upserver (Serverobjecten\Gekoppelde servers).

Hier gebruiken we de [inf].[vServerLastBackupDB]-weergave in de SRV-database die de nieuwste databaseback-ups definieert:

Een voorbeeld van het implementeren van de vServerLastBackupDB-weergave:

CREATE VIEW [inf].[vServerLastBackupDB] as
with backup_cte as
(
    select
        bs.[database_name],
        backup_type =
            case bs.[type]
                when 'D' then 'database'
                when 'L' then 'log'
                when 'I' then 'differential'
                else 'other'
            end,
        bs.[first_lsn],
		bs.[last_lsn],
		bs.[backup_start_date],
		bs.[backup_finish_date],
		cast(bs.[backup_size] as decimal(18,3))/1024/1024 as BackupSizeMb,
        rownum = 
            row_number() over
            (
                partition by bs.[database_name], type 
                order by bs.[backup_finish_date] desc
            ),
		LogicalDeviceName = bmf.[logical_device_name],
		PhysicalDeviceName = bmf.[physical_device_name],
		bs.[server_name],
		bs.[user_name]
    FROM msdb.dbo.backupset bs
    INNER JOIN msdb.dbo.backupmediafamily bmf 
        ON [bs].[media_set_id] = [bmf].[media_set_id]
)
select
    [server_name] as [ServerName],
	[database_name] as [DBName],
	[user_name] as [USerName],
    [backup_type] as [BackupType],
	[backup_start_date] as [BackupStartDate],
    [backup_finish_date] as [BackupFinishDate],
	[BackupSizeMb], -- uncompressed size
	[LogicalDeviceName],
	[PhysicalDeviceName],
	[first_lsn] as [FirstLSN],
	[last_lsn] as [LastLSN]
from backup_cte
where rownum = 1;

Resultaat

In dit artikel hebben we kort alle mogelijke fouttolerantie- en snelle beschikbaarheidsopties in MS SQL Server 2017 besproken, evenals voorbeelden van het implementeren van debuggen van failover en automatische aanpassing van het bewaken van de verzending van het transactielogboek.

Referenties:

  • msdb
  • Beschikbare SQL Server 2017-edities
  • Altijd aan
  • SQL Server Failover Cluster Installatie
  • Replicatie
  • Spiegelen
  • Verzending loggen
  • Log verzending configureren

  1. Ontbrekend artefact com.microsoft.sqlserver:sqljdbc4:jar:4.0

  2. Maak een database in SQL Server 2017

  3. Hoe een applicatie met sql-serverdatabase op clients te implementeren

  4. MySQL update een samengevoegde tabel