Doküman menüsü

Sürüm 3.0.0

Takip Tabloları

Takip tabloları referansı: Hedefteki kayıt tablosu, görev bazlı işlem günlükleri, durum değerleri ve her çalıştırmanın bu tablolarda yaptığı kontroller.

GoArchive tüm takip durumunu hedef sunucuda, destination.job_schema ile belirtilen şemada tutar; varsayılan olarak bu şema hedef veritabanının kendisidir. Bu tablolar, üretim ortamından nelerin çıktığının kaydıdır: İçlerindeki hiçbir veri otomatik olarak temizlenmez.

NesneKardinaliteİçerik
archiver_jobTek tablo, her görev için bir satırKayıt tablosu (registry): Tür, kök tablo, bağlama bilgisi (binding), durum, canlılık sinyali
archiver_job_log_<id>Her görev için bir tabloGünlüğe kaydedilen her kök anahtar ve durumu
goarchive_metaTek tablo, tek satırTakip şemasının etiketi, 3.0

GoArchive tabloları oluşturur ancak şemayı hiçbir zaman oluşturmaz. GoArchive hesabının bu şemada DELETE veya DROP yetkisi yoktur: Her silme işlemi bir DBA tarafından yapılır (Takip Tablolarının Bakımı ). Aşağıdaki örneklerde goarchive adlı bir job_schema ve 42 numaralı görev kimliği kullanılmıştır; bunları kendi değerlerinizle değiştirin.

SELECT id, job_name, root_table, job_type FROM goarchive.archiver_job;
-- görev kimliği 42  ->  goarchive.archiver_job_log_42

Görev Kayıt Tablosu (archiver_job)

CREATE TABLE IF NOT EXISTS archiver_job (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  job_name VARCHAR(255) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
  root_table VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  job_type VARCHAR(16) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  job_status TINYINT NOT NULL DEFAULT 0,
  source_server_uuid VARCHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  source_database VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  destination_database VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  destination_server_uuid VARCHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT '',
  config_fingerprint TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  root_key_columns TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  last_heartbeat_at DATETIME NULL,
  UNIQUE KEY uk_job_name (job_name),
  KEY idx_status (job_status)
) ENGINE=InnoDB
KolonAnlamı
idVekil anahtar (surrogate key); günlük tablosunun adını belirler: archiver_job_log_<id>
job_nameGörevin yapılandırmadaki adı; büyük/küçük harf ayrımı gözetilmeden benzersizdir
root_tableKök tablo; görevin ömrü boyunca sabittir
job_typearchive, purge veya copy-only; görevin ömrü boyunca sabittir
job_status0 boşta, 1 çalışıyor, 3 başarısız (son çalıştırma hatayla sona erdi)
source_server_uuid, source_databaseGörevin günlük satırlarının geldiği kaynak
destination_databaseKopyaların yazıldığı veritabanı; job_schema değerinden farklı olabilir
destination_server_uuidAyrılmıştır; bu sürümde yazılmaz ('')
config_fingerprintİlişkiler (ebeveynler, tablolar, kolon çiftleri) ve where metni, JSON biçiminde
root_key_columnsKök anahtarın kolon adları, anahtar sırasıyla ve JSON biçiminde; kayıt işlemi tamamlanmadıkça boştur
last_heartbeat_atÇalışma sırasında her 15 saniyede bir yenilenen UTC saat değeri; yaşını ölçmek için NOW() değil, her zaman UTC_TIMESTAMP() kullanın

Kaynak ve hedef kolonları ile config_fingerprint, görevin bağlama bilgisini (job binding) oluşturur: Takip günlüğündeki satırların hangi veriye ait olduğunu ve anlamını belirleyen olgular bunlardır.

Görev Günlüğü (archiver_job_log_<id>)

Görev günlüğü, görev kaydedildiğinde oluşturulur ve kök anahtara göre tiplendirilir: Her kök anahtar kolonu için, anahtar sırasıyla ve kolonun kendi veri tipi, karakter seti ve harf sıralaması (collation) ile bir k1…kN kolonu bulunur. Bir TIMESTAMP değeri aynı hassasiyette DATETIME olarak saklanır; böylece hiçbir oturum saat dilimi bu değeri kaydıramaz. (order_id BIGINT UNSIGNED, line_no INT) kök anahtarı için:

CREATE TABLE IF NOT EXISTS archiver_job_log_42 (
  `k1` bigint unsigned NOT NULL COMMENT 'order_id',
  `k2` int NOT NULL COMMENT 'line_no',
  ga_status TINYINT NOT NULL,
  ga_updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`k1`, `k2`),
  KEY idx_ga_status (ga_status)
) ENGINE=InnoDB

Her yorum (comment), okuyan kişiler için kök kolonun adını belirtir; GoArchive bu yorumları hiçbir zaman okumaz. Tablo InnoDB olarak kalmalı; PRIMARY KEY (k1…kN) ve iki ga_ kolonu oluşturulduğu haliyle korunmalıdır: Yapısı değiştirilmiş bir günlük tablosu başlangıçta reddedilir. Günlüğe yalnızca kök kayıtlar yazılır, alt satırlar hiçbir zaman yazılmaz.

Durum Değerleri

ga_statusAdNe Zaman Yazılır?
1copiedarchive: Yığının kopyalanması ve doğrulanmasıyla aynı hedef veritabanı işleminde yazılır; kaynak satırların tamamı henüz silinmemiştir
2completedarchive ve purge: Silme işlemlerinden sonra; copy-only: Kopyalamayla birlikte
4deletingpurge: Silme işlemlerinden önce, kendi veritabanı işleminde

Her durum değeri, kaydettiği işi yapan veritabanı işlemi içinde yazılır. Yeniden çalıştırmanın bu değerlerle ne yaptığı Çökme Sonrası Kurtarma ve Devam Etme bölümünde açıklanmıştır.

Başlangıç Kontrolleri

Herhangi bir kurtarma veya çalıştırma başlamadan önce, her çalıştırma görevini kayıt tablosuna karşı kontrol eder. Bunlar kayıt bütünlüğü (bookkeeping integrity) kontrolleridir: Hiçbir parametre bu kontrolleri atlatamaz.

  1. Görev sabittir. Mevcut bir ad altında farklı bir job_type veya root_table reddedilir. Kayıtlı bir addan yalnızca büyük/küçük harf farkıyla ayrılan bir ad da reddedilir: Yeni bir ad kullanın veya görevi kullanımdan kaldırın .

  2. Kök anahtar sabittir. root_key_columns ve günlükteki k1…kN kolonları, kök tablonun güncel birincil anahtarıyla eşleşmelidir: Adlar, sıra, veri tipleri, karakter setleri ve harf sıralamaları (collation). Günlük değişen bir anahtarı kaydedemeyeceği için değiştirilmiş anahtar reddedilir: Görevi kullanımdan kaldırın veya yeni bir ad kullanın.

  3. Bağlama bilgisi (binding). Görevin bekleyen işi varken (archive ve purge: herhangi bir copied veya deleting kök kayıt; copy-only: resume ayarı ne olursa olsun herhangi bir completed kök kayıt), bu işin dayandığı bölümlerde yapılan değişiklik reddedilir. Ret mesajı değişen bölümleri ve kök kayıt sayısını belirtir:

    Görev TürüKarşılaştırılanlar
    archiveKaynak sunucu ve veritabanı, ilişkiler, hedef veritabanı
    purgeKaynak sunucu ve veritabanı, ilişkiler, where
    copy-onlyKaynak sunucu ve veritabanı, ilişkiler, hedef veritabanı

    Ret mesajı üç çıkış yolu listeler: Özgün yapılandırmayı veya kaynağı geri yükleyip görevi bir kez çalıştırın; kök kayıtlardan vazgeçin ; ya da bir kaynak yük devrinden (failover) sonra görevi yeniden bağlayın . Bekleyen iş yoksa kayıtlı bağlama bilgisi güncel bilgiyle değiştirilir; böylece sorunsuz tamamlanan çalıştırmalar arasında yapılan değişiklikler serbesttir.

Günlük tablosu görevin benzersiz kimliğiyle adlandırıldığından, kayıt (registration) işlemi iki aşamada yürütülür: Önce görev satırı boş bir root_key_columns değeriyle eklenir; ardından günlük tablosu oluşturulur ve son olarak anahtar kolon adları kaydedilir. Boş bir root_key_columns bulan çalıştırma, kayıt işlemini tamamlar. Yeni günlüğün adıyla zaten var olan ve satır içeren ya da farklı bir yapıya sahip bir tablo hiçbir zaman sahiplenilmez: Bir DBA, hiçbir görevin kullanmadığını doğruladıktan sonra o tabloyu kaldırana (drop) veya archiver_job tablosunu geri yükleyene kadar görev kayıtsız kalır.

Yaşam Döngüsü

  1. Şemadaki ilk çalıştırma: goarchive_meta ve archiver_job tabloları şema kilidi altında oluşturulur ve yeni şema 3.0 olarak etiketlenir.
  2. Bir görevin ilk çalıştırması: Görev kaydedilir ve günlüğü oluşturulur.
  3. Çalıştırma sırasında: job_status = 1 olur, canlılık sinyali yenilenir ve günlük satırları yığın bazında yazılır.
  4. Çalıştırmanın sonunda: job_status değeri 0 olur; hata durumunda ise 3 olur. Bir çökme veya zorla sonlandırma (kill), 1 değerini güncelliğini yitirmiş bir canlılık sinyaliyle birlikte bırakır. Günlüğünde hâlâ copied veya deleting kök kayıtlar bulunan bir görev, durumu ne olursa olsun, kendi yeniden çalıştırması bunları bitirene kadar tablolarını çakışan görevlere karşı tutar.

Şema Etiketi

CREATE TABLE IF NOT EXISTS goarchive_meta (
  id TINYINT NOT NULL PRIMARY KEY,
  schema_version VARCHAR(16) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB

Tabloda tek satır bulunur: id = 1. Bu değer program sürümü değil, takip şeması etiketidir: Bir sürüm, tabloların yapısını veya bir kolonun anlamını değiştirdiğinde bu etiketi de değiştirir. GoArchive 3.0 yalnızca tek bir etiketi, 3.0 değerini yazar ve tanır. Başlangıçta yeni bir şemayı etiketler ve diğer tüm durumları reddeder; otomatik geçiş (migration) yoktur.

Bir şema reddedildiğinde, sürümü ne olursa olsun o şemayı kullanan tüm GoArchive süreçlerini durdurun. Ardından ret mesajına uyan satırdaki adımları izleyin:

Ret mesajına göre tablolar…Yapılacaklar
schema_version değerini "2.0" veya "2.2" olarak bildiriyorsa ya da 2.x biçiminde bir archiver_job içeriyorsaTablolar GoArchive 2.x veya daha eski bir sürüm tarafından yazılmıştır: 3.0 Sürümüne Yükseltme bölümüne bakın
3.0 olarak etiketlenmiş ancak archiver_job tablosu yoksaarchiver_job tablosunu yedekten geri yükleyin veya sıfırdan başlamak için tüm takip tablolarını kaldırın (drop)
Görev satırları içeriyor ancak schema_version etiketi yoksaTabloları GoArchive 3.0’ın yazdığını doğruladıktan sonra: INSERT INTO goarchive.goarchive_meta (id, schema_version) VALUES (1, '3.0'); ya da tüm takip tablolarını kaldırın
Başka herhangi bir schema_version değeri bildiriyorsaTabloları daha eski veya daha yeni başka bir GoArchive sürümü yazmıştır: Önce hangisi olduğunu tespit edin. Hedefteki tablolar daha eski bir sürüme aitse, yarım kalan görevleri ilgili sürümün kendi ikili dosyasıyla (binary) tamamlayıp ardından tabloları silin (DROP). Tablolar daha yeni bir sürüme aitse, GoArchive’ın o yeni sürümünü çalıştırın ve mevcut tablolara dokunmayın. Alternatif olarak job_schema ayarını başka bir şemaya yönlendirebilirsiniz; bu durumda mevcut tablolara dokunulmaz