Aracılığıyla paylaş


Şirket içi MySQL'i MySQL için Azure Veritabanı geçirme: Veri Geçişi

Veri geçişi, MySQL veritabanlarını şirket içi ortamlardan MySQL için Azure veritabanlarına geçirmenin önemli bir yönüdür. Bu makale, sorunsuz bir veri aktarımı sağlamak için çeşitli teknikler ve en iyi yöntemler hakkında kapsamlı bir kılavuz sunarak veri geçişinin inceliklerini ele alır. Mantıksal ve fiziksel geçiş gibi farklı veri geçiş yöntemlerini anlayıp veri bütünlüğü ve kapalı kalma süresi gibi olası zorlukları ele alarak geçiş stratejinizi etkili bir şekilde planlayabilir ve yürütebilirsiniz. Bu kılavuz, büyük veri kümelerini işleme, kesintileri en aza indirme ve veritabanı performansınızı ve güvenilirliğinizi iyileştirmek için Azure'ın sağlam özelliklerini kullanma bilgilerini size sağlar. Altyapınızı modernleştirmeyi veya veri yönetimi özelliklerinizi geliştirmeyi hedefleyen bu makale, başarılı bir veri geçişi için gereken içgörüleri sağlar.

Önkoşullar

MySQL'i şirket içi MySQL için Azure Veritabanı geçirme: Performans Temelleri

Veritabanını yedekleme

Verileri yükseltmeden veya geçirmeden önce ihtiyatlı bir adım olarak, MySQL Workbench kullanarak yükseltmeden önce veritabanını dışarı aktarın veya komutuyla el ile.mysqldump

Çevrimdışı ve çevrimiçi karşılaştırması

Bir geçiş aracı seçilmeden önce, geçişin çevrimiçi mi yoksa çevrimdışı mı olacağı belirlenmelidir.

  • Çevrimdışı geçişler , geçiş gerçekleşirken sistemin kapalı olmasını sağlar. Bu seçenek hiçbir işlem gerçekleşmemesini ve Verilerin durumunun Azure'da geri yüklendiğinde tam olarak beklenen durum olmasını sağlar.

  • Çevrimiçi geçişler , verileri neredeyse gerçek zamanlı olarak geçirir. Bu seçenek, veri iş yükünü kullanan kullanıcılar veya uygulama için çok az kapalı kalma süresi olduğunda uygundur. bu işlem, veya benzeri binlog bir çoğaltma yöntemi kullanarak verileri çoğaltmayı içerir.

WWI için ortamlarında, hedef geçiş zaman çerçevesinde gelen ve giden bağlantı için uygun değişikliklerin uygulanmasına izin vermeyen bazı karmaşık ağ ve güvenlik gereksinimleri vardır. Bu karmaşıklıklar ve gereksinimler temelde çevrimiçi yaklaşımın dikkate alınmasını ortadan kaldırır.

Not

Çevrimdışı ve Çevrimiçi geçiş hakkında daha fazla bilgi için Planlama ve Değerlendirme bölümlerini gözden geçirin.

Veri kayma

Çevrimdışı geçiş stratejileri veri kayma potansiyeline sahiptir. Yeni değiştirilen kaynak veriler geçirilen verilerle eşitlenmediğinde veri kayma oluşur. Bu durumda, tam dışarı aktarma veya delta dışarı aktarma gerekir. Veritabanına gelen tüm trafiği durdurup dışarı aktarma işleminizi gerçekleştirerek bu sorunu giderebilirsiniz. Tüm veri değişikliği trafiğini durdurmak mümkün değilse kaymayı hesaba eklemeniz gerekir.

Veritabanı tablolarında sayısal tabanlı birincil anahtarlar gibi sütunlar yoksa veya geçirilmesi gereken her tabloda bir tür değiştirme ve oluşturma tarihi yoksa değişikliklerin belirlenmesi karmaşık hale gelebilir.

Örneğin, sayısal tabanlı bir birincil anahtar varsa ve geçiş sıralama düzeninde içeri aktarılıyorsa, içeri aktarmanın nerede durdurulduğunu belirlemek ve bu konumdan yeniden başlatmak nispeten basittir. Sayısal tabanlı anahtar yoksa değiştirme ve oluşturma tarihi kullanmak ve yeniden sıralamalı bir şekilde içeri aktararak geçişi hedefte görülen son tarihten itibaren yeniden başlatabilirsiniz.

Performans önerileri

İhracat

  • Mydumper gibi çok iş parçacıklı modda çalışabilen bir dışarı aktarma aracı kullanma

  • MySQL 8.0 kullanırken, dışarı aktarma hızını artırmak için uygun olduğunda bölümlenmiş tabloları kullanın.

İçeri Aktar

  • Verileri yükledikten sonra kümelenmiş dizinler ve birincil anahtarlar oluşturun. Verileri birincil anahtar sırasına göre veya birincil anahtar bazı tarih sütunlarında (tarihi değiştirme veya oluşturma tarihi gibi) sıralı düzende yükle.

  • İkincil dizinlerin oluşturulmasını veriler yüklenene kadar geciktirin. Yüklendikten sonra tüm ikincil dizinleri oluşturun.

  • Yüklemeden önce yabancı anahtar kısıtlamalarını devre dışı bırakın. Yabancı anahtar denetimlerinin devre dışı bırakılması önemli performans kazançları sağlar. Bilgi tutarlılığı sağlamak için kısıtlamaları etkinleştirin ve yük sonrasında verileri doğrulayın.

  • Verileri paralel olarak yükleyin. Azure portalında sağlanan ölçümleri kullanarak kaynak çekişmesi ve izleme kaynaklarına neden olabilecek çok fazla paralellikten kaçının.

Geçişi gerçekleştirme

  • Veritabanını yedekleme

  • Azure Giriş bölgesini oluşturma ve doğrulama

  • Kaynak Sunucu Parametrelerini Yapılandırma

  • Hedef Sunucu Parametrelerini Yapılandırma

  • Veritabanı nesnelerini (şema, kullanıcılar vb.) dışarı aktarma

  • Verileri dışarı aktarma

  • Veritabanı nesnelerini içeri aktarma

  • Verileri içeri aktarma

  • Doğrulama

  • Hedef Sunucu Parametrelerini Sıfırla

  • Bir veya daha fazla Uygulamayı geçirme

Yaygın adımlar

Hangi yolun alınmasına rağmen, gerçekleştirilmesi gereken yaygın adımlar vardır:

  • Desteklenen bir Azure MySQL sürümüne yükseltme

  • Envanter Veritabanı Nesneleri

  • Kullanıcıları ve izinleri dışarı aktarma

En son MySQL sürümüne geçiş

WWI Konferansı veritabanı 5.5 çalıştırdığından bir yükseltme gerçekleştirmek gerekir. CIO, MySQL'in en son sürümüne (şu anda 8.0) yükseltmesini istedi.

8.0 sürümüne yükseltmenin iki yolu vardır:

  • Yerinde

  • Dışarı/İçeri Aktarma

Yükseltme yapmaya karar verirken, herhangi bir çakışma olup olmadığını belirlemek için yükseltme denetleyicisi aracını çalıştırmanız önemlidir. Örneğin, MySQL Server 8.0'a yükseltirken araç aşağıdaki çakışmaları denetler:

  • MySQL 8.0'da ayrılmış sözcüklerle çakışan veritabanı nesne adları

  • utf8mb3 karakter kümesinin kullanımı

  • ZEROFILL/görüntüleme uzunluğu türü özniteliklerinin kullanımı

  • 8.0'daki tablolarla çakışan tablo adları

  • Zamana bağlı tür kullanımı

  • 64 karakterden uzun yabancı anahtar kısıtlama adları

Yükseltme denetleyicisi sorun bildirmezse MySQL ikili dosyalarını değiştirerek yerinde yükseltme yapmak güvenlidir. Sorunları olan veritabanlarının dışarı aktarılması ve sorunların giderilmesi gerekir.

WWI senaryosu

MySQL örneğini 8.0'a başarıyla geçirdikten sonra WWI geçiş ekibi, DMS aracı şu anda yalnızca 5.6 ve 5.7'yi desteklediğinden, özgün MySQL'i şirket içinde MySQL için Azure Veritabanı geçiş yoluna geçirmenin artık kullanılamadığını fark etti. DMS gerekli ağ erişimi. WWI geçiş ekibi karmaşık ağ sorunlarını gidermeye hazır değildi. Bu çevresel sorunlar, geçiş aracı seçimlerini MySQL Workbench olarak daraltmıştı.

Veritabanı nesneleri

Test Planları bölümünde açıklandığı gibi, her şeyi geçirdiğinizden emin olmak için veritabanı nesnelerinin envanterinin geçiş öncesinde ve sonrasında yapılması gerekir.

Bu bilgileri oluşturmak için bir saklı yordam yürütmek isterseniz, aşağıdakine benzer bir şey kullanabilirsiniz:

DELIMITER //
CREATE PROCEDURE `Migration_PerformInventory`(IN schemaName CHAR(64))
BEGIN

        DECLARE finished INTEGER DEFAULT 0;
          DECLARE tableName varchar(100) DEFAULT "";

        #get all tables
            DECLARE curTableNames
                CURSOR FOR
                    SELECT TABLE_NAME FROM information_schema.tables where TABL
E_SCHEMA = schemaName;

            -- declare NOT FOUND handler
            DECLARE CONTINUE HANDLER
                FOR NOT FOUND SET finished = 1;

            DROP TABLE IF EXISTS MIG_INVENTORY;

                CREATE TABLE MIG_INVENTORY
                (
                      REPORT_TYPE VARCHAR(1000),
                      OBJECT_NAME VARCHAR(1000),
                  PARENT_OBJECT_NAME VARCHAR (1000),
                      OBJECT_TYPE VARCHAR(1000),
                      COUNT INT
                )
                ROW_FORMAT=DYNAMIC,
                ENGINE='InnoDB';
              INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                     'OBJECTCOUNT', 'TABLES', 'TABLES', COUNT(*)
              FROM
                     information_schema.tables
                where
                     TABLE_SCHEMA = schemaName;
                #### Constraints
              INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                      'OBJECTCOUNT', 'STATISTICS', 'STATISTICS', COUNT(*)
                FROM
                      information_schema.STATISTICS
                WHERE
                      TABLE_SCHEMA = schemaName;
                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                      'OBJECTCOUNT', 'VIEWS', 'VIEWS', COUNT(*)
                FROM
                      information_schema.VIEWS
                WHERE
                      ROUTINE_TYPE = 'FUNCTION' and
                      ROUTINE_SCHEMA = schemaName;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                      'OBJECTCOUNT', 'PROCEDURES', 'PROCEDURES', COUNT(*)
                FROM
                      information_schema.ROUTINES
                WHERE
                      ROUTINE_TYPE = 'PROCEDURE' and
                      ROUTINE_SCHEMA = schemaName;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                       'OBJECTCOUNT', 'EVENTS', 'EVENTS', COUNT(*)
                FROM
                       information_schema.EVENTS
                WHERE
                       EVENT_SCHEMA = schemaName;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                       'OBJECTCOUNT', 'USER DEFINED FUNCTIONS', 'USER DEFINED FUNCTIONS'
        , COUNT(*)
                FROM
                        mysql.func;

                INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)
                SELECT
                        'OBJECTCOUNT', 'USERS', 'USERS', COUNT(*)
                FROM
                        mysql.user
                WHERE
                        user <> '' order by user;

                OPEN curTableNames;

                getTableName: LOOP
                        FETCH curTableNames INTO tableName;
                        IF finished = 1 THEN
                              LEAVE getTableName;
                        END IF;

                   SET @s = CONCAT('SELECT COUNT(*) into @TableCount FROM ', schemaName,
'.', tableName);
        #SELECT @s;
            PREPARE stmt FROM @s;
        EXECUTE stmt;
        INSERT INTO MIG_INVENTORY (REPORT_TYPE,OBJECT_NAME, OBJECT_TYPE, COUNT)

                SELECT
                    'TABLECOUNT', tableName, 'TABLECOUNT', @TableCount;
        DEALLOCATE PREPARE stmt;

     END LOOP getTableName;
     CLOSE curTableNames;

   SELECT * FROM MIG_INVENTORY;
END //

DELIMITER ;

CALL Migration_PerformInventory('reg_app');
  • Kaynak db'de bu yordamın çağrılması aşağıdakini (kesilmiş çıkış) ortaya çıkar:

Kesilmiş çıkışın ekran görüntüsü.

  • Hedef veritabanı yordamı sonucu, geçişi tamamladıktan sonra aşağıdaki görüntüye benzemelidir. DB'de işlev olmadığına dikkat edin. İşlevler geçiş öncesinde ortadan kaldırıldı.

DB İşlevleri'nin ekran görüntüsü.

Kullanıcılar ve izinler

Başarılı bir geçiş, ilişkili kullanıcıların ve izinlerin hedef ortama geçirilmesini gerektirir.

Aşağıdaki PowerShell betiğini kullanarak tüm kullanıcıları ve onların izinlerini dışarı aktarın:

$username = "yourusername";
$password = "yourpassword";
mysql -u$username -p$password --skip-column-names -A -e"SELECT CONCAT('SHOW G
RANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" > Show
Grants.sql;

$lines = get-content "ShowGrants.sql"

foreach ($line in $lines)
{
mysql -u$username -p$password --skip-column-names -A -e"$line" >> AllGrants.sql
}
  • PowerShell ISE kullanarak yeni bir PowerShell betiği oluşturma (Kurulum belgesine bakın)

  • Kullanıcı adınızı kök olarak, parolanızı da kök kullanıcının parolası olarak ayarlayın

Ardından yeni MySQL için Azure Veritabanı hedefleyen betiği çalıştırabilirsinizAllGrants.sql:

$username = "yourusername";
$password = "yourpassword";
$server = "serverDNSname";
$lines = get-content "AllGrants.sql"

foreach ($line in $lines)
{
mysql -u$username -p$password -h$server --ssl-ca=c:\temp\BaltimoreCyberTrus
tRoot.crt.cer --skip-column-names -A -e"$line"
}

PowerShell kullanarak MySQL için Azure Veritabanı'nda kullanıcı da oluşturabilirsiniz: /azure/mysql/howto-create-users

Geçişi yürütme

Temel geçiş bileşenleri kullanıma açıkken artık veri geçişine devam etmek mümkündür. Daha önce tanıtılan çeşitli araçlar ve yöntemler vardı. WWI için MySQL Workbench yolunu kullanarak verileri dışarı aktarıp MySQL için Azure Veritabanı içeri aktaracaklar.

Veri geçişi denetim listesi

  • Ortamın karmaşıklığını ve çevrimiçi bir yaklaşımın uygun olup olmadığını anlayın.

  • Veri kayma hesabı. Veritabanı hizmetinin durdurulması olası veri kaymasını ortadan kaldırabilir.

  • Hızlı dışarı aktarma için kaynak parametreleri yapılandırın.

  • Hızlı içeri aktarma için hedef parametreleri yapılandırın.

  • Farklı bir kaynak sürüme sahip olan tüm geçişleri hedefle test edin.

  • Kullanıcı adları ve ayrıcalıklar gibi veri tabanlı olmayan nesneleri geçirin.

  • Geçiş yürütülürken tüm görevlerin belgelendiğinden ve işaretlendiğinden emin olun.

Sonraki adım