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.
| Nesne | Kardinalite | İçerik |
|---|---|---|
archiver_job | Tek tablo, her görev için bir satır | Kayı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 tablo | Günlüğe kaydedilen her kök anahtar ve durumu |
goarchive_meta | Tek tablo, tek satır | Takip ş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
| Kolon | Anlamı |
|---|---|
id | Vekil anahtar (surrogate key); günlük tablosunun adını belirler: archiver_job_log_<id> |
job_name | Görevin yapılandırmadaki adı; büyük/küçük harf ayrımı gözetilmeden benzersizdir |
root_table | Kök tablo; görevin ömrü boyunca sabittir |
job_type | archive, purge veya copy-only; görevin ömrü boyunca sabittir |
job_status | 0 boşta, 1 çalışıyor, 3 başarısız (son çalıştırma hatayla sona erdi) |
source_server_uuid, source_database | Görevin günlük satırlarının geldiği kaynak |
destination_database | Kopyaların yazıldığı veritabanı; job_schema değerinden farklı olabilir |
destination_server_uuid | Ayrı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_columns | Kö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_status | Ad | Ne Zaman Yazılır? |
|---|---|---|
1 | copied | archive: 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 |
2 | completed | archive ve purge: Silme işlemlerinden sonra; copy-only: Kopyalamayla birlikte |
4 | deleting | purge: 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.
Görev sabittir. Mevcut bir ad altında farklı bir
job_typeveyaroot_tablereddedilir. 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 .Kök anahtar sabittir.
root_key_columnsve günlüktekik1…kNkolonları, 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.Bağlama bilgisi (binding). Görevin bekleyen işi varken (archive ve purge: herhangi bir
copiedveyadeletingkök kayıt; copy-only:resumeayarı ne olursa olsun herhangi bircompletedkö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 archive Kaynak sunucu ve veritabanı, ilişkiler, hedef veritabanı purge Kaynak sunucu ve veritabanı, ilişkiler, wherecopy-only Kaynak 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ü
- Şemadaki ilk çalıştırma:
goarchive_metavearchiver_jobtabloları şema kilidi altında oluşturulur ve yeni şema3.0olarak etiketlenir. - Bir görevin ilk çalıştırması: Görev kaydedilir ve günlüğü oluşturulur.
- Çalıştırma sırasında:
job_status = 1olur, canlılık sinyali yenilenir ve günlük satırları yığın bazında yazılır. - Çalıştırmanın sonunda:
job_statusdeğeri0olur; hata durumunda ise3olur. Bir çökme veya zorla sonlandırma (kill),1değerini güncelliğini yitirmiş bir canlılık sinyaliyle birlikte bırakır. Günlüğünde hâlâcopiedveyadeletingkö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çeriyorsa | Tablolar 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 yoksa | archiver_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 yoksa | Tabloları 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 bildiriyorsa | Tabloları 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 |
