(5-2) Cara untuk memigrasi tabel SQL besar

Pendahuluan


Halo semuanya! Ini adalah artikel pertama saya dan saya menulisnya atas nama seorang insinyur pengembangan junior di C #. Jadi tidak akan ada informasi terperinci tentang SQL, hanya informasi dan pemikiran praktis untuk menyelesaikan masalah yang agak tidak jelas yang harus saya hadapi untuk pendatang baru yang sama seperti saya.

Pertama, saya akan menggambarkan rumusan masalah saya sebagai contoh, di mana ada kebutuhan nyata untuk memindahkan meja besar.

Jadi, katakanlah Anda memiliki layanan web dan database SQL (MS-SQL) dengan tabel huruf html yang dikirimkan layanan Anda kepada pengguna. Surat disimpan selama beberapa tahun dan tidak dapat dihapus, karena diperlukan untuk mengumpulkan statistik dan analitik. Namun, setiap tahun jumlah surat bertambah, basis data bertambah, dan ruang pada server SQL semakin kecil (dalam kasus kami, faktor lain memulihkan database ke situs uji, karena waktunya meningkat secara proporsional) dan sesuatu perlu dilakukan dengan ini harus dilakukan. Untungnya, dalam kasus kami ada server gratis dengan banyak ruang kosong (pada kenyataannya mungkin tidak, dan tentu saja ini adalah solusi sementara, tetapi ini di luar ruang lingkup artikel). Jadi masalah muncul dari memindahkan meja besar (dan mengatakan "besar", maksud saya meja yang sangat besar, semua yang saya lihat saat mencari solusi serupa berada di wilayah 60-100 GB, dalam kasus kami meja tersebut memiliki berat lebih dari 300 GB).

Kami akan mempertimbangkan beberapa cara untuk menyelesaikan masalah ini, tetapi tidak semuanya berhubungan dengan transfer dari jenis server-server. Terkadang mungkin perlu untuk mentransfer tabel antara database dalam server yang sama. Juga, beberapa metode murni teoretis, saya tidak menguji semuanya dalam praktek, tetapi mereka mungkin harus bekerja.

Metode -1. Data


Tidak peduli seberapa jelas kedengarannya, tetapi Anda harus tahu data apa yang akan Anda transfer. Paling sering, data tidak disimpan dengan cara yang paling optimal, dan kelebihan informasi juga dapat disimpan. Sangat mungkin bahwa dalam kasus khusus Anda, Anda dapat melakukannya tanpa mentransfer semua data.

Pertama, menghapus kolom mungkin dapat membantu Anda, tetapi ini adalah operasi pemblokiran, dan tidak selalu mungkin untuk menghentikan layanan web. Dan di Habré ada artikel yang menceritakan bagaimana hal itu dapat dilakukan.

Kedua, jangan lupa tentang normalisasi. Mungkin beberapa data dapat ditransfer ke kamus (dalam hal surat, adalah mungkin untuk tidak menyimpan isi surat, tetapi templat dengan data yang dimasukkan di sana), dan hanya id dari elemen-elemen ini yang dapat disimpan dalam tabel besar, ini dapat membebaskan banyak ruang untuk Anda.

Metode 0. PILIH KE


Lelucon =) Jadi Anda hanya bisa menempatkan diri Anda sebagai basis. Namun, jika kita berbicara tentang ukuran kecil dari tabel (lalu apa yang Anda lakukan di sini), Anda dapat mencoba mentransfer database menggunakan instruksi ini. Juga, jika Anda memiliki basis tes, Anda dapat melakukan percobaan untuk mengevaluasi total waktu transfer menggunakan metode ini "di dahi."

Metode 1. Cadangan


Cara yang paling "kanonik", inilah yang menjadi solusi untuk masalah saya. Kami membuat cadangan dari database yang berisi tabel kami, dan mengembalikannya di server lain dan menghapusnya dari semua yang tidak perlu. Lebih lanjut, jika dimungkinkan untuk menghentikan layanan web, Anda dapat memindahkannya kembali dengan mengatur catatan di tabel yang ditransfer, dan menghapus yang lama * * (di sini kemungkinan besar akan ada saat ketika akan diperlukan untuk menulis pertanyaan ke sana dengan bergabung, untuk ini google cara menghubungkan sql- server). Jika ini tidak memungkinkan, kami memperbaiki id dari huruf terakhir (untuk sinkronisasi), maka kami perlu menghapus * semua surat yang ditransfer (kami akan terus menulis di tabel lama).

* Menghapus topik terpisah untuk percakapan, mungkin terlihat lebih cepat daripada mentransfer, tetapi ini tidak begitu dan dalam kasus umum saya menyarankan menghapus sebagian.

Metode 2: Studio Manajemen MS-SQL


Jika Anda memiliki studio ini, Anda dapat mencoba menggunakan alat bawaan untuk mengekspor dan mengimpor data. Secara pribadi, saya membaca tentang stack overflow bahwa hal ini tergantung pada tabel 60 manggung dan tidak mengambil risiko.

Metode 3. Partisi


Metode dahi ditingkatkan. Idenya adalah untuk mentransfer data dengan cara biasa dengan timer di antara iterasi. Anda memecah semua garis menjadi bagian-bagian (misalnya, masing-masing 100rb), mentransfer bagian tersebut (dan Anda dapat langsung menghapusnya, tetapi Anda tidak yakin seberapa amannya), lalu tertidur dan seterusnya hingga akhir yang pahit. Lebih baik untuk mentransfer dari ujung sehingga Anda tidak perlu menyinkronkan data di akhir. Metode ini jelas sangat lambat, tetapi dengan cara ini Anda akan mentransfer semuanya tanpa menghentikan layanan web. Kemungkinan besar akan lebih mudah untuk mengimplementasikannya bukan dengan skrip SQL, tetapi dengan bantuan beberapa ORM.

Ringkasan


Proses mentransfer sejumlah besar data selalu membutuhkan waktu tertentu, dan Anda harus siap untuk ini. Tidak ada cara ajaib untuk menyelesaikan masalah Anda secara instan. Dalam setiap kasus, Anda perlu membangun volume dan batasan Anda. Jika tidak ada metode yang bekerja untuk Anda, pertimbangkan apakah Anda dapat menggunakan kombinasi mereka.

Pada akhirnya, saya ingin menambahkan 2 poin penting.

Setiap proses pemindahan / penghapusan baris dalam SQL dicatat log transaksi untuk kemampuan memutar kembali semua jika terjadi kesalahan (sebelumnya saya berasumsi bahwa ini dilakukan hanya dalam kerangka transaksi). Selain itu, ukuran log bahkan sedikit lebih banyak daripada jumlah data. Pastikan Anda memiliki jumlah ruang yang diperlukan atau menonaktifkan pencatatan, tetapi ini tidak aman.

Sebelum mentransfer, Anda perlu memastikan bahwa file data dan file log adalah ukuran yang tepat, karena operasi ekspansi menghabiskan banyak waktu, dan mengonfigurasikannya dengan tepat. Dengan cara ini, Anda mengoptimalkan migrasi.
Terima kasih untuk semua yang membaca! Saya akan dengan senang hati menerima kritik, komentar, dan klarifikasi. Bagikan cara dan teknik Anda untuk bekerja dengan data besar, sebagai seringkali ini adalah informasi yang sangat penting dan perlu yang tidak mudah ditemukan.

Source: https://habr.com/ru/post/id434800/


All Articles