Saya memiliki pekerjaan yang menyalin file besar ke tabel temp_a dan juga membuat indeks idx_temp_a_j pada kolom j. Sekarang setelah pekerjaan selesai menyalin semua data, saya harus mengganti nama tabel ini menjadi tabel prod_a yang menghadap produksi dan kueri selalu berjalan melawannya dengan waktu idle yang sangat sedikit. Tapi begitu saya menjalankan kueri ganti nama, kueri yang masuk dan kueri yang sudah berjalan, dicadangkan menghasilkan tingkat kesalahan API yang tinggi. Saya ingin tahu strategi apa yang mungkin dapat saya terapkan sehingga penggantian nama tabel terjadi dengan waktu henti yang lebih sedikit.

Sejauh ini, di bawah ini adalah strategi yang saya buat:

  1. Pertama, cukup ganti nama tabel dan izinkan kueri dicadangkan. Pendekatan ini tampaknya tidak dapat diandalkan karena kueri ganti nama tabel memperoleh KUNCI EKSKLUSIF dan semua kueri lainnya dicadangkan, saya mendapatkan tingkat kesalahan API tingkat tinggi.

  2. Kedua, tulis fungsi polling yang memeriksa apakah ada kueri yang berjalan sekarang jika tidak, lalu ganti nama tabel dan indeks. Dalam pendekatan ini fungsi polling akan memeriksa secara berkala untuk melihat apakah ada kueri yang dijalankan, kueri apa pun yang dijalankan, lalu tunggu , jika tidak maka jalankan kueri ubah tabel. Pendekatan ini hanya akan mengantri kueri yang datang setelah kueri perubahan nama tabel telah menempatkan KUNCI EKSKLUSIF di atas meja. Setelah penggantian nama selesai, kueri yang antri akan dieksekusi. Saya masih perlu menemukan API basis data yang akan membantu saya dalam menulis fungsi ini.

Apa strategi lain yang memungkinkan penggantian nama tabel yang "mulus" ini? Saya menggunakan postgres (PostgreSQL) 11.4 dan pekerjaan yang melakukan semua ini adalah dengan Python.

0
Akshay Deshpande 8 Agustus 2019, 03:05

1 menjawab

Jawaban Terbaik

Anda tidak dapat menghindari pemblokiran kueri serentak saat tabel diganti namanya.

Operasi itu sendiri sangat cepat, jadi setiap penundaan yang Anda alami pasti karena ALTER TABLE itu sendiri diblokir oleh transaksi yang berjalan lama menggunakan tabel. Semua operasi selanjutnya di atas meja kemudian harus mengantri di belakang ALTER TABLE.

Solusi untuk mengganti nama tanpa rasa sakit adalah dengan menjaga transaksi basis data sangat singkat (yang selalu diinginkan, karena juga mengurangi bahaya kebuntuan).

0
Laurenz Albe 8 Agustus 2019, 06:12