Gå till huvudinnehåll Gå till ytterligare innehåll

Arbeta med Microsoft SQL Server AlwaysOn Availability Groups

Funktionen Microsoft SQL Server AlwaysOn Availability Groups är en katastrofåterställningslösning med hög tillgänglighet som utgör ett alternativ på företagsnivå till databasspegling.

Anteckning om tipsI en Availability Group är det lämpligt att använda en fjärrdistributörskonfiguration. Då blir redundansen mellan replikerna sömlös. Mer information om fjärrdistributörskonfigurationen finns i Konfigurera publicering och distribution.

Förutsättningar

  • Autentiseringsuppgifter som används för att ansluta till enskilda Qlik Replicas bör vara identiska med de som används för att ansluta till AlwaysOn Listener.
  • Qlik Replicas bör vara konfigurerade att tillåta anslutningar.

    För att konfigurera detta bör DBA köra följande skript:

    ALTER AVAILABILITY GROUP [{ag_name}]
    MODIFY REPLICA ON '{replica_name}'
    WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = 
    'TCP://{replica_name}:{Port}'))

Konfigurera Gateway för dataflytt för åtkomst till AlwaysOn Listener

När du arbetar med AlwaysOn-tillgänglighetsgrupper måste du ange IP-adress/värdnamn och åtkomstuppgifter för AlwaysOn-lyssnaren i anslutningsegenskaper.

Begränsningar

DAG (Distributed Availability Groups) stöds inte.

Åtkomst till säkerhetskopierade loggar i AlwaysOn Availability Groups

Till skillnad från aktiva transaktionsloggar som är synkroniserade över AlwaysOn Availability Group, är säkerhetskopierade transaktionsloggar olika för varje enskild Qlik Replica. Följaktligen gäller att när Gateway för dataflytt behöver åtkomst till de säkerhetskopierade transaktionsloggarna, ”frågar” den varje Replica i tur och ordning om den har de nödvändiga loggarna, tills de säkerhetskopierade transaktionsloggarna har hittats. Observera att om en av dessa Replicas som Gateway för dataflytt försöker nå är offline, kommer Gateway för dataflytt att vänta tills denna Replica är tillbaka online och därefter fråga efter de säkerhetskopierade transaktionsloggarna.

Gateway för dataflytt behöver åtkomst till de säkerhetskopierade transaktionsloggarna på varje Replica (eller till dess att den hittar de nödvändiga loggarna) i följande scenarier:

  • Arbeta i läget med endast säkerhetskopiering.

    Mer information om detta läge finns i Microsoft SQL Server på plats (loggbaserad).

  • På grund av latens, dvs. om det finns en hög frekvens av händelser (ändringar) som Gateway för dataflytt inte kan bearbeta endast med den aktiva loggen.
Anteckning om information

För att läsa säkerhetskopierade loggar från AlwaysOn Availability Groups krävs det att anslutningar till alla Replicas öpppnas. Om du inte vill göra detta, ställer du in Ändra bearbetningsläge i anslutningsegenskaper som Endast onlineloggar.

Konfigurera en icke-sysadmin-användare när du arbetar med AlwaysOn-tillgänglighetsgrupper

Detta delavsnitt förklarar hur du stöder en icke-sysadmin-användare när du arbetar med AlwaysOn-tillgänglighetsgrupper. Mer information om hur du konfigurerar non-sysadmin i en standardmiljö hittar du på Konfigurera en icke-sysadmin-användare i en fristående miljö.

Så stödjer du en icke-sysadmin-användare när du arbetar med AlwaysOn-tillgänglighetsgrupper:

  1. Konfigurera Microsoft SQL Server för Replication på det sätt som beskrivs i Konfigurera Microsoft SQL Server för Qlik Replication.
  2. Aktivera MS-REPLICATION på källdatabasen. Detta kan antingen göras manuellt, eller genom att köra uppgiften en gång med en sysadmin-användare.

    Anteckning om information

    MS-REPLICATION-distributören bör antingen konfigureras som lokal, eller på ett sätt som medger åtkomst till icke-sysadmin-användare via den associerade länkade servern.

  3. Utför följande steg (a-l) på varje Replica:
    1. Skapa schemat [attrep] i Master DB.
    2. Skapa den tabellvärderade funktionen [attrep].[split_partition_list] i Master-databasen på följande sätt:

      USE [master]
      GO
      
      set ansi_nulls on
      go
      
      set quoted_identifier on
      go
      
      if (object_id('[attrep].[split_partition_list]','TF')) is not null
      drop  function [attrep].[split_partition_list];
      go
      
      create function [attrep].[split_partition_list] 
      ( 
      @plist varchar(8000),	--A delimited list of partitions	
      @dlm nvarchar(1)	--Delimiting character
      ) 
      returns @partitionsTable table --Table holding the BIGINT values of the string fragments
      (
      pid bigint primary key
      ) 
      as 
      begin
      declare @partition_id bigint;
      declare @dlm_pos integer;
      declare @dlm_len integer;
      
      set @dlm_len = len(@dlm);
      
      while (charindex(@dlm,@plist)>0)
      begin 
      set @dlm_pos = charindex(@dlm,@plist);
      set @partition_id = cast( ltrim(rtrim(substring(@plist,1,@dlm_pos-1))) as bigint);
      insert into @partitionsTable (pid) values (@partition_id)
      set @plist = substring(@plist,@dlm_pos+@dlm_len,len(@plist));
      end 
      set @partition_id = cast (ltrim(rtrim(@plist)) as bigint);
      insert into @partitionsTable (pid) values (  @partition_id  );
      return
      end
      GO
      
    3. Skapa proceduren[attrep].[rtm_dump_dblog] på Master-databasen enligt följande:

      USE [master]
      GO
      
      use [MASTER] 
      go 
      
      if (object_id('[attrep].[rtm_dump_dblog]','P')) is not null
      drop procedure [attrep].[rtm_dump_dblog]; 
      go
      
      set ansi_nulls on
      go 
      
      set quoted_identifier on 
      go
      							
      create procedure [attrep].[rtm_dump_dblog]
      (
      @start_lsn        varchar(32),
      @seqno            integer,
      @filename         varchar(260),
      @partition_list        varchar(8000), -- A comma delimited list: P1,P2,... Pn
      @programmed_filtering integer,
      @minPartition     bigint,
      @maxPartition     bigint
      ) 
      as begin
      
              declare @start_lsn_cmp varchar(32); -- Stands against the GT comparator
      
              SET NOCOUNT ON  -- Disable "rows affected display"
      
              set @start_lsn_cmp = @start_lsn;
              if (@start_lsn_cmp) is null
                      set @start_lsn_cmp = '00000000:00000000:0000';
      
              if (@partition_list is null)
              begin
                      RAISERROR ('Null partition list waspassed',16,1);
                      return
                      --set @partition_list = '0,';    -- A dummy which is never matched
              end
      
              if (@start_lsn) is not null
                      set @start_lsn = '0x'+@start_lsn;
      
      if (@programmed_filtering=0)
              SELECT
                      [Current LSN],
                      [operation],
                      [Context],
                      [Transaction ID],
                      [Transaction Name],
                      [Begin Time],
                      [End Time],
                      [Flag Bits],
                      [PartitionID],
                      [Page ID],
                      [Slot ID],
                      [RowLog Contents 0],
                      [Log Record],
                      [RowLog Contents 1] -- After Image
              FROM
                      fn_dump_dblog (
                              @start_lsn, NULL, N'DISK', @seqno, @filename,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default)
              where [Current LSN] collate SQL_Latin1_General_CP1_CI_AS >= @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS
              and
              (
                (  [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
                or
                (  [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
                      and
                      ( ( [context]   in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX') )
                      and       [PartitionID] in ( select * from master.attrep.split_partition_list (@partition_list,','))
                )
                or
                ([operation] = 'LOP_HOBT_DDL')
              )
      else
              SELECT
                      [Current LSN],
                      [operation],
                      [Context],
                      [Transaction ID],
                      [Transaction Name],
                      [Begin Time],
                      [End Time],
                      [Flag Bits],
                      [PartitionID],
                      [Page ID],
                      [Slot ID],
                      [RowLog Contents 0],
                      [Log Record],
                      [RowLog Contents 1] -- After Image
              FROM
                      fn_dump_dblog (
                              @start_lsn, NULL, N'DISK', @seqno, @filename,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default,
                              default, default, default, default, default, default, default)
              where [Current LSN] collate SQL_Latin1_General_CP1_CI_AS >= @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS
              and
              (
                (  [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
                or
                (  [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
                      and
                      ( ( [context]   in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX') )
                      and           ([PartitionID] is not null) and ([PartitionID] >= @minPartition and [PartitionID]<=@maxPartition)
                )
                or
                ([operation] = 'LOP_HOBT_DDL')
              )
              SET NOCOUNT OFF -- Re-enable "rows affected display"
      
      end
      GO
      
    4. Skapa certifikat på Master DB:

      Use [master]
      Go
      CREATE CERTIFICATE [attrep_rtm_dump_dblog_cert]
      ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'
      WITH SUBJECT = N'Certificate for FN_DUMP_DBLOG Permissions';
    5. Skapa inloggning från certifikatet, enligt följande:

      Use [master]
      Go
      CREATE LOGIN attrep_rtm_dump_dblog_login FROM CERTIFICATE
      [attrep_rtm_dump_dblog_cert];
    6. Lägg till inloggningen till sysadmin-serverrollen, enligt följande:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_dump_dblog_login];
    7. Lägg till signaturen i [master].[attrep].[rtm_dump_dblog] efter certifikat på följande sätt:

      Use [master]
      GO
      ADD SIGNATURE
      TO [master].[attrep].[rtm_dump_dblog]
      BY CERTIFICATE [attrep_rtm_dump_dblog_cert]
      					WITH PASSWORD = 'choose_your_own_pwd';
      Anteckning om information

      Om den lagrade proceduren återskapas, måste du lägga till signaturen igen.

    8. Skapa proceduren[attrep].[rtm_position_1st_timestamp] på Master-databasen enligt följande:

      use [master]
      if object_id('[attrep].[rtm_position_1st_timestamp]','P') is not null
      DROP PROCEDURE [attrep].[rtm_position_1st_timestamp];
      go
      create procedure [attrep].[rtm_position_1st_timestamp]
      (
      @dbname                sysname,      -- Database name
      @seqno                 integer,      -- Backup set sequence/position number within file
      @filename              varchar(260), -- The backup filename
      @1stTimeStamp          varchar(40)   -- The timestamp to position by
      ) 
      as begin
      
      SET NOCOUNT ON       -- Disable "rows affected display"
      
      declare @firstMatching table
      (
      cLsn varchar(32),
      bTim datetime
      )
      
      declare @sql nvarchar(4000)
      declare @nl                       char(2)
      declare @tb                       char(2)
      declare @fnameVar                 nvarchar(254) = 'NULL'
      
      set @nl  = char(10); -- New line
      set @tb  = char(9)   -- Tab separator
      
      if (@filename is not null)
      set @fnameVar = ''''+@filename +''''
      
      set @sql='use ['+@dbname+'];'+@nl+
      'select top 1 [Current LSN],[Begin Time]'+@nl+
      'FROM fn_dump_dblog (NULL, NULL, NULL, '+ cast(@seqno as varchar(10))+','+ @fnameVar+','+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default,'+@nl+
      @tb+'default, default, default, default, default, default, default)'+@nl+
      'where operation=''LOP_BEGIN_XACT''' +@nl+
      'and [Begin Time]>= cast('+''''+@1stTimeStamp+''''+' as datetime)'+@nl
      
      --print @sql
      delete from  @firstMatching 
      insert into @firstMatching  exec sp_executesql @sql    -- Get them all
      
      select top 1 cLsn as [matching LSN],convert(varchar,bTim,121) as [matching Timestamp] from @firstMatching;
      
      SET NOCOUNT OFF      -- Re-enable "rows affected display"
      
      end
      GO
      
    9. Skapa certifikat på Master DB:

      Use [master]
      Go
      CREATE CERTIFICATE [attrep_rtm_position_1st_timestamp_cert]
      ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'
      WITH SUBJECT = N'Certificate for FN_POSITION_1st_TIMESTAMP Permissions';
    10. Skapa inloggning från certifikatet, enligt följande:

      Use [master]
      Go
      CREATE LOGIN attrep_rtm_position_1st_timestamp_login FROM CERTIFICATE
      [attrep_rtm_position_1st_timestamp_cert];
    11. Lägg till inloggningen till sysadmin-serverrollen, enligt följande:

      ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_position_1st_timestamp_login];
    12. Lägg till signaturen i [master].[attrep].[rtm_position_1st_timestamp] efter certifikat på följande sätt:

      Use [master]
      GO
      ADD SIGNATURE
      TO [master].[attrep].[rtm_position_1st_timestamp]
      BY CERTIFICATE [attrep_rtm_position_1st_timestamp_cert]
      WITH PASSWORD = 'choose_your_own_pwd';
      Anteckning om information

      Om den lagrade proceduren återskapas, måste du lägga till signaturen igen.

  4. Skapa en användare med följande behörigheter/roller (i var och en av följande databaser):

    Anteckning om information

    Inloggningen ska skapas med samma SID på varje Replica.

    • Master DB (på varje Replica):
      • select för sys.fn_dblog
      • visa alla definitioner
      • visa servertillstånd (ska beviljas för inloggningen).
      • execute för sp_repldone
      • execute för sp_replincrementlsn
      • execute för sp_addpublication
      • execute för sp_addarticle
      • execute för sp_articlefilter
      • select för [attrep].[split_partition_list]
      • execute för [attrep].[rtm_dump_dblog]
      • execute för [attrep].[rtm_position_1st_timestamp]
    • MSDB DB (på varje Replica):
      • select för msdb.dbo.backupset
      • select för msdb.dbo.backupmediafamily
      • select för msdb.dbo.backupfile
    • För källdatabasen (eftersom databasen är synkroniserad kan det endast utföras på primär-Replican):
      • db_owner ROLL
  5. För att aktivera Qlik Talend Data Integration för att skapa publiceringen utan sysadmin-behörighet konfigurerar du publicera-flaggan och förskapar log reader-jobbet:

    USE master

    EXEC sp_replicationdboption @dbname = '<databaseName>', @optname = 'publish', @value = 'true'

    EXEC <databaseName>.sys.sp_addlogreader_agent

Var den här sidan till hjälp för dig?

Om du stöter på några problem med den här sidan eller innehållet på den, t.ex. ett stavfel, ett saknat steg eller ett tekniskt fel – meddela oss!