it-swarm.asia

Praktik terbaik untuk perubahan skema dan migrasi data ke database langsung tanpa downtime?

Bagaimana Anda membuat perubahan skema ke database langsung tanpa downtime?

Sebagai contoh, katakanlah saya memiliki database PostgreSQL dengan tabel termasuk berbagai data pengguna seperti alamat email dll, semua yang terkait dengan pengguna tertentu. Jika saya ingin memindahkan alamat email ke tabel khusus baru, saya harus mengubah skema dan kemudian memigrasikan data email ke tabel baru. Bagaimana ini bisa dilakukan tanpa berhenti menulis ke meja asli? Tentunya sementara data dituliskan dari tabel lama ke yang baru, data baru akan terus ditulis ke meja lama dan dilewatkan, bukan?

Saya kira masalah ini cukup sering muncul tetapi saya tidak dapat menemukan solusi standar untuk mengatasinya.

Artikel ini berurusan dengan masalah tetapi saya tidak begitu mengerti langkah 3. Dia mengatakan untuk menulis ke kedua tabel, kemudian memigrasikan data lama dari tabel pertama ke yang baru. Bagaimana Anda memastikan Anda hanya memigrasi data lama?

(Saya menggunakan PostgreSQL di Herok .)

44
Dan Leary

Anda hampir memiliki jawaban Anda:

  1. Buat struktur baru secara paralel
  2. Mulai menulis ke kedua struktur
  3. Migrasikan data lama ke struktur baru
  4. Hanya tulis dan baca struktur baru
  5. Hapus kolom lama

Adapun langkah, gunakan sesuatu seperti ini (dalam satu transaksi):

Masukkan apa yang belum ada:

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);

Perbarui yang telah berubah sementara itu:

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;

Data baru tidak akan disentuh, karena identik di kedua tempat.

27