Aracılığıyla paylaş


T-SQL ile Çoğaltmayı Yapılandırma

Şunlar için geçerlidir:Linux üzerinde SQL Server

Bu öğreticide, Transact-SQL (T-SQL) kullanarak iki SQL Server örneğiyle Linux'ta SQL Server anlık görüntü çoğaltmayı yapılandırın. Yayımcı ve dağıtımcı aynı örnektedir ve abone ayrı bir örnektedir.

  • Linux'ta SQL Server çoğaltma aracılarını etkinleştirme
  • Örnek veritabanı oluşturma
  • SQL Server aracıları erişimi için anlık görüntü klasörünü yapılandırma
  • Dağıtımcıyı yapılandırma
  • Yayımcıyı yapılandırma
  • Yayını ve makaleleri yapılandırma
  • Aboneyi yapılandırma
  • Çoğaltma işlerini çalıştır

Tüm çoğaltma yapılandırmaları çoğaltma saklı yordamlarıile yapılandırılabilir.

Önkoşullar

Bu öğreticiyi tamamlamak için gereksinimler şunlardır:

  • Linux üzerinde SQL Server'ın en son sürümüne sahip iki SQL Server örneği

  • Sqlcmd veya SQL Server Management Studio (SSMS) gibi çoğaltmayı ayarlamak için T-SQL sorguları veren bir araç

    Bkz. Linuxüzerinde SQL Server'ı yönetmek için Windows'ta SQL Server Management Studio kullanma .

    Not

    SQL Server Çoğaltma, SQL Server 2017 (14.x) (CU 18) ve sonraki sürümlerde Linux üzerinde desteklenir.

Ayrıntılı adımlar

  1. Linux'ta SQL Server çoğaltma aracılarını etkinleştirin. Her iki konak makinesinde de terminalde aşağıdaki komutları çalıştırın.

    sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
    sudo systemctl restart mssql-server
    
  2. Örnek veritabanını ve tabloyu oluşturun. Yayımcıda, yayımın makaleleri gibi işlev görecek örnek bir veritabanı ve tablo oluşturun.

    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
    

    Diğer SQL Server örneğinde abone, makaleleri almak için veritabanını oluşturur.

    CREATE DATABASE Sales;
    GO
    
  3. SQL Server Aracılarının dağıtımcıda okuyacağı/yazacağı anlık görüntü klasörünü oluşturun, anlık görüntü klasörünü oluşturun ve 'mssql' kullanıcısına erişim verin

    sudo mkdir /var/opt/mssql/data/ReplData/
    sudo chown mssql /var/opt/mssql/data/ReplData/
    sudo chgrp mssql /var/opt/mssql/data/ReplData/
    
  4. Dağıtımcıyı yapılandırın. Bu örnekte yayımcı aynı zamanda dağıtımcıdır. Dağıtım için örneği yapılandırmak amacıyla yayımcıda aşağıdaki komutları çalıştırın.

    DECLARE @distributor AS SYSNAME;
    DECLARE @distributorlogin AS SYSNAME;
    DECLARE @distributorpassword AS SYSNAME;
    
    -- Specify the distributor name. Use 'hostname' command on in 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 distributor and create Distribution Database.
    -- In this example, our publisher and distributor is 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
    
    DECLARE @snapshotdirectory AS NVARCHAR (500);
    
    SET @snapshotdirectory = N'/var/opt/mssql/data/ReplData/';
    
    -- Log into distributor and create Distribution Database.
    -- In this example, our publisher and distributor is on the same host
    USE [distribution];
    GO
    
    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. Yayımcıyı yapılandırın. Yayımcıda aşağıdaki T-SQL komutlarını çalıştırın.

    DECLARE @publisher AS SYSNAME;
    DECLARE @distributorlogin AS SYSNAME;
    DECLARE @distributorpassword AS SYSNAME;
    
    -- Specify the distributor name. Use 'hostname' command on in 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. Yayın işini yapılandırın. Yayımcıda aşağıdaki T-SQL komutlarını çalıştırın.

    DECLARE @replicationdb AS SYSNAME;
    DECLARE @publisherlogin AS SYSNAME;
    DECLARE @publisherpassword AS SYSNAME;
    
    SET @replicationdb = N'Sales';
    SET @publisherlogin = N'<Publisher login>';
    SET @publisherpassword = N'<Publisher Password>';
    
    USE [Sales];
    GO
    
    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. Satış tablosundan makaleler oluşturun.

    Yayımcıda aşağıdaki T-SQL komutlarını çalıştırın.

    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,
        @identityrangemanagementoption = N'manual',
        @destination_table = N'customer',
        @destination_owner = N'dbo',
        @vertical_partition = N'false';
    
  8. Aboneliği Yapılandır'ı seçin. Yayımcıda aşağıdaki T-SQL komutlarını çalıştırın.

    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>';
    
    USE [Sales];
    GO
    
    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. Çoğaltma aracısı işlerini çalıştırın. İşlerin listesini almak için aşağıdaki sorguyu çalıştırın:

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

    Anlık Görüntüyü oluşturmak için Anlık Görüntü Çoğaltma Görevini çalıştırın.

    USE msdb;
    GO
    
    --generate snapshot of publications, for example
    EXECUTE dbo.sp_start_job N'PUBLISHER-PUBLICATION-SnapshotRepl-1';
    GO
    

    Anlık kopya çoğaltma görevini çalıştırarak işi başlatın.

    USE msdb;
    GO
    
    --distribute the publication to subscriber, for example
    EXECUTE dbo.sp_start_job N'DISTRIBUTOR-PUBLICATION-SnapshotRepl-SUBSCRIBER';
    GO
    
  10. Aboneyi ve çoğaltılmış veri sorgusunu bağlama.

    Abonede, aşağıdaki sorguyu çalıştırarak çoğaltmanın çalışıp çalışmadığını denetleyin:

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

Bu öğreticide, T-SQL kullanarak iki SQL Server örneğiyle Linux'ta SQL Server anlık görüntü çoğaltmayı yapılandırdınız.

  • Linux'ta SQL Server çoğaltma aracılarını etkinleştirme
  • Örnek veritabanı oluşturma
  • SQL Server aracıları erişimi için anlık görüntü klasörünü yapılandırma
  • Dağıtımcıyı yapılandırma
  • Yayımcıyı yapılandırma
  • Yayını ve makaleleri yapılandırma
  • Aboneyi yapılandırma
  • Çoğaltma işlerini çalıştır