Configurez la réplication avec Transact-SQL

S’applique à :SQL Server sur Linux

Dans ce tutoriel, vous allez configurer la réplication de capture instantanée SQL Server sur Linux avec deux instances de SQL Server à l’aide de Transact-SQL (T-SQL). Le serveur de publication et le serveur de distribution sont identiques et l’abonné se trouve sur une instance distincte.

  • Activer les agents de réplication SQL Server sur Linux
  • Créer un exemple de base de données
  • Configurer le dossier de captures instantanées pour l’accès aux agents SQL Server
  • Configurer le serveur de distribution
  • Configurer le serveur de publication
  • Configurez la publication et les articles
  • Configurez l’abonné
  • Exécuter des tâches de réplication

Vous pouvez configurer tous les composants de réplication avec des procédures stockées de réplication.

Prerequisites

Pour terminer ce tutoriel, vous avez besoin de ce qui suit :

Étapes détaillées

  1. Activez les agents de réplication SQL Server sur Linux. Sur les deux machines hôtes, exécutez les commandes suivantes dans le terminal.

    sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
    sudo systemctl restart mssql-server
    
  2. Créez l’exemple de base de données et de table. Sur le serveur de publication, créez un exemple de base de données et de table qui servira d’articles pour une publication.

    CREATE DATABASE Sales;
    GO
    
    USE [Sales];
    GO
    
    CREATE TABLE Customer
    (
        [CustomerID] INT NOT NULL,
        [SalesAmount] DECIMAL NOT NULL
    );
    GO
    
    INSERT INTO Customer (CustomerID, SalesAmount)
    VALUES (1, 100),
        (2, 200),
        (3, 300);
    GO
    

    Sur l’autre instance de SQL Server, celle de l’abonné, créez la base de données destinée à recevoir les articles.

    CREATE DATABASE Sales;
    GO
    
  3. Sur le distributeur, créez le dossier snapshot pour que les agents SQL Server puissent lire et y écrire, et accordez l’accès à l’utilisateur mssql :

    sudo mkdir /var/opt/mssql/data/ReplData/
    sudo chown mssql /var/opt/mssql/data/ReplData/
    sudo chgrp mssql /var/opt/mssql/data/ReplData/
    
  4. Configurez le distributeur. Dans cet exemple, l’éditeur est également le distributeur. Exécutez les commandes suivantes sur le serveur de publication pour configurer également l’instance pour la distribution.

    DECLARE @distributor AS SYSNAME;
    DECLARE @distributorlogin AS SYSNAME;
    DECLARE @distributorpassword AS SYSNAME;
    
    -- Specify the distributor name. Use the 'hostname' command in the terminal to find the hostname.
    SET @distributor = N'<distributor instance name>'; -- In this example, it will be the name of the publisher
    SET @distributorlogin = N'<distributor login>';
    SET @distributorpassword = N'<distributor password>';
    
    -- Specify the distribution database.
    USE master;
    
    EXECUTE sp_adddistributor
        @distributor = @distributor; -- this should be the hostname
    
    -- Log into the distributor and create the distribution database.
    -- In this example, the publisher and distributor are on the same host.
    EXECUTE sp_adddistributiondb
        @database = N'distribution',
        @log_file_size = 2,
        @deletebatchsize_xact = 5000,
        @deletebatchsize_cmd = 2000,
        @security_mode = 0,
        @login = @distributorlogin,
        @password = @distributorpassword;
    GO
    
    -- Log into the distributor and configure the snapshot directory.
    -- In this example, the publisher and distributor are on the same host.
    USE [distribution];
    GO
    
    DECLARE @snapshotdirectory AS NVARCHAR (500) = N'/var/opt/mssql/data/ReplData/';
    
    IF (NOT EXISTS (SELECT * FROM sysobjects
        WHERE name = 'UIProperties' AND type = 'U'))
    CREATE TABLE UIProperties(id INT);
    
    IF (EXISTS (SELECT *
                FROM ::fn_listextendedproperty ('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', NULL, NULL)))
        EXECUTE sp_updateextendedproperty N'SnapshotFolder', @snapshotdirectory, 'user', dbo, 'table', 'UIProperties';
    ELSE
        EXECUTE sp_addextendedproperty N'SnapshotFolder', @snapshotdirectory, 'user', dbo, 'table', 'UIProperties';
    GO
    
  5. Configurez l’éditeur. Exécutez les commandes T-SQL suivantes sur l’éditeur.

    DECLARE @publisher AS SYSNAME;
    DECLARE @distributorlogin AS SYSNAME;
    DECLARE @distributorpassword AS SYSNAME;
    
    -- Specify the publisher name. Use the 'hostname' command in the terminal to find the hostname.
    SET @publisher = N'<instance name>';
    SET @distributorlogin = N'<distributor login>';
    SET @distributorpassword = N'<distributor password>';
    
    -- Specify the distribution database.
    -- Adding the distribution publishers
    EXECUTE sp_adddistpublisher
        @publisher = @publisher,
        @distribution_db = N'distribution',
        @security_mode = 0,
        @login = @distributorlogin,
        @password = @distributorpassword,
        @working_directory = N'/var/opt/mssql/data/ReplData',
        @trusted = N'false',
        @thirdparty_flag = 0,
        @publisher_type = N'MSSQLSERVER';
    GO
    
  6. Configurez la publication et la tâche de l’agent d’instantané. Exécutez les commandes T-SQL suivantes sur l’éditeur.

    USE [Sales];
    GO
    
    DECLARE @publisherlogin AS SYSNAME;
    DECLARE @publisherpassword AS SYSNAME;
    
    SET @publisherlogin = N'<publisher login>';
    SET @publisherpassword = N'<publisher password>';
    
    EXECUTE sp_replicationdboption
        @dbname = N'Sales',
        @optname = N'publish',
        @value = N'true';
    
    -- Add the snapshot publication
    EXECUTE sp_addpublication
        @publication = N'SnapshotRepl',
        @description = N'Snapshot publication of database ''Sales'' from Publisher ''<PUBLISHER HOSTNAME>''.',
        @retention = 0,
        @allow_push = N'true',
        @repl_freq = N'snapshot',
        @status = N'active',
        @independent_agent = N'true';
    
    EXECUTE sp_addpublication_snapshot
        @publication = N'SnapshotRepl',
        @frequency_type = 1,
        @frequency_interval = 1,
        @frequency_relative_interval = 1,
        @frequency_recurrence_factor = 0,
        @frequency_subday = 8,
        @frequency_subday_interval = 1,
        @active_start_time_of_day = 0,
        @active_end_time_of_day = 235959,
        @active_start_date = 0,
        @active_end_date = 0,
        @publisher_security_mode = 0,
        @publisher_login = @publisherlogin,
        @publisher_password = @publisherpassword;
    
  7. Créez l’article Customer à partir du Customer tableau.

    Exécutez les commandes T-SQL suivantes sur l’éditeur.

    USE [Sales];
    GO
    
    EXECUTE sp_addarticle
        @publication = N'SnapshotRepl',
        @article = N'Customer',
        @source_owner = N'dbo',
        @source_object = N'Customer',
        @type = N'logbased',
        @description = NULL,
        @creation_script = NULL,
        @pre_creation_cmd = N'drop',
        @schema_option = 0x000000000803509D,
        @destination_table = N'Customer',
        @destination_owner = N'dbo',
        @identityrangemanagementoption = N'manual',
        @vertical_partition = N'false';
    
  8. Configurez l’abonnement. Exécutez les commandes T-SQL suivantes sur l’éditeur.

    USE [Sales];
    GO
    
    DECLARE @subscriber AS SYSNAME;
    DECLARE @subscriber_db AS SYSNAME;
    DECLARE @subscriberLogin AS SYSNAME;
    DECLARE @subscriberPassword AS SYSNAME;
    
    SET @subscriber = N'<instance name>'; -- for example, MSSQLSERVER
    SET @subscriber_db = N'Sales';
    SET @subscriberLogin = N'<subscriber login>';
    SET @subscriberPassword = N'<subscriber password>';
    
    EXECUTE sp_addsubscription
        @publication = N'SnapshotRepl',
        @subscriber = @subscriber,
        @destination_db = @subscriber_db,
        @subscription_type = N'Push',
        @sync_type = N'automatic',
        @article = N'all',
        @update_mode = N'read only',
        @subscriber_type = 0;
    
    EXECUTE sp_addpushsubscription_agent
        @publication = N'SnapshotRepl',
        @subscriber = @subscriber,
        @subscriber_db = @subscriber_db,
        @subscriber_security_mode = 0,
        @subscriber_login = @subscriberLogin,
        @subscriber_password = @subscriberPassword,
        @frequency_type = 1,
        @frequency_interval = 0,
        @frequency_relative_interval = 0,
        @frequency_recurrence_factor = 0,
        @frequency_subday = 0,
        @frequency_subday_interval = 0,
        @active_start_time_of_day = 0,
        @active_end_time_of_day = 0,
        @active_start_date = 0,
        @active_end_date = 19950101;
    GO
    
  9. Exécutez les travaux de l’agent de réplication. Exécutez la requête suivante pour obtenir la liste des tâches :

    SELECT name,
           date_modified
    FROM msdb.dbo.sysjobs
    ORDER BY date_modified DESC;
    

    Démarrez la tâche de l’agent de capture instantanée pour générer l’instantané :

    USE msdb;
    GO
    
    -- Generate the publication snapshot, for example.
    EXECUTE dbo.sp_start_job N'PUBLISHER-PUBLICATION-SnapshotRepl-1';
    GO
    

    Lancer le travail d’agent de distribution pour distribuer la publication à l’abonné :

    USE msdb;
    GO
    
    -- Distribute the publication to the subscriber.
    EXECUTE dbo.sp_start_job N'DISTRIBUTOR-PUBLICATION-SnapshotRepl-SUBSCRIBER';
    GO
    
  10. Connectez-vous à l’abonné et interrogez les données répliquées.

    Sur l’abonné, vérifiez que la réplication fonctionne en exécutant la requête suivante :

    SELECT *
    FROM [Sales].[dbo].[Customer];
    

Dans ce tutoriel, vous avez configuré la réplication d’instantané de SQL Server sur Linux avec deux instances de SQL Server à l’aide de T-SQL.

  • Activer les agents de réplication SQL Server sur Linux
  • Créer un exemple de base de données
  • Configurer le dossier de captures instantanées pour l’accès aux agents SQL Server
  • Configurer le serveur de distribution
  • Configurer le serveur de publication
  • Configurez la publication et les articles
  • Configurez l’abonné
  • Exécuter des tâches de réplication