Haruskah saya memigrasikan data menggunakan detach / copy / attach atau melalui backup-restore-replay?

17

Saya akan memulai migrasi file database ke SAN baru (dari SAN lama) dan saya punya beberapa opsi untuk mengimplementasikan ini. (1) Disarankan agar saya melihat tingkat upaya memulihkan cadangan penuh ke database baru di server. Namun, (2) rencana awal saya adalah menyalin file-file dari SAN lama ke SAN baru dengan melepaskan dan kemudian memasang kembali basis data.

Naluri saya memberi tahu saya bahwa saya lebih suka melepaskan, menyalin, dan melampirkan karena tampaknya lebih aman-gagal, tetapi itu mungkin saja naif saya. Saya tidak ingin melewatkan transaksi atau "memecahkan sesuatu" dalam proses pengubahan nama basis data.

Saya kira pertanyaan saya adalah apakah saya dibenarkan dalam skeptisisme saya terhadap opsi BACKUP-RESTORE-Replay dan apa manfaat atau risiko lain dari opsi itu?

swasheck
sumber

Jawaban:

16

Secara pribadi, saya akan menghindari mekanisme detach / attach. Terutama di SQL Server 2000, saya hanya tidak percaya bahwa Anda akan selalu membawa server kembali dan dapat melampirkan file-file itu. Saya telah mendengar banyak cerita di mana ini tidak terjadi dengan bersih - hanya karena Anda memiliki Rencana B tidak secara otomatis membuat Rencana A masuk akal.

Dengan cadangan / pemulihan, Anda tidak mengambil risiko harus pergi ke Paket B. Jika cadangan gagal, basis data Anda masih naik. Jika pemulihan gagal, database lama Anda masih menyala. Dalam kedua kasus tersebut, Anda dapat memulihkan pengoperasian database asli dan mengunjungi kembali paket tersebut nanti. Selain keamanan ekstra di sini untuk menghentikan SQL Server dan / atau melepaskan, ini juga berarti Anda dapat menguji hoo-has dari metodologi backup / restore (dengan asumsi Anda saat ini memiliki ruang untuk melakukan backup dan contoh lain untuk menguji mengembalikan). Anda tidak dapat benar-benar menguji pendekatan detach tanpa melepaskan basis data atau menghentikan SQL Server, dan itu sulit dilakukan di luar jendela perawatan yang tepat. Dan akhirnya, dengan pendekatan lain Anda bahkan tidak dapat mulai menyalin file sampai Anda telah melepaskan atau menurunkan SQL Server.

Satu manfaat lain dari metode pull-the-drive-out-from-under-SQL-Server: dengan backup / restore Anda dapat memindahkan berbagai file ke huruf drive yang berbeda dari sebelumnya. Misalnya ketika kami bermigrasi ke SAN baru, kami dapat memiliki lebih banyak volume, sehingga kami dapat memindahkan tempdb ke T: \ (yang sebelumnya tidak ada), beberapa data dan mencatat file ke huruf drive baru, dll. untuk lebih memanfaatkan semua kapasitas I / O baru yang kami miliki. Jika Anda hanya mematikan SQL Server dan kemudian menukar disk, Anda harus memiliki huruf drive yang sama dan jumlah volume yang sama.

Aaron Bertrand
sumber
7

Saya dulu sering memindahkan database, karena konfigurasi ulang SAN dan migrasi.

Dengan asumsi bahwa Anda memindahkan seluruh server pada satu waktu, saya akan pergi dengan sesuatu seperti jalur Anda # 2. (Jika Anda memindahkan satu database pada suatu waktu, dan akhirnya melakukan setiap database pada server, itu akan lebih bermasalah karena Anda harus mengubah jalur ke file.)

Perhatikan bahwa "single_user" tidak selalu berarti ANDA. Anda bisa pergi ke database DBCC CHECKDB dan tidak dapat masuk karena seseorang sudah ada di sana. Persiapkan skrip yang dapat Anda jalankan untuk mem-boot "semua orang kecuali Anda" dari database dan simpan di tempat yang praktis. Perhatikan bahwa SQL 2000 tidak memiliki fitur "jauhkan semua orang" yang sama dengan versi yang lebih modern.

Salah satu trik lama adalah menghentikan layanan SQL Server. Ini akan mencegah login baru, tetapi siapa pun yang sudah terhubung dapat melanjutkan seperti biasa. Jadi: hubungkan melalui jendela SSMS sehingga Anda dapat melakukan pekerjaan, lalu jeda layanan, lalu keluarkan koneksi yang tidak diinginkan, lakukan hal Anda melalui jendela perintah SSMS (bukan GUI, itu membuat dan merusak banyak koneksi) dan kemudian berhenti-jeda layanan. Peringatan: Saya tidak yakin bagaimana itu akan dimainkan di sebuah cluster. Mungkin ingin failover.

Sangat berguna untuk memiliki cara untuk menjaga semua pengguna aplikasi keluar dari server sampai Anda menyelesaikan pekerjaan Anda. Jika tidak, koneksi dapat mulai bermunculan saat Anda mencoba melakukan sesuatu, yang dapat menyebabkan pertentangan sumber daya dan / atau kelambatan. Saya telah menggunakan cara-cara berikut di masa lalu, tergantung pada situasi yang tepat: Mematikan server aplikasi. Penggunaan ALTER DATABASE .. SET RESTRICTED_USER (Jika akun aplikasi adalah anggota peran db_owner, sysadmin, atau dbcreator, itu masalah. ) Memberitahu pengguna bahwa sistem akan offline pada waktu tertentu, seperti hari Minggu pagi. (Ini tidak akan bekerja di lingkungan 24x7 "nyata".) Mencabut NIC yang menghadap server aplikasi atau pengguna. (Dalam hal ini, saya bisa masuk melalui NIC lain yang terhubung ke jaringan khusus admin atau melalui ILO.)

Melepaskan sejumlah besar basis data dan memasangnya kembali bisa jadi banyak pekerjaan. Jika Anda melakukannya, pastikan skrip "attach" Anda sudah ditulis sebelumnya.

Saya sudah banyak berhasil menghentikan SQL Server, menyalin semuanya, mengubah huruf drive dan memulai SQL Server. Tidak ada detach / attach. Selama SQL Server tidak aktif dan Anda menyalin (bukan PINDAHKAN) file, Anda tidak bisa mendapatkan terlalu banyak masalah, bahkan jika Anda memindahkan database sistem. Karena jalurnya sama, SQL Server tidak akan menyadari ada yang berubah saat layanan dimatikan. Pastikan Anda mendapatkan huruf drive yang diarahkan kembali ke volume yang benar atau hal-hal buruk akan terjadi pada Anda.

Masalah saya yang paling sering adalah tidak mendapatkan ACL pada direktori file yang benar. Versi yang lebih modern dari SQL Server lebih baik di pengaturan hanya izin yang kebutuhan account layanan sementara versi tampak kurang rewel. Jika Anda lupa mengatur ACL, dan akun layanan bukan administrator lokal (bukan yang saya sarankan), satu atau lebih database mungkin tidak terbuka saat instance dimulai. Jangan panik, ubah saja ACL dan lampirkan database.

Saya biasanya menggunakan ROBOCOPY untuk melakukan pekerjaan semacam ini. Ada saklar baris perintah untuk melestarikan ACL.

Menggunakan perhitungan / verifikasi CRC bukanlah ide yang buruk, tetapi saya belum pernah melakukannya. Ketika basis data kembali, saya menjalankan CHECKDB () pada semuanya. Saya biasanya akan menyiapkan skrip untuk ini sebelumnya, daripada mengandalkan memulai pekerjaan pemeliharaan secara manual. Dengan begitu, saya dapat memeriksa beberapa database yang lebih kecil terlebih dahulu sebelum memeriksa database besar yang bisa memakan waktu beberapa menit atau berjam-jam untuk dijalankan. Saya ragu bahwa pemeriksaan CRC (atau alat Bandingkan Data Redgate) akan menemukan sesuatu yang CHECKDB () akan lewatkan, dan jika itu SQL Server tidak akan dapat memperbaikinya.

Setelah saya menyalin file, tetapi sebelum saya memulai kembali instance, saya akan pergi dan sedikit mengubah file folder OLD dengan mengganti nama salah satu folder. Ini adalah pemeriksaan tambahan terhadap masalah "oops, server masih menunjuk ke file lama".

Jangan terburu-buru untuk menjatuhkan file lama dan memulihkan ruang pada penyimpanan lama dan pastikan bahwa cadangan lengkap Anda telah berjalan dengan sukses. Tes kembalikan beberapa cadangan tersebut ke tempat lain. Setelah Anda memiliki checkdb () yang berjalan baik dan cadangan lengkap yang baik, maka Anda dapat berpikir untuk menjatuhkan penyimpanan lama itu dan mematikan Lefthand.

Masalah terburuk yang saya alami dengan migrasi ini terjadi setelah saya pikir saya sudah selesai. Itu akan menjadi admin SAN yang memberi tahu saya bahwa sesuatu telah terjadi dan sistem file saya diacak. .

Masalah menyenangkan lainnya adalah SAN menjadi lambat tanpa alasan yang jelas. Jika Anda berpikir bahwa akan memakan waktu 10 jam untuk menyalin data Anda dan Anda 30% disalin pada jam nomor 9, Anda memiliki masalah. Tonton waktu transfer (acara robocopy% disalin dan berikan perkiraan waktu, atau Anda dapat menggunakan Perfmon) dan miliki paket cadangan jika terjadi sesuatu yang aneh.

Juga, saya tidak yakin apakah volume Anda akan dipartisi untuk Anda, tetapi Anda mungkin ingin memastikan bahwa mereka menggunakan offset 1 MB. Pada Windows Server 2008 dan lebih baik, ini seharusnya tidak menjadi masalah. Pada OS yang lebih lama, itu. Ada banyak hal yang bisa googlable dalam hal ini, dan orang-orang penyimpanan Anda harus mengetahuinya, tapi saya akan bertanya.

selat darin
sumber
2

Pertama saya akan melihat opsi hanya menggunakan fitur array penyimpanan untuk menangani pemindahan data. Jika itu tidak tersedia karena vendor tidak mendukungnya, Anda tidak membelinya, atau admin SAN tidak tahu bagaimana melakukannya ...

Maka saya cukup menggunakan langkah-langkah berikut.

  1. Hadir penyimpanan baru ke SQL Server.
  2. Hentikan Layanan SQL
  3. SALINKAN semua data dari drive lama ke drive baru (jangan lupa untuk menyertakan izin jika menggunakan robocopy)
  4. Hapus huruf drive dari drive lama.
  5. Ubah huruf drive pada drive baru agar sesuai dengan huruf drive lama
  6. Mulai Layanan SQL

Itu dia.

Tidak diperlukan detach / attach, sejauh SQL Server tahu tidak ada yang berubah. Dan jika ada yang tidak beres, Anda punya salinan lama dari database yang tersimpan di LUN lama pada array penyimpanan yang lama. Gagal kembali hanya masalah mengubah huruf drive di sekitar.

mrdenny
sumber