双机热备概述
双机热备(High Availability, HA)是数据库备份中的一种重要手段,它的目的是提高数据的可用性和可靠性,可以保证在主服务器出现问题时,备份服务器可以自动接管,从而避免数据丢失。在MSSQL数据库中,可以采用多种技术手段来实现双机热备,其中较为常见的有数据库镜像(Database Mirroring)、数据库复制(Replication)和Always On可用性组(Always On Availability Groups)等。
选用双机热备的原因
1.提高数据可用性和可靠性
MSSQL双机热备可以在主服务器出现故障的情况下,自动进行切换,并保证最小化的中断或无中断的恢复,极大地提高了数据的可用性和可靠性。它可以实现分钟级别的快速恢复,大大缩短了系统宕机时间,使整个业务连续不断、稳定运行。
2.降低因宕机造成的损失
MSSQL双机热备可以及时处理主服务器的问题,使业务系统的服务不中断,避免因为宕机造成的严重损失,特别是在金融、电信、医疗等行业,保障了数据的安全和业务的稳定性。
实现MSSQL双机热备
1.数据库镜像
MSSQL数据库镜像(Database Mirroring)是指将数据库实时镜像到另外一个备份服务器上,并保持两者数据的一致性,主服务器上的任何操作都会自动同步到备份服务器上。当主服务器出现故障时,可以通过手动或自动切换实现备份服务器的接管,从而保证业务系统的连续稳定运行。实现数据库镜像的步骤如下:
在主服务器和备份服务器上均安装MSSQL数据库,并保证主备双方间网络互通。
在主服务器上创建需要镜像的数据库,并将其纳入镜像监控。
在备份服务器上创建镜像数据库,并设置这个数据库为镜像数据库,并将其与主服务器上的数据库建立镜像关系。
在主服务器上启用镜像监控,一旦主服务器出现问题,就可以自动切换到备份服务器。
下面是一个数据库镜像的代码示例:
-- 创建主数据库
CREATE DATABASE TestDB ON
( NAME = TestDB_data,
FILENAME = 'D:\TestDB_data.mdf')
LOG ON
( NAME = TestDB_log,
FILENAME = 'D:\TestDB_log.ldf')
GO
-- 创建备份数据库
CREATE DATABASE TestDB_Mirror ON
( NAME = TestDB_data,
FILENAME = 'D:\TestDB_data.mdf')
LOG ON
( NAME = TestDB_log,
FILENAME = 'D:\TestDB_log.ldf')
GO
-- 设置主备数据库关系
USE master
GO
ALTER DATABASE TestDB SET PARTNER = 'TCP://MirrorServer:7024'
GO
ALTER DATABASE TestDB_Mirror SET PARTNER = 'TCP://PrincipalServer:7024'
GO
2.数据库复制
MSSQL数据库复制(Replication)是指将一个数据库的数据复制到另一个数据库上,保证两个数据库之间的数据一致性。它与数据库镜像的区别在于,数据库复制是异步的,主数据库和备份数据库之间数据更新有一定的时间差,但是可以切换到备份数据库来提供业务服务。实现数据库复制的步骤如下:
在主服务器和备份服务器上均安装MSSQL数据库,并保证主备双方间网络互通。
在主服务器上创建需要复制的数据库,并将其纳入复制监控。
在备份服务器上创建复制数据库,并设置跟踪主数据库的更改,并将它们应用于复制数据库。
在主服务器上启用复制监控,一旦主服务器出现问题,就可以手动或自动切换到备份服务器。
下面是一个数据库复制的代码示例:
-- 创建订阅者
USE master
GO
EXEC sp_addsubscriber @subscriber = N'MirrorServer', @type = 0, @description = NULL, @security_mode = 1, @frequency_type = 64, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 99991231, @optional_command_line = N'-Continuous -Output verbose', @trusted = N'false', @job_login = N'Admin', @job_password = N'password'
GO
-- 创建发布者
USE master
GO
EXEC sp_addpublisher @publisher = N'PrincipalServer', @description = NULL, @job_login = N'Admin', @job_password = N'password', @publisher_security_mode = 1, @frequency_type = 64, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 99991231, @allowed_subscribers = NULL, @snapshot_in_defaultfolder = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ReplData', @compress_snapshot = 0, @ftp_port = 21, @ftp_subdirectory = NULL, @ftp_login = NULL, @ftp_password = NULL, @allow_push = 0, @allow_pull = 0, @allow_anonymous = 0, @immediate_sync = 0, @allow_sync_tran = 0, @autogen_sync_procs = 0, @retention = 0, @allow_queued_tran = 0, @snapshot_job_name = NULL, @allow_dts = 0, @allow_subscription_copy = 0, @conflict_policy = 0, @centralized_conflicts = 0, @job_name = NULL, @publisher_type = N'MSSQLSERVER', @subscriber_type = 0, @subscription_drive = N'', @frequency_subday_type = 0, @frequency_relative_interval_type = 0, @frequency_recurrence_factor_type = 0, @dynamic_filters = 0, @repl_freq_optimization = 0, @sqrtmeteringsettings = NULL
GO
-- 创建发布
USE master
GO
EXEC sp_addpublication @publication = N'TestDB_Publication', @description = N'', @sync_mode = N'async', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'false', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = NULL, @ftp_password = NULL, @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @uses_dts = N'false', @publication_job = NULL, @allow_synctoalternate = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @replicate_ddl = 1, @allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false', @enabled_for_het_sub = N'false', @p2p_conflictdetection = N'false', @p2p_originator_id = N'47f10b46-9076-45b1-a8c1-65de50ec3516', @p2p_originator_name = N'PrincipalServer', @p2p_partners = NULL, @allow_partition_switch = N'false', @replicate_partition_switch = N'false', @allow_subscribe_by_sql_ctl = N'true', @backupdevicetype = 2, @maintain_partitions = N'false', @stream_blob_columns = N'false'
GO
3.Always On可用性组
MSSQL Always On可用性组(Always On Availability Groups)是一种基于Windows Server Failover Clustering(WSFC)和数据库镜像技术的高级灾难恢复和高可用性解决方案。Always On可用性组可以管理多个数据库的故障转移,同时可以提供进程级别的故障转移和异地灾难恢复能力。它在MSSQL数据库的高可用性方面提供了更加全面的支持和更加灵活的管理,实现Always On可用性组的步骤如下:
在主服务器和备份服务器上均安装MSSQL数据库,并启用Always On可用性组。
在主服务器上创建需要镜像的数据库,并将其加入到Always On可用性组中。
在备份服务器上创建Always On可用性组的副本,并与主服务器的可用性组建立联系。
在主服务器上启用Always On可用性组的自动故障转移功能,一旦主服务器出现问题,可用性组就会自动将业务服务转移到备份服务器上。
下面是一个Always On可用性组的代码示例:
-- 开启Always On可用性组
EXEC sys.sp_configure 'contained database authentication', 1
GO
-- 创建可用性组
USE [master]
GO
CREATE AVAILABILITY GROUP [TestAG]
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY, DB_FAILOVER = ON, DTC_SUPPORT = NONE)
AVAILABILITY GROUP ON
((primary_replica =
N'PrincipalServer',
endpoint_url =
N'tcp://PrincipalServer.example.com:5022',
availability_mode = ASYNCHRONOUS_COMMIT,
failover_mode = MANUAL,
secondary_replica =
N'MirrorServer',
endpoint_url =
N'tcp://MirrorServer.example.com:5022',
availability_mode = ASYNCHRONOUS_COMMIT,
failover_mode = MANUAL,
backup_priority = 50,
primary_role_allow_connections = ALL),
listener_url =
N'tcp://Listener.example.com:1433'
);
GO
总结
在MSSQL数据库备份中,双机热备是一种非常重要、常用的数据安全保障技术。通过数据库镜像、数据库复制和Always On可用性组等技术手段,可以实现主备服务器之间的数据同步和自动切换,提高了数据的可用性和可靠性,降低了因宕机造成的严重损失。在实现双机热备的过程中,需要根据自身业务特点选取合适的方案,充分测试方案的可靠性和有效性,保障业务系统的稳定运行。