1. Tujuan
Saat melakukan pemeliharaan database SQL Server, ketika atasan kita meminta kita untuk memindahkan puluhan gigabyte file data ke server lain dan memerlukan waktu henti yang minimal, apakah kita punya rencana untuk memenuhi persyaratan ini?
Di sini kita berasumsi bahwa kedua mesin tersebut tidak berada di ruang komputer yang sama, sehingga solusi kita tampak lebih bermakna. Jika Anda beruntung dan kedua mesin tersebut berada di LAN yang sama, maka selamat, Anda dapat memiliki lebih banyak program yang bisa lakukan itu.
2. Analisis dan desain ide
Faktanya, lingkungan yang kami asumsikan memiliki dua karakteristik: yang pertama adalah file databasenya relatif besar; yang kedua adalah kecepatan transfer file kami mungkin relatif lambat. Mungkin tidak ada yang bisa kita lakukan mengenai kecepatan transmisi, namun kita bisa memulainya dari masalah ukuran file dan menggabungkannya dengan karakteristik SQL Server, sehingga kita mendapatkan solusi sebagai berikut.
Untuk meminimalkan downtime, kami menggunakan cadangan penuh dan cadangan diferensial untuk memigrasikan basis data. Pada siang hari, membuat cadangan penuh (XXX_full.bak) dari basis data yang perlu dimigrasi, dan menyalin file cadangan (Anda dapat menggunakan file cadangan). Perangkat lunak FTP di sini) Lakukan breakpoint resume) ke server target untuk pemulihan, tunggu hingga setelah jam kerja dan lakukan pencadangan diferensial (XXX_diff.bak), lalu salin pencadangan diferensial ini ke server target, dan lakukan pemulihan diferensial berdasarkan pemulihan lengkap .
Waktu henti di sini = waktu pencadangan diferensial + waktu transfer file cadangan diferensial + waktu pemulihan file cadangan diferensial. Apakah waktu henti ini membuat Anda merasa bahwa waktu tersebut sangat singkat?
3. Skrip referensi
Perhatikan untuk mengubah nama database pada skrip di bawah ini, serta jalur absolutnya.
--1: cadangan penuh
nyatakan @dbname varchar(100)
deklarasikan @sql nvarchar(maks)
setel @dbname = 'NamaBaseData'
atur @sql = '
DATABASE CADANGAN ['+@dbname+']
KE DISK = ''D:DBBackup'+@dbname+'_full.bak''
DENGAN NOFORMAT, NOINIT, NAME = '''+@dbname+' -Cadangan basis data lengkap'',
LEWATKAN, ANGIN ANGIN, NOUNLOAD, STATS = 10
PERGI'
Cetak @sql
--SQL yang dihasilkan
--DataBaseName_full
DATABASE CADANGAN [NamaBaseData]
KE DISK = 'D:DBBackupDataBaseName_full.bak'
DENGAN NOFORMAT, NOINIT, NAME = 'DataBaseName-cadangan database lengkap',
LEWATKAN, ANGIN ANGIN, NOUNLOAD, STATS = 10
PERGI
--2: Pencadangan dan pemulihan penuh
nyatakan @dbname varchar(100)
deklarasikan @sql nvarchar(maks)
setel @dbname = 'NamaBaseData'
atur @sql = '
--KEMBALIKAN '+@dbname+'_full
KEMBALIKAN DATABASE ['+@dbname+']
DARI DISK = ''D:DBBackup'+@dbname+'_full.bak'' DENGAN FILE = 1,
PINDAHKAN N''DataBase_Name'' KE N''D:DataBase'+@dbname+'.mdf'',
PINDAHKAN N''DataBase_Name_log'' KE N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
PERGI'
cetak @sql
--SQL yang dihasilkan
--KEMBALIKAN NamaBaseData_lengkap
KEMBALIKAN DATABASE [NamaBaseData]
DARI DISK = 'D:DBBackupDataBaseName_full.bak' DENGAN FILE = 1,
PINDAHKAN N'DataBase_Name' KE N'D:DataBaseDataBaseName.mdf',
PINDAHKAN N'DataBase_Name_log' KE N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
PERGI
--3: Pencadangan diferensial
nyatakan @dbname varchar(100)
deklarasikan @sql nvarchar(maks)
setel @dbname = 'NamaBaseData'
atur @sql = '
DATABASE CADANGAN ['+@dbname+']
KE DISK = N''D:DBBackup'+@dbname+'_diff.bak''
DENGAN DIFERENSIAL, NOFORMAT, NOINIT, NAME = N'''+@dbname+' -Cadangan basis data diferensial'',
LEWATKAN, ANGIN ANGIN, NOUNLOAD, STATS = 10
PERGI
'
cetak @sql
--SQL yang dihasilkan
--DataBaseName_diff
DATABASE CADANGAN [NamaBaseData]
KE DISK = N'D:DBBackupDataBaseName_diff.bak'
DENGAN DIFERENSIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-cadangan basis data diferensial',
LEWATKAN, ANGIN ANGIN, NOUNLOAD, STATS = 10
PERGI
--4: Pencadangan dan pemulihan diferensial
nyatakan @dbname varchar(100)
deklarasikan @sql nvarchar(maks)
setel @dbname = 'NamaBaseData'
atur @sql = '
--KEMBALIKAN '+@dbname+'_full
KEMBALIKAN DATABASE ['+@dbname+']
DARI DISK = ''D:DBBackup'+@dbname+'_diff.bak'' DENGAN FILE = 1,
NOUNLOAD, STATISTIK = 10
PERGI'
cetak @sql
--SQL yang dihasilkan
--KEMBALIKAN NamaBaseData_lengkap
KEMBALIKAN DATABASE [NamaBaseData]
DARI DISK = 'D:DBBackupDataBaseName_diff.bak' DENGAN FILE = 1,
NOUNLOAD, STATISTIK = 10
PERGI
4. Catatan tambahan
Mungkin harusnya sampai disitu saja, namun seringkali menjadi bumerang. Terkadang ukuran file database kita tidak sampai puluhan gigabyte, lalu apa yang harus kita lakukan? Apakah ada solusi lain?
Saya telah memindahkan file data 700G sebelumnya, tetapi saya diberi cukup waktu untuk memindahkannya. Saya memindahkan data ke server baru melalui pekerjaan database. Keuntungannya adalah untuk mengoptimalkan database sebelumnya, seperti Mengatur parameter database, seperti sebagai partisi tabel, dan memigrasikan data dengan dampak sesedikit mungkin pada database sebelumnya. Saya akan menulis proses detailnya lain kali.
(Penulis: Dengarkan Angin dan Hujan Sumber: http://gaizai.cnblogs.com/ )