低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
背景
最近遇到一个客户需求,客户的生产环境有大量的SQL Server数据库(大概180套),客户的诉求是需要把生产环境的Windows系统转为Linux系统,转为Linux系统之后需要沿用原来的数据库高可用方案。把数据库转到Linux系统比较容易,因为从SQL Server 2017开始就支持Linux系统,但是要沿用原来的数据库高可用方案就有点难度。了解到客户之前的生产环境所用的数据库高可用方案是数据库镜像,因为客户的生产环境高可用性要求不算太高,数据库镜像技术已经可以完全满足要求。
于是本人建议客户把SQL Server迁移到Linux系统之后,依然使用之前的数据库镜像这种数据库高可用方案。数据库镜像这种技术本身搭建非常简单,不需要借助任何第三方组件,搭建步骤跟Windows系统上的一模一样,而且从SQL Server 2005版本开始就已经引入数据库镜像,历经9个大版本迭代,稳定性久经考验。
在SQL Server 2016版本引入了多线程并行redo,它可以
(1)显著减少镜像集群和AlwaysOn可用性组集群的数据同步延迟。
(2)数据库的启动速度显著加快,数据库启动需要经历redo阶段。
(3)加快故障转移的速度

很多用户会嫌弃Linux系统上的AlwaysOn可用性组搭建麻烦,因为需要借助Pacemaker与Corosync等第三方组件,搭建过程有一定的难度。对于生产环境上的数据库高可用性和性能要求不是很高的情况下,完全可以使用数据库镜像来替代AlwaysOn可用性组。

搭建步骤
下面进行演示如何在Linux系统上搭建SQL Server数据库镜像,因为需要数据库自动故障转移能力,所以需要准备三台机器,第三台机器作为见证服务器,这个要求跟Windows系统上的部署方式是一模一样的。前提假设用户已经在Linux系统上安装好SQL Server数据库镜像。
环境要求
适用的数据库版本:SQL Server 2017 到 SQL Server 2022
适用的操作系统版本:CentOS 7.X 到 CentOS 9.X(其他Linux发行版也可以,Ubuntu或者SUSE)
Linux系统下的数据库目录结构如下:
/data/mssql/1433/database
/data/mssql/1433/dbbackup
/data/mssql/1433/dump
/data/mssql/1433/tempdb
| IP | 主机名 | |
|---|---|---|
| 主库 | 192.168.22.122 | wwwmssql122 |
| 镜像库 | 192.168.22.124 | wwwmssql124 |
| 见证 | 192.168.22.128 | wwwmssql128 |
正式开始搭建
- 修改hosts配置文件,三台机器都要同时修改
cat <<EOF >> /etc/hosts
192.168.22.122 wwwmssql122
192.168.22.124 wwwmssql124
192.168.22.128 wwwmssql128
EOF
2. 首先确定要做镜像数据库的恢复模式为完整模式,用以下sql语句来查看
--主机192.168.22.122上执行
SELECT [name], [recovery_model_desc] FROM sys.[databases]

3. 在主服务器和镜像服务器上和见证服务器上创建Master Key 、创建证书 ,根据提示在各自的服务器上执行
--主机192.168.22.122上执行
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'master@2015key123';CREATE CERTIFICATE HOST_22_122_cert WITH SUBJECT = 'HOST_22_122_certificate',
START_DATE = '09/20/2010',EXPIRY_DATE = '01/01/2099';
--备机192.168.22.124上执行
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'master@2015key123';CREATE CERTIFICATE HOST_22_124_cert WITH SUBJECT = 'HOST_22_124_certificate',
START_DATE = '09/20/2010',EXPIRY_DATE = '01/01/2099';
--见证192.168.22.128上执行
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'master@2015key123';CREATE CERTIFICATE HOST_22_128_cert WITH SUBJECT = 'HOST_22_128_certificate',
START_DATE = '09/20/2010',EXPIRY_DATE = '01/01/2099';
4. 创建镜像端点,同一个实例上只能存在一个镜像端点 ,根据提示在各自的服务器上执行
--主机192.168.22.122上执行
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_22_122_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
--备机192.168.22.124上执行
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_22_124_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
--见证192.168.22.128上执行
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_22_128_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
5. 每台机器都备份证书,然后互换,把证书scp到其他机器并且设置好权限 ,根据提示在各自的服务器上执行
--主机192.168.22.122上执行
BACKUP CERTIFICATE HOST_22_122_cert TO FILE = '/data/mssql/1433/dbbackup/HOST_22_122_cert.cer';
scp /data/mssql/1433/dbbackup/HOST_22_122_cert.cer root@192.168.22.124:/data/mssql/1433/dbbackup/
scp /data/mssql/1433/dbbackup/HOST_22_122_cert.cer root@192.168.22.128:/data/mssql/1433/dbbackup/
chown -R mssql:mssql /data/mssql/1433/*
--备机192.168.22.124上执行
BACKUP CERTIFICATE HOST_22_124_cert TO FILE = '/data/mssql/1433/dbbackup/HOST_22_124_cert.cer';
scp /data/mssql/1433/dbbackup/HOST_22_124_cert.cer root@192.168.22.128:/data/mssql/1433/dbbackup/
scp /data/mssql/1433/dbbackup/HOST_22_124_cert.cer root@192.168.22.122:/data/mssql/1433/dbbackup/
chown -R mssql:mssql /data/mssql/1433/*
--见证192.168.22.128上执行
BACKUP CERTIFICATE HOST_22_128_cert TO FILE = '/data/mssql/1433/dbbackup/HOST_22_128_cert.cer';
scp /data/mssql/1433/dbbackup/HOST_22_128_cert.cer root@192.168.22.124:/data/mssql/1433/dbbackup/
scp /data/mssql/1433/dbbackup/HOST_22_128_cert.cer root@192.168.22.122:/data/mssql/1433/dbbackup/
chown -R mssql:mssql /data/mssql/1433/*
6. 新增主备机登陆用户 ,根据提示在各自的服务器上执行
--主机192.168.22.122上执行
CREATE LOGIN [wwwmssql124LoginUser] WITH PASSWORD = 'User_Pass@2015key123';
CREATE USER [wwwmssql124User] FOR LOGIN [wwwmssql124LoginUser];
CREATE CERTIFICATE HOST_22_124_cert AUTHORIZATION [wwwmssql124User] FROM FILE ='/data/mssql/1433/dbbackup/HOST_22_124_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [wwwmssql124LoginUser];
CREATE LOGIN [wwwmssql128LoginUser] WITH PASSWORD = 'User_Pass@2015key123';
CREATE USER [wwwmssql128User] FOR LOGIN [wwwmssql128LoginUser];
CREATE CERTIFICATE HOST_22_128_cert AUTHORIZATION [wwwmssql128User] FROM FILE ='/data/mssql/1433/dbbackup/HOST_22_128_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [wwwmssql128LoginUser];
--备机192.168.22.124上执行
CREATE LOGIN [wwwmssql122LoginUser] WITH PASSWORD = 'User_Pass@2015key123';
CREATE USER [wwwmssql122User] FOR LOGIN [wwwmssql122LoginUser];
CREATE CERTIFICATE HOST_22_122_cert AUTHORIZATION [wwwmssql122User] FROM FILE ='/data/mssql/1433/dbbackup/HOST_22_122_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [wwwmssql122LoginUser];
CREATE LOGIN [wwwmssql128LoginUser] WITH PASSWORD = 'User_Pass@2015key123';
CREATE USER [wwwmssql128User] FOR LOGIN [wwwmssql128LoginUser];
CREATE CERTIFICATE HOST_22_128_cert AUTHORIZATION [wwwmssql128User] FROM FILE ='/data/mssql/1433/dbbackup/HOST_22_128_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [wwwmssql128LoginUser];
--见证192.168.22.128上执行
CREATE LOGIN [wwwmssql122LoginUser] WITH PASSWORD = 'User_Pass@2015key123';
CREATE USER [wwwmssql122User] FOR LOGIN [wwwmssql122LoginUser];
CREATE CERTIFICATE HOST_22_122_cert AUTHORIZATION [wwwmssql122User] FROM FILE ='/data/mssql/1433/dbbackup/HOST_22_122_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [wwwmssql122LoginUser];
CREATE LOGIN [wwwmssql124LoginUser] WITH PASSWORD = 'User_Pass@2015key123';
CREATE USER [wwwmssql124User] FOR LOGIN [wwwmssql124LoginUser];
CREATE CERTIFICATE HOST_22_124_cert AUTHORIZATION [wwwmssql124User] FROM FILE ='/data/mssql/1433/dbbackup/HOST_22_124_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [wwwmssql124LoginUser];
7. 确保各个机器都放开了5022端口,数据库镜像数据同步需要使用5022端口,使用telnet命令和ss命令测试,根据提示在各自的服务器上执行
##主机192.168.22.122上执行
telnet 192.168.22.124 5022
telnet 192.168.22.128 5022
##备机192.168.22.124上执行
telnet 192.168.22.122 5022
telnet 192.168.22.128 5022
##见证192.168.22.128上执行
telnet 192.168.22.122 5022
telnet 192.168.22.124 5022
##通过ss命令可以看到数据库在侦听5022端口
ss -lntup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:1433 0.0.0.0:* users:(("sqlservr",pid=1190,fd=114))
tcp LISTEN 0 128 127.0.0.1:1431 0.0.0.0:* users:(("sqlservr",pid=1190,fd=120))
tcp LISTEN 0 128 127.0.0.1:1434 0.0.0.0:* users:(("sqlservr",pid=1190,fd=117))
tcp LISTEN 0 128 0.0.0.0:5022 0.0.0.0:* users:(("sqlservr",pid=1190,fd=142))

8. 备份数据库(完整备份+事务日志备份)在主机执行
--主机192.168.22.122上执行
DECLARE @FileName NVARCHAR(MAX)
--(TestDB数据库完整备份)
SET @FileName = '/data/mssql/1433/dbbackup/TestDBBACKUP_FullBackup_1.bak'
BACKUP DATABASE [TestDB]
TO DISK=@FileName WITH FORMAT ,COMPRESSION
--(TestDB数据库日志备份)
SET @FileName = '/data/mssql/1433/dbbackup/TestDBBACKUP_logBackup_2.bak'
BACKUP LOG [TestDB]
TO DISK=@FileName WITH FORMAT ,COMPRESSION
用scp命令拷贝备份文件到备机192.168.22.124
scp /data/mssql/1433/dbbackup/TestDBBACKUP_* root@192.168.22.124:/data/mssql/1433/dbbackup/
9. 还原数据库(指定norecovery方式还原)在备机执行
设置一下权限
#备机192.168.22.124上执行
chown -R mssql:mssql /data/mssql/1433/*
在SSMS管理工具上执行
--备机192.168.22.124上执行
USE [master]
RESTORE DATABASE TestDB FROM DISK = N'/data/mssql/1433/dbbackup/TestDBBACKUP_FullBackup_1.bak' WITH FILE = 1,
NOUNLOAD,NORECOVERY, REPLACE, STATS = 5
GO
USE [master]
RESTORE LOG TestDB FROM DISK = N'/data/mssql/1433/dbbackup/TestDBBACKUP_logBackup_2.bak' WITH FILE = 1,
NOUNLOAD,NORECOVERY, REPLACE, STATS = 5
GO

上图中实例旁边有企鹅图标,说明这三个SQL Server实例跑在Linux系统上
10. 增加镜像伙伴,需要先在备机上执行,再在主机上执行,镜像弄好之后 ,根据提示在各自的服务器上执行
--备机192.168.22.124上执行
USE [master]
GO
ALTER DATABASE [TestDB] SET PARTNER = 'TCP://192.168.22.122:5022'; --主机服务器的ip
--主机192.168.22.122上执行
USE [master]
GO
ALTER DATABASE [TestDB] SET PARTNER = 'TCP://192.168.22.124:5022'; --镜像服务器的ip
ALTER DATABASE [TestDB] SET WITNESS = 'TCP://192.168.22.128:5022'; --见证服务器的ip
11. 把数据库镜像的模式修改为高安全模式
--主机192.168.22.122上执行
--修改为高安全模式
USE [master]
GO
ALTER DATABASE [TestDB] SET PARTNER SAFETY FULL
GO
测试自动故障转移和手动故障转移
- 手动故障转移
--主机192.168.22.122上执行
--手动故障转移
USE [master]
GO
ALTER DATABASE [TestDB] SET PARTNER FAILOVER
GO
- 自动故障转移
使用poweroff命令直接关机或者killall sqlservr命令来直接停止SQL Server实例进程

测试结果

无论是手动故障转移还是自动故障转移(poweroff命令直接关机还是killall sqlservr 命令直接停止SQL Server实例进程)都能完全没有任何问题。
总结
本文介绍了在Linux环境下为SQL Server数据库设置高可用性方案,数据库镜像自SQL Server 2005起开始稳定支持且无需借助第三方组件。数据库镜像作为一种简便且成本低廉的高可用性解决方案,不仅可以在Linux系统上顺利运行还具备自动和手动故障转移能力。通过简单的步骤配置,用户可以确保数据库在主服务器故障时快速切换完全满足生产环境的高可用性的需求。
参考文章
https://ithelp.ithome.com.tw/articles/10031291
https://www.tatvasoft.com/blog/how-to-configure-database-mirroring-for-sql-server/
https://www.sqlshack.com/sql-server-database-mirroring/
https://codingsight.medium.com/configure-database-mirroring-in-sql-server-c819f3ef3648

本文版权归作者所有,未经作者同意不得转载。
低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解的更多相关文章
- SQL Server数据库PIVOT函数的使用详解(一)
http://database.51cto.com/art/201108/285250.htm SQL Server数据库中,PIVOT在帮助中这样描述滴:可以使用 PIVOT 和UNPIVOT 关系 ...
- SQL Server数据库PIVOT函数的使用详解(二)
动态的行转列 原理就是 把需要转成列的行拼出来 DECLARE @fieldName VARCHAR(); SET @fieldName=''; SELECT @fieldName = @fieldN ...
- linux系统下tomcat应用开机自启动 配置
linux系统下tomcat应用开机自启动 配置 相对简单的方式是将tomcat添加为系统服务第一步 复制文件将 $Tomcat_Home/bin目录下的 catalina.sh脚本文件复制到目录/ ...
- 实战SQL Server 2005镜像配置全过程
SQL Server 2005镜像配置基本概念 我理解的SQL Server 2005镜像配置实际上就是由三个服务器(也可以是同一服务器的三个 SQL 实例)组成的一个保证数据的环境,分别是:主服务器 ...
- SQL Server日期时间格式转换字符串详解
本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...
- SQL Server数据库镜像的页面自动修复原理
SQL Server数据库镜像的页面自动修复原理 主库页面损坏 镜像库页面损坏 LSN用来保证事务的时序 LSN保存在每个数据页面的页头 在同一台机器,内存中的数据页和磁盘中的数据页保持同步依靠的是数 ...
- linux 系统下java开发环境的配置
在安装之前,确保你的linux系统下有 jdk,jboss等相关软件 一.配置JDK环境变量 步骤: 解压缩JDK文件: unzip jdk1.6.0_31.zip 目录下显示文件夹jdk1.6.0_ ...
- Linux Centos下SQL Server 2017安装和配置
说到SQL Server服务,我们大家都知道是Microsoft公司的数据库服务,当然说到数据库,现在主要分为三大商:1:Oracle.2:Msql Server.3:Mysql:三种数据库在当下环境 ...
- .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...
- SQL Server数据库邮件配置
一.数据库邮件介绍 数据库邮件是从SQL Server数据库引擎中发送电子邮件的企业解决方案,通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件.邮件中可以包含查询结果,还可以包含来自网络中任何 ...
随机推荐
- IPC-7095E-2024 EN Design and Assembly Process Guidance for Ball Grid Arrays (BGAs). IPC-7095E BGA 设计与组装工艺的实施
IPC-7095E-2024 EN Design and Assembly Process Guidance for Ball Grid Arrays (BGAs).pdf链接: https://pa ...
- 玩转AI工作流:一步步搭建灵活的自动化流程
我们之前搭建了许多不同类型的智能体,其中最受欢迎的就是在智能体中搭建各种工作流--这也是我最喜欢探索和玩的领域.那么,究竟什么是工作流?如何在后端实现一个工作流呢?今天我们就先简单了解下. 什么是工作 ...
- 软件逆向之OD
OD全称OllyDbg ,是一种具有可视化界面的 32 位汇编-分析调试器.和IDA不同之处在于可以动态调试软件功能,可以有效的去分析程序构成. 以下软件讲解均以吾爱破解中的OD进行讲解.软件下载 打 ...
- ip addr没有ip显示?
重新启动网络 service NetworkManager stop systemctl restart network
- TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面
前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用.但在日常使用过程中,命令行使用还是不太方便的,因此今天介绍一下如何使用 ...
- bitmap的特性和应用
BitMap 是什么? BitMap 简称位图,实际上是一个散列表,只不过这个散列表中各个槽是计算机存储中的最小单元bit. 那BitMap数据结构长什么样呢? 一个长度为8的BitMap是下面这样的 ...
- less 常用方法
介绍 Less 是 CSS 的预处理语言之一,为 CSS 增添了变量.Mixin.函数等特性,使CSS更易于维护扩展. 嵌套(Nesting) .header { .navgation: { font ...
- 中电金信召开“源启 AI+”人工智能应用场景与发展培训暨业务研讨会
近年来,国务院国资委把加快发展人工智能放在国资央企全局工作中统筹谋划,作为产业焕新行动和启航行动部署的主要方向,制定印发行动计划,组织召开中央企业人工智能专题推进会,开展"AI+" ...
- Docker Compose - 向远程主机部署服务
问题描述 通常,我们本地编写 docker-compose.yml 文件,然后运行测试.但是,我们需要在 arm64 环境中进行测试,无法在本地直接运行测试. 我们希望可以在本地编写,然后本地使用 d ...
- CSV文件处理工具-CsvUtil
介绍 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本). Hutool针对此格式,参考 ...