Memperbaiki data basis data produksi dengan aman

23

Bug terjadi dan terkadang data harus diperbaiki dalam produksi. Apa cara teraman untuk melakukan ini dari sudut pandang perusahaan besar? Apakah ada alat yang dapat membantu? Berikut adalah beberapa pertimbangan yang mendorong persyaratan ini ...

  1. Kita perlu mencatat siapa yang menjalankan kueri dan apa yang mereka jalankan
  2. Idealnya kita perlu memberi orang itu akses hanya menjalankan kueri terhadap tabel kepentingan dan hanya untuk waktu yang singkat
  3. Apa pun yang menjalankan kueri perlu memiliki beberapa kecerdasan tentang hal itu untuk tidak membiarkan berjalan lama dan mengunci SQL untuk berjalan tanpa izin eksplisit
  4. Proses ini harus DB agnostik atau setidaknya memahami DB2, Oracle, dan SQL Server.

Kami mencoba untuk mengurangi risiko permintaan perbaikan produk ad-hoc dari melakukan "hal yang salah" dan pada saat yang sama menambahkan beberapa keamanan / audit untuk proses tersebut. Pikiran atau Gagasan?

Andrew White
sumber
26
Jangan pernah biarkan manajemen berpikir ini adalah Prosedur Operasi Standar. Ini adalah operasi jantung terbuka darurat tanpa masker atau sarung tangan, BUKAN cara normal untuk menangani bug yang seharusnya tertangkap dalam pengujian.
Dan Pichelman
2
Itu karena Anda ingin bekerja dengan cara ini sehingga bug terjadi di tempat pertama.
Reactgular
7
@MathewFoscarini yang berkomentar tidak menambahkan apa pun pada percakapan atau mengklarifikasi apa pun. Ini juga salah karena saya tidak pernah mengatakan saya ingin hal-hal seperti ini bekerja, hanya saja kita memiliki beberapa pertimbangan yang harus terjadi. Beberapa jawaban di bawah ini menjawab semua poin saya dengan baik.
Andrew White
1
@AndrewWhite permintaan maaf saya Andrew tidak bermaksud melakukan pelanggaran.
Reactgular

Jawaban:

52

Tidak pernah memperbarui basis data produksi secara manual.

Tulis skrip.

Periksa tiga kali lipat, dan minta beberapa orang melakukan itu, bukan hanya satu orang yang melakukannya tiga kali.

Sertakan pertanyaan validasi pasca perubahan dalam skrip tersebut.

Setiap kali situasi memungkinkan, uji seluruh perubahan dalam transaksi yang dibatalkan pada akhirnya, setelah validasi pasca-perubahan berjalan. Saat yakin dengan hasilnya, ubah rollback menjadi komit.

Uji skrip tersebut dan mual terhadap database pengujian.

Buat cadangan sebelum menjalankan skrip terhadap basis data produksi.

Jalankan skrip.

Periksa, validasikan, dan periksa tiga kali data yang diubah menggunakan skrip validasi pasca-perubahan.

Tetap lakukan pemeriksaan visual.

Jika ada yang tampak mati, mundur dan pulihkan cadangan.

Jangan lanjutkan dengan data yang diubah sebagai data produksi sampai Anda benar-benar yakin bahwa semuanya baik-baik saja dan Anda telah keluar dari manajer (bisnis) yang terlibat.

Marjan Venema
sumber
21
@Andrew yang bukan alasan: lupakan satu WHEREdan database Anda akan turun untuk sisa hari itu. Atau seminggu.
CodeCaster
9
@AndrewWhite Anda memang meminta cara teraman untuk memperbaiki data, bukan yang tercepat . :-)
Eric King
9
@AndrewWhite - Anda sudah punya satu masalah. Jika Anda terburu-buru memperbaiki, maka Anda akan memiliki DUA masalah, jika tidak lebih, dan / atau Anda mungkin membuat masalah LEBIH BURUK, bukannya lebih baik.
Michael Kohne
6
@AndrewWhite - terus terang, menjadikannya sebagai proses yang tidak sepele akan menjadi nilai tambah bagi saya. Semua orang akan menyadari biaya dan risiko yang bertentangan dengan "well, kami telah melakukannya 23 kali sebelum tanpa masalah" kekejaman yang saya lihat di sejumlah tempat.
DaveE
3
@EricKing: xkcd.com/349
Robin
20

Jawaban oleh Marjan Venema secara teknis valid dan harus diikuti jika memungkinkan. Sayangnya, Marjan menjawab dari sudut pandang seorang ahli teori , atau seorang administrator basis data purist yang suka membuat hal-hal bersih. Dalam praktiknya, terkadang kendala bisnis membuat tidak mungkin melakukan hal-hal dengan cara yang bersih.

Bayangkan kasus berikut:

  1. Ada bug dalam produk perangkat lunak yang menyebabkannya berhenti berfungsi ketika ia mendeteksi apa yang dianggapnya sebagai beberapa ketidakkonsistenan data dalam basis data,

  2. Semua pengembang yang berpotensi memperbaiki bug di aplikasi tidak dapat dijangkau,

  3. Perusahaan saat ini kehilangan ribuan dolar per jam (katakanlah $ 6.000, yang berarti $ 100 per menit),

  4. Bug mempengaruhi beberapa tabel, salah satunya sangat besar, dan hanya menyangkut data itu sendiri, bukan skema,

  5. Untuk menghindari bug, Anda harus bereksperimen sedikit dengan data, yang melibatkan menghapus dan mengubahnya,

  6. Basis datanya besar dan butuh tiga jam untuk mengambil atau mengembalikan cadangan,

  7. Cadangan lengkap terakhir diambil tiga minggu lalu; ada juga cadangan inkremental harian, dan cadangan inkremental harian terakhir dilakukan 14 jam yang lalu,

  8. Cadangan basis data dianggap andal; mereka sangat diuji, termasuk baru-baru ini,

  9. Kehilangan 14 jam data tidak dapat diterima, tetapi hilangnya satu atau dua jam data adalah,

  10. Lingkungan pementasan terakhir digunakan enam bulan lalu; sepertinya tidak up to date, dan mungkin butuh berjam-jam mengaturnya,

  11. Basis datanya adalah Microsoft SQL Server 2008 Enterprise.

Cara bersih untuk melakukan sesuatu adalah dengan:

  1. Kembalikan cadangan dalam lingkungan pementasan,

  2. Eksperimen di sana,

  3. Periksa skrip akhir dua kali,

  4. Jalankan skrip di server produksi.

Hanya langkah pertama akan dikenakan biaya $ 18.000 untuk perusahaan Anda. Risiko ini cukup rendah jika Anda melakukan langkah ketiga dengan sempurna, tetapi karena Anda bekerja di bawah tekanan yang ekstrem, risikonya akan jauh lebih tinggi. Anda mungkin berakhir dengan skrip yang bekerja dengan sangat baik dalam pementasan, lalu mengacaukan basis data produksi.

Sebaliknya, Anda bisa melakukan seperti ini:

  1. Buat snapshot (Microsoft SQL Server mendukungnya, dan perlu beberapa detik untuk mengembalikan (dan tidak membuat apa pun) snapshot dari database yang memerlukan satu jam untuk cadangan; Saya membayangkan bahwa produk database lain juga mendukung snapshot),

  2. Eksperimen langsung pada basis data produksi, kembali ke snapshot jika terjadi kesalahan.

Sementara seorang purist akan memperbaiki database dengan cara yang bersih dan masih memiliki risiko untuk mengacaukan segalanya mengingat tekanan waktu sambil menghabiskan lebih dari $ 20.000 dari perusahaannya, seorang administrator database yang memperhitungkan kendala bisnis akan memperbaiki database dengan cara yang akan meminimalkan risiko (berkat foto) saat melakukannya dengan cepat.

Kesimpulan

Saya sendiri seorang purist, dan saya benci melakukan sesuatu dengan cara yang tidak bersih. Sebagai seorang pengembang, saya memperbaiki kode yang saya modifikasi, saya berkomentar bagian-bagian sulit yang tidak dapat di refactored, saya unit-test basis kode dan saya melakukan tinjauan kode. Tetapi saya juga mempertimbangkan keadaan di mana Anda melakukan sesuatu dengan bersih dan keesokan harinya Anda dipecat, atau Anda meminimalkan risiko dan dampak finansial dengan melakukan peretasan cepat yang berfungsi.

Jika beberapa pria IT ingin melakukan sesuatu dengan bersih hanya demi kebersihan sementara itu menyebabkan ribuan dolar kerugian bagi perusahaan, pria IT ini memiliki kesalahpahaman yang mendalam tentang pekerjaannya.

Arseni Mourzenko
sumber
2
Dan lakukan pekerjaan Anda di luar jam kerja jika memungkinkan - saat aktivitas pelanggan nyata minimal
Dan Pichelman
3
Sekalipun basis data Anda besar dan mencadangkannya membutuhkan banyak waktu, Anda mungkin bisa mengambil sebagian dari data itu dan melakukan percobaan.
Radu Murzea
3
Upvote untuk mengedit Anda, tetapi: jika data yang penting dan mahal untuk bisnis, itu benar-benar konyol bahwa prosedur operasional berada dalam kondisi benar-benar buruk tersebut. Tidak ada cadangan yang dapat diandalkan, tidak ada lingkungan yang mengurangi lingkungan produksi, yang memerlukan percobaan dengan data langsung: Saya pasti tidak ingin bekerja di perusahaan yang penuh tekanan dan tidak profesional.
CodeCaster
3
@CodeCaster: ini menyedihkan, tapi saya sering melihat ini dalam praktik, termasuk di perusahaan besar.
Arseni Mourzenko
3
Kemungkinan besar, bisnis mengalami kesulitan ini justru karena mereka tidak mengikuti saran di pos Marjan ketika mereka memiliki kesempatan.
Eric King
4

Memperbaiki data basis data produksi dengan aman. Apa cara teraman untuk melakukan ini dari sudut pandang perusahaan besar? Apakah ada alat yang dapat membantu?

Ini adalah praktik yang buruk dan gerbang undangan untuk lebih banyak masalah dan masalah data. Bahkan ada ungkapan yang menggambarkan pendekatan ini sebagai " Cepat dan Kotor ".

Melanjutkan perbaikan / pembaruan langsung pada server produksi sangat berbahaya , karena akan membebani Anda / perusahaan Anda ( gugatan hukum, data buruk / kotor, bisnis yang hilang, dll. )

Namun, bug akan ada di sana dan perlu diperbaiki. The de-facto standar industri adalah untuk menerapkan patch / (skrip penyebaran) pada Staging (lingkungan pra-produksi dengan salinan terbaru dari database prod) dan biarkan analis data / QA untuk memverifikasi perbaikan. Skrip yang sama harus dikontrol versi dan diterapkan ke lingkungan Prod untuk menghindari masalah.

Ada sejumlah praktik baik yang disebutkan dalam praktik baik basis data pasca- Staging terkait ini

Rangkaian referensi yang baik untuk dilihat adalah:

EL Yusubov
sumber
2

Di sebagian besar organisasi, saya telah bekerja memperbarui data di lingkungan langsung selalu dilakukan oleh sekelompok kecil orang dengan hak akses untuk melakukannya, biasanya dengan jabatan seperti DBA. Karena pembaruan hanya dapat dilakukan oleh sejumlah kecil orang, paling tidak ada kemungkinan mereka menjadi terbiasa dengan data dan karenanya mengurangi (tetapi tidak menghilangkan) risiko masalah.

Orang yang menulis skrip pembaruan akan melakukannya dalam pengujian (sesuai jawaban lain) dan mendapatkan sign off serius dari non-techies (mereka yang mengetahui sistem, ditambah seseorang dengan otoritas senior) bahwa fitur-fitur tampaknya 'benar lagi' di Selain pengujian paranoid mereka sendiri. Script, dan data, akan diverifikasi secara independen oleh teknisi lain (seringkali peran DBA yang saya sebutkan) pada pengujian sebelum dijalankan dalam produksi. Hasilnya akan diperiksa terhadap nilai yang diantisipasi (unik untuk setiap skenario, tetapi sering hal-hal seperti jumlah baris, dll.)

Di satu perusahaan tempat saya bekerja, mengambil cadangan bukanlah pilihan yang realistis, tetapi semua baris yang akan diperbarui dihapuskan ke file teks untuk referensi SEBELUM pembaruan, dan sekali lagi SETELAH pembaruan harus ada orang yang perlu merujuknya. Skrip dan data ini disimpan dalam Data Change Log yang terorganisir dengan baik.

Setiap bisnis itu unik, dan risiko memperbarui beberapa data jelas lebih besar daripada yang lain.

Dengan memiliki proses yang membuat orang harus melewati rintangan untuk melakukan pembaruan ini, mudah-mudahan Anda mempromosikan budaya yang membuat orang ingin memperlakukan ini sebagai upaya terakhir, dan menciptakan sikap "periksa dua kali lipat, periksa tiga kali" yang sehat di seputar hal-hal ini.

Wayne M.
sumber
Oh dan tentu saja sedapat mungkin menganalisis kode dalam aplikasi untuk memastikan setiap pembaruan dependen yang tersembunyi dalam logika dipenuhi ... Dan jika ada kemungkinan ada pemicu pada tabel yang Anda perbarui periksa untuk mereka dan pikirkan tentang apakah mereka perlu menonaktifkan atau tidak.
Wayne M
2

Ada kalanya Anda harus memperbaiki data di Prod yang tidak ada di server lain. Hal ini tidak hanya dari bug tapi bisa dari impor data dari file yang klien dikirim yang tidak benar atau dari masalah yang disebabkan oleh hacking ke sistem anda seseorang. Atau dari masalah yang disebabkan oleh entri data yang buruk. Jika basis data Anda besar atau kritis, Anda mungkin tidak punya waktu untuk memulihkan cadangan terbaru dan memperbaikinya pada dev.

Pertahanan pertama Anda (dan sesuatu yang tidak bisa dilakukan tanpa database Perusahaan!) Adalah tabel audit. Anda dapat menggunakannya untuk mendukung perubahan data yang buruk. Selanjutnya, Anda dapat menulis skrip untuk mengembalikan data ke keadaan sebelumnya dan uji mereka pada server lain jauh sebelum Anda harus mengembalikan data yang diaudit. Maka satu-satunya risiko adalah Anda mengidentifikasi catatan yang benar untuk dikembalikan.

Selanjutnya semua skrip untuk mengubah data pada produksi harus mencakup yang berikut:

Mereka harus dalam transaksi eksplisit dan memiliki blok TRY Catch.

Mereka harus memiliki mode uji yang dapat Anda gunakan untuk mengembalikan perubahan setelah Anda melihat apa yang seharusnya. Anda harus memiliki statment pilih dari sebelum perubahan dibuat dan satu kali dijalankan setelah perubahan untuk memastikan perubahan itu benar. Script harus memastikan jumlah baris yang diproses ditampilkan. Kami memiliki sebagian dari ini yang telah diatur dalam sebuah templat yang memastikan semua bagian telah selesai. Template untuk perubahan, membantu menghemat waktu dalam menulis perbaikan juga.

Jika ada sejumlah besar data untuk diubah atau diperbarui, maka pertimbangkan untuk menulis skrip untuk dijalankan dalam batch dengan komit untuk setiap batch. Anda tidak ingin mengunci seluruh sistem saat Anda memperbaiki sejuta catatan. Jika Anda memiliki sejumlah besar data untuk diperbaiki, pastikan dba atau seseorang yang terbiasa dengan tuning kinerja meninjau skrip sebelum menjalankan dan menjalankan selama jam kerja jika memungkinkan.

Selanjutnya semua skrip untuk mengubah apa pun pada produksi ditinjau kode dan dimasukkan ke dalam kontrol sumber. Semuanya - tanpa kecuali.

Akhirnya devs seharusnya tidak menjalankan skrip ini. Mereka harus dijalankan oleh dBA atau grup manajemen konfigurasi. Jika Anda tidak memiliki keduanya, maka hanya orang-orang yang terdepan dalam teknologi atau lebih tinggi yang memiliki hak untuk menjalankan segala sesuatu dengan paksa. Semakin sedikit orang yang menjalankan berbagai hal pada prod, semakin mudah untuk melacak masalah. Script harus ditulis sehingga dijalankan, tidak ada bagian yang disorot dan dijalankan satu langkah pada satu waktu. Ini adalah hal penting yang sering membuat orang bermasalah ketika mereka lupa untuk menyoroti klausa mana.

HLGEM
sumber
0

Saya telah memperbarui data berkali-kali dalam menjalankan basis data produksi. Saya setuju dengan jawaban di atas, bahwa ini tidak akan pernah menjadi prosedur operasi standar.

Itu juga akan mahal (kita akan melihat bahu masing-masing dan membahas 2 atau 3 mungkin)

Dan aturan emas: selalu buat pernyataan pilih untuk menunjukkan apa yang akan dilakukan sebelum melakukan pembaruan / hapus / masukkan pernyataan

Aturan emas ditegakkan oleh dua orang lain di tim!

pengguna99432
sumber
0

re: jawaban MainMa ...

Ada bug dalam produk perangkat lunak yang menyebabkannya berhenti berfungsi ketika ia mendeteksi apa yang dianggapnya sebagai beberapa ketidakkonsistenan data dalam basis data,

  • Bagaimana Anda tahu itu "bug"? Data tidak konsisten sesuai dengan aturan yang dibuat pengembang produk perangkat lunak.

Semua pengembang yang berpotensi memperbaiki bug di aplikasi tidak dapat dijangkau,

Perusahaan saat ini kehilangan ribuan dolar per jam (katakanlah $ 6.000, yang berarti $ 100 per menit),

  • Rupanya kehilangan $ 100 / menit tidak cukup penting bagi manajemen perusahaan untuk mereka temukan dan memastikan bahwa pengembang yang kompeten kembali untuk memperbaiki kesalahan mereka dan membantu Anda memulihkan database.

Bug mempengaruhi beberapa tabel, salah satunya sangat besar, dan hanya menyangkut data itu sendiri, bukan skema,

  • Semua masalah basis data "menyangkut" skema tersebut. Bagaimana skema dirancang adalah apa yang akan menentukan bagaimana Anda menyelesaikan masalah ini.

Untuk menghindari bug, Anda harus bereksperimen sedikit dengan data, yang melibatkan menghapus dan mengubahnya,

  • Itulah yang database pementasan Anda untuk. Anda mungkin perlu mengisi kembali dengan data "rusak" dari database produksi segera setelah Anda mengambil cadangan penuh produksi online.

Basis datanya besar dan butuh tiga jam untuk mengambil atau mengembalikan cadangan,

  • Maka Anda lebih baik memulainya segera sehingga dapat berjalan saat Anda menganalisis masalah, mengembangkan skrip koreksi Anda, menguji dan memperbaikinya bersama dengan pengembang dan DBA lainnya yang membantu Anda.

Cadangan lengkap terakhir diambil tiga minggu lalu; ada juga cadangan inkremental harian, dan cadangan inkremental harian terakhir dilakukan 14 jam yang lalu,

  • Anda tidak memiliki setidaknya cadangan harian online lengkap? Anda kacau. Tapi Anda mungkin terbiasa dengan itu. Untung cadangan lengkap yang Anda mulai berjalan di atas. Pastikan manajemen menelusuri setiap menit dari biaya yang bisa dihindari dengan cadangan online harian.

Cadangan basis data dianggap andal; mereka sangat diuji, termasuk baru-baru ini,

  • Luar biasa! Maka Anda mungkin tidak perlu mengembalikan database lebih dari sekali.

Kehilangan 14 jam data tidak dapat diterima, tetapi hilangnya satu atau dua jam data adalah,

  • Di bawah skenario yang telah Anda jelaskan, semua taruhan dimatikan. Ini adalah situasi "manajemen bencana informasi". Hal yang baik untuk dilakukan manajemen selama ini adalah mendokumentasikan biaya-biaya yang dapat dihindari di masa depan dengan cadangan prpoer dan prosedur serta sumber daya pemulihan.

Lingkungan pementasan terakhir digunakan enam bulan lalu; sepertinya tidak up to date, dan mungkin butuh berjam-jam mengaturnya,

  • Jika sistem pencadangan Anda mendukung pencadangan online (yaitu basis data yang beroperasi penuh selama pencadangan), maka Anda dapat melakukan ekstrak untuk mengisi ulang basis data pementasan pada saat yang sama jika Anda memiliki sumber daya perangkat keras yang cukup untuk menghindari memperlambat pencadangan.

Basis datanya adalah Microsoft SQL Server 2008 Enterprise.

  • Sulit melakukan semua ini tetapi bukan tidak mungkin. Semoga berhasil!
DocSalvager
sumber