Mulai menggunakan pengiriman log di Linux
Berlaku untuk: SQL Server - Linux
Pengiriman log adalah konfigurasi ketersediaan tinggi (HA) SQL Server di mana database dari server utama direplikasi ke satu atau beberapa server sekunder. Pengiriman log memungkinkan file cadangan dari database sumber untuk dipulihkan ke server sekunder. Server utama membuat cadangan log transaksi secara berkala, dan server sekunder memulihkannya, memperbarui salinan sekunder database.
Seperti yang dijelaskan dalam diagram sebelumnya, sesi pengiriman log melibatkan langkah-langkah berikut:
- Mencadangkan file log transaksi pada instans SQL Server utama
- Menyalin file cadangan log transaksi di seluruh jaringan ke satu atau beberapa instans SQL Server sekunder
- Memulihkan file cadangan log transaksi pada instans SQL Server sekunder
Prasyarat
Menyiapkan berbagi jaringan untuk pengiriman log menggunakan CIFS
Catatan
Tutorial ini menggunakan CIFS + Samba untuk menyiapkan berbagi jaringan.
Mengonfigurasi server utama
Instal Samba dengan perintah berikut:
Untuk Red Hat Enterprise Linux (RHEL):
sudo yum -y install samba
Untuk Ubuntu:
sudo apt-get install samba
Buat direktori untuk menyimpan log untuk pengiriman log, dan beri
mssql
pengguna izin yang diperlukan:mkdir /var/opt/mssql/tlogs chown mssql:mssql /var/opt/mssql/tlogs chmod 0700 /var/opt/mssql/tlogs
/etc/samba/smb.conf
Edit file (Anda memerlukan izin root), dan tambahkan bagian berikut:[tlogs] path=/var/opt/mssql/tlogs available=yes read only=yes browsable=yes public=yes writable=no
Buat
mssql
pengguna untuk Samba:sudo smbpasswd -a mssql
Mulai ulang layanan Samba:
sudo systemctl restart smbd.service nmbd.service
Mengonfigurasi server sekunder
Instal klien CIFS dengan perintah berikut:
Untuk RHEL:
sudo yum -y install cifs-utils
Untuk Ubuntu:
sudo apt-get install cifs-utils
Buat file untuk menyimpan kredensial Anda. Dalam contoh ini, kita menggunakan
/var/opt/mssql/.tlogcreds
. Gunakan kata sandi yang baru-baru ini Anda tetapkan untuk akun Samba Andamssql
, dan ganti<domain>
:username=mssql domain=<domain> password=<password>
Jalankan perintah berikut untuk membuat direktori kosong untuk memasang dan mengatur izin dan kepemilikan dengan benar
mkdir /var/opt/mssql/tlogs sudo chown root:root /var/opt/mssql/tlogs sudo chmod 0550 /var/opt/mssql/tlogs sudo chown root:root /var/opt/mssql/.tlogcreds sudo chmod 0660 /var/opt/mssql/.tlogcreds
Tambahkan baris ke etc/fstab untuk mempertahankan berbagi. Ganti
<ip_address_of_primary_server>
dengan nilai yang sesuai://<ip_address_of_primary_server>/tlogs /var/opt/mssql/tlogs cifs credentials=/var/opt/mssql/.tlogcreds,ro,uid=mssql,gid=mssql 0 0
Pasang berbagi:
sudo mount -a
Menyiapkan pengiriman log menggunakan Transact-SQL
Cadangkan database di server utama:
BACKUP DATABASE SampleDB TO DISK = '/var/opt/mssql/tlogs/SampleDB.bak' GO
Konfigurasikan pengiriman log di server utama:
DECLARE @LS_BackupJobId AS UNIQUEIDENTIFIER; DECLARE @LS_PrimaryId AS UNIQUEIDENTIFIER; DECLARE @SP_Add_RetCode AS INT; EXECUTE @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database @database = N'SampleDB', @backup_directory = N'/var/opt/mssql/tlogs', @backup_share = N'/var/opt/mssql/tlogs', @backup_job_name = N'LSBackup_SampleDB', @backup_retention_period = 4320, @backup_compression = 2, @backup_threshold = 60, @threshold_alert_enabled = 1, @history_retention_period = 5760, @backup_job_id = @LS_BackupJobId OUTPUT, @primary_id = @LS_PrimaryId OUTPUT, @overwrite = 1; IF (@@ERROR = 0 AND @SP_Add_RetCode = 0) BEGIN DECLARE @LS_BackUpScheduleUID AS UNIQUEIDENTIFIER; DECLARE @LS_BackUpScheduleID AS INT; EXECUTE msdb.dbo.sp_add_schedule @schedule_name = N'LSBackupSchedule', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_recurrence_factor = 0, @active_start_date = 20170418, @active_end_date = 99991231, @active_start_time = 0, @active_end_time = 235900, @schedule_uid = @LS_BackUpScheduleUID OUTPUT, @schedule_id = @LS_BackUpScheduleID OUTPUT; EXECUTE msdb.dbo.sp_attach_schedule @job_id = @LS_BackupJobId, @schedule_id = @LS_BackUpScheduleID; EXECUTE msdb.dbo.sp_update_job @job_id = @LS_BackupJobId, @enabled = 1; END EXECUTE master.dbo.sp_add_log_shipping_alert_job; EXECUTE master.dbo.sp_add_log_shipping_primary_secondary @primary_database = N'SampleDB', @secondary_server = N'<ip_address_of_secondary_server>', @secondary_database = N'SampleDB', @overwrite = 1;
Pulihkan database di server sekunder:
RESTORE DATABASE SampleDB FROM DISK = '/var/opt/mssql/tlogs/SampleDB.bak' WITH NORECOVERY;
Konfigurasikan pengiriman log di server sekunder:
DECLARE @LS_Secondary__CopyJobId AS UNIQUEIDENTIFIER; DECLARE @LS_Secondary__RestoreJobId AS UNIQUEIDENTIFIER; DECLARE @LS_Secondary__SecondaryId AS UNIQUEIDENTIFIER; DECLARE @LS_Add_RetCode AS INT; EXECUTE @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary @primary_server = N'<ip_address_of_primary_server>', @primary_database = N'SampleDB', @backup_source_directory = N'/var/opt/mssql/tlogs/', @backup_destination_directory = N'/var/opt/mssql/tlogs/', @copy_job_name = N'LSCopy_SampleDB', @restore_job_name = N'LSRestore_SampleDB', @file_retention_period = 4320, @overwrite = 1, @copy_job_id = @LS_Secondary__CopyJobId OUTPUT, @restore_job_id = @LS_Secondary__RestoreJobId OUTPUT, @secondary_id = @LS_Secondary__SecondaryId OUTPUT IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) BEGIN DECLARE @LS_SecondaryCopyJobScheduleUID AS UNIQUEIDENTIFIER; DECLARE @LS_SecondaryCopyJobScheduleID AS INT; EXECUTE msdb.dbo.sp_add_schedule @schedule_name = N'DefaultCopyJobSchedule', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_recurrence_factor = 0, @active_start_date = 20170418, @active_end_date = 99991231, @active_start_time = 0, @active_end_time = 235900, @schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT, @schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT; EXECUTE msdb.dbo.sp_attach_schedule @job_id = @LS_Secondary__CopyJobId, @schedule_id = @LS_SecondaryCopyJobScheduleID; DECLARE @LS_SecondaryRestoreJobScheduleUID AS UNIQUEIDENTIFIER; DECLARE @LS_SecondaryRestoreJobScheduleID AS INT; EXECUTE msdb.dbo.sp_add_schedule @schedule_name = N'DefaultRestoreJobSchedule', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_recurrence_factor = 0, @active_start_date = 20170418, @active_end_date = 99991231, @active_start_time = 0, @active_end_time = 235900, @schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT, @schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT; EXECUTE msdb.dbo.sp_attach_schedule @job_id = @LS_Secondary__RestoreJobId, @schedule_id = @LS_SecondaryRestoreJobScheduleID; END DECLARE @LS_Add_RetCode2 AS INT; IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) BEGIN EXECUTE @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database @secondary_database = N'SampleDB', @primary_server = N'<ip_address_of_primary_server>', @primary_database = N'SampleDB', @restore_delay = 0, @restore_mode = 0, @disconnect_users = 0, @restore_threshold = 45, @threshold_alert_enabled = 1, @history_retention_period = 5760, @overwrite = 1; END IF (@@ERROR = 0 AND @LS_Add_RetCode = 0) BEGIN EXECUTE msdb.dbo.sp_update_job @job_id = @LS_Secondary__CopyJobId, @enabled = 1; EXECUTE msdb.dbo.sp_update_job @job_id = @LS_Secondary__RestoreJobId, @enabled = 1; END
Memverifikasi pekerjaan pengiriman log
Verifikasi bahwa pengiriman log berfungsi dengan memulai pekerjaan berikut di server utama:
USE msdb; GO EXECUTE dbo.sp_start_job N'LSBackup_SampleDB'; GO
Verifikasi bahwa pengiriman log berfungsi dengan memulai pekerjaan berikut di server sekunder:
USE msdb; GO EXECUTE dbo.sp_start_job N'LSCopy_SampleDB'; GO EXECUTE dbo.sp_start_job N'LSRestore_SampleDB'; GO
Verifikasi bahwa failover pengiriman log berfungsi dengan menjalankan perintah berikut:
Peringatan
Perintah ini akan membawa database sekunder online dan memutus konfigurasi pengiriman log. Anda perlu mengonfigurasi ulang pengiriman log setelah menjalankan perintah ini.
RESTORE DATABASE SampleDB WITH RECOVERY;