Step 1:准备工作
1.1 参考资料:
https://blog.csdn.net/roy_88/article/details/72833180
https://blog.csdn.net/dba_huangzj/article/details/27652857
1.2 服务器和数据库的准备
准备3台数据库服务器,安装SQL Server 2012,数据库版本要求尽量一致,避免因为数据库环境不同而遇到未知错误。
服务器类型 | IP | 服务器名 | 数据库文件夹 | 备份文件夹 | 共享文件夹 |
---|---|---|---|---|---|
主服务器 | 192.168.68.129 | SQL1 | C:\Database | C:\ShareFile | |
镜像服务器 | 192.168.68.130 | SQL2 | C:\DBback | \\SQL1\ShareFile | |
见证服务器 | 192.168.68.131 | SQL3 | \\SQL1\ShareFile |
1.3 共享文件夹
本次操作因为3台服务器都在同一局域网下,所以使用共享文件夹来传输数据库的备份文件和数据库证书。当然,也可以直接复制或通过其他文件传输方式进行文件传输。
共享文件夹必须有足够的权限(右健—共享—特定用户—添加(Everyone)—权限(读/写))。
Step 2:主服务器(SQL1)
2.1 创建测试数据库MirrorDB
CREATE DATABASE MirrorDB
ON(
NAME = MirrorDB_DATA,
FILENAME = N'C:\Database\MirrorDB.mdf'
)
LOG ON(
NAME = MirrorDB_LOG,
FILENAME = N'C:\Database\MirrorDB.ldf'
)
ALTER DATABASE MirrorDB SET
RECOVERY FULL
2.2 将数据库备份到共享文件夹
-- 完全备份
BACKUP DATABASE MirrorDB
TO DISK = N'C:\ShareFile\MirrorDB.bak'
WITH FORMAT
Step 3: 镜像服务器(SQL2)
3.1 将共享文件夹ShareFile下的MirrorDB.bak复制到SQL2下的DBback文件夹下
3.2 还原数据库MirrorDB到镜像服务器(SQL2)
代码:
RESTORE DATABASE MirrorDB
FROM DISK = N'C:\DBback\MirrorDB.bak'
WITH REPLACE
, NORECOVERY
-- 镜像数据库文件要放在指定位置, 则启用下面的 Move 选项
, MOVE 'MirrorDB_DATA' TO N'C:\Database\MirrorDB.mdf'
, MOVE 'MirrorDB_LOG' TO N'C:\Database\MirrorDB.ldf'
Step 4: 主服务器(SQL1)
4.1 使用数据库主密钥加密证书
IF NOT EXISTS(
SELECT * FROM sys.symmetric_keys
WHERE name = N'##MS_DatabaseMasterKey##')
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = N'zero@123';
CREATE CERTIFICATE CT_Mirror_SerA
WITH
SUBJECT = N'certificate for database mirror',
START_DATE = '19990101',--证书的生效日期
EXPIRY_DATE = '99991231'--证书的生效日期
4.2 创建一个数据库镜像端点
这里先要查看一下数据库镜像端点(DATABASE_MIRRORING)是否已经存在,若存在则先Drop或Alter。然后再创建端点。
--select * from sys.endpoints;
--drop endpoint 镜像 --删除已经存在的数据库镜像端点
--创建端点
CREATE ENDPOINT EDP_Mirror
STATE = STARTED
AS TCP(
LISTENER_PORT = 5022, -- 镜像端点使用的通信端口
LISTENER_IP = ALL) -- 侦听的IP地址
FOR DATABASE_MIRRORING(
AUTHENTICATION = CERTIFICATE CT_Mirror_SerA, -- 证书身份验证
ENCRYPTION = DISABLED, -- 不对传输的数据加密,如果需要加密,可以配置为 SUPPORTED 或 REQUIRED, 并可选择加密算法
ROLE = ALL) -- 端点支持所有的数据库镜像角色, 也可以设置为 WITNESS(仅见证服务器),或 PARTNER(仅镜像伙伴)
4.3 备份证书A到共享文件夹
BACKUP CERTIFICATE CT_Mirror_SerA
TO FILE = 'C:\ShareFile\CT_Mirror_SerA.cer'
注:新添加的文件显示在其它服务显示不出来时把此文件共享权限设置为Everyone读写
Step 5: 镜像服务器(SQL2)
5.1 使用数据库主密钥加密证书
--1.创建数据库主密钥
IF NOT EXISTS(
SELECT * FROM sys.symmetric_keys
WHERE name = N'##MS_DatabaseMasterKey##')
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = N'zero@123';
--2.创建数据库证书CT_Mirror_SerB
CREATE CERTIFICATE CT_Mirror_SerB
WITH
SUBJECT = N'certificate for database mirror',
START_DATE = '19990101',--证书的生效日期
EXPIRY_DATE = '99991231'--证书的失效日期
5.2 备份证书
BACKUP CERTIFICATE CT_Mirror_SerB
TO FILE = 'C:\DBback\CT_Mirror_SerB.cer';
BACKUP CERTIFICATE CT_Mirror_SerB
TO FILE = '\\SQL1\ShareFile\CT_Mirror_SerB.cer';
5.3 创建一个数据库镜像端点
这里先要查看一下数据库镜像端点(DATABASE_MIRRORING)是否已经存在,若存在则先Drop或Alter。然后再创建端点。
--select * from sys.endpoints;
--drop endpoint 镜像 --删除已经存在的数据库镜像端点
--创建数据库镜像端点
CREATE ENDPOINT EDP_Mirror
STATE = STARTED
AS TCP(
LISTENER_PORT = 5022, -- 镜像端点使用的通信端口
LISTENER_IP = ALL) -- 侦听的IP地址
FOR DATABASE_MIRRORING(
AUTHENTICATION = CERTIFICATE CT_Mirror_SerB, -- 证书身份验证
ENCRYPTION = DISABLED, -- 不对传输的数据加密,如果需要加密,可以配置为 SUPPORTED 或 REQUIRED, 并可选择加密算法
ROLE = ALL) -- 端点支持所有的数据库镜像角色, 也可以设置为 WITNESS(仅见证服务器),或 PARTNER(仅镜像伙伴)
5.4 登记主服务器的证书
将在主服务器的证书A从共享文件夹复制到副本服务器中的C盘DBback文件夹里,然后执行如下SQL语句:
--在副本服务器创建主服务器的证书
CREATE CERTIFICATE CT_Mirror_SerA
FROM FILE = 'C:\DBback\CT_Mirror_SerA.cer' --'\\SQL1\ShareFile\CT_Mirror_SerA.cer'
--建立登录
CREATE LOGIN LOGIN_Mirror_SerA
FROM CERTIFICATE CT_Mirror_SerA
--授予对数据库镜像端点的 connect 权限
GRANT CONNECT ON ENDPOINT::EDP_Mirror
TO LOGIN_Mirror_SerA
Step 6: 主服务器(SQL1)
6.1 登记镜像服务器的数据库证书
--在主服务器创建镜像服务器的证书
CREATE CERTIFICATE CT_Mirror_SerB
FROM FILE = 'C:\ShareFile\CT_Mirror_SerB.cer'
--建立登录
CREATE LOGIN LOGIN_Mirror_SerB
FROM CERTIFICATE CT_Mirror_SerB
--授予对数据库镜像端点的 connect 权限
GRANT CONNECT ON ENDPOINT::EDP_Mirror
TO LOGIN_Mirror_SerB
Step 7: 启用数据库镜像
7.1 镜像服务器(SQL2)启用数据库镜像
ALTER DATABASE MirrorDB SET
PARTNER = 'TCP://SQL1:5022'
7.2 主服务器(SQL1)启用数据库镜像
ALTER DATABASE MirrorDB SET
PARTNER = 'TCP://SQL1:5022'
7.3 结果
查看主数据库的镜像
查看数据库镜像监视器
主备同步方案已经完成,因为没有见证服务器不可进行自动故障转移,下面就是加入见证服务器,实现自动故障转移即数据库高可用。
Step 8:配置见证服务器(SQL3)
SQL代码:
--注:每个步骤的SQL逐个执行
--1.创建数据库主密钥
IF NOT EXISTS(
SELECT * FROM sys.symmetric_keys
WHERE name = N'##MS_DatabaseMasterKey##')
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = N'zero@123';
--2.创建证书
CREATE CERTIFICATE CT_Mirror_SerCWitness
WITH
SUBJECT = N'certificate for database mirror',
START_DATE = '19990101',
EXPIRY_DATE = '99991231';
--3.创建数据库端点
--select * from sys.endpoints;
--drop endpoint 镜像 --删除已经存在的数据库镜像端点
CREATE ENDPOINT EDP_Mirror
STATE = STARTED
AS TCP(
LISTENER_PORT = 5022, -- 镜像端点使用的通信端口
LISTENER_IP = ALL) -- 侦听的IP地址
FOR DATABASE_MIRRORING(
AUTHENTICATION = CERTIFICATE CT_Mirror_SerCWitness, -- 证书身份验证
ENCRYPTION = DISABLED, -- 不对传输的数据加密,如果需要加密,可以配置为 SUPPORTED 或 REQUIRED, 并可选择加密算法
ROLE = ALL) -- 端点支持所有的数据库镜像角色, 也可以设置为 WITNESS(仅见证服务器),或 PARTNER(仅镜像伙伴)
--4.备份证书到本地和共享文件夹
BACKUP CERTIFICATE CT_Mirror_SerCWitness
TO FILE = 'C:\DBback\CT_Mirror_SerCWitness.cer';
BACKUP CERTIFICATE CT_Mirror_SerCWitness
TO FILE = '\\SQL1\ShareFile\CT_Mirror_SerCWitness.cer';
--5.建立主体服务器上的证书
--5.1 创建证书
CREATE CERTIFICATE CT_Mirror_SerA
FROM FILE = '\\SQL1\ShareFile\CT_Mirror_SerA.cer';
--5.2 建立登录
CREATE LOGIN LOGIN_Mirror_SerA
FROM CERTIFICATE CT_Mirror_SerA;
--5.3 授予对数据库镜像端点的 connect 权限
GRANT CONNECT ON ENDPOINT::EDP_Mirror
TO LOGIN_Mirror_SerA;
--6.建立镜像服务器上的证书
--6.1 创建证书
CREATE CERTIFICATE CT_Mirror_SerB
FROM FILE = '\\SQL1\ShareFile\CT_Mirror_SerB.cer';
--6.2 建立登录
CREATE LOGIN LOGIN_Mirror_SerB
FROM CERTIFICATE CT_Mirror_SerB;
--6.3 授予对数据库镜像端点的 connect 权限
GRANT CONNECT ON ENDPOINT::EDP_Mirror
TO LOGIN_Mirror_SerB;
Step 9:登记见证服务器证书
9.1 镜像服务器
CREATE CERTIFICATE CT_Mirror_SerCWitness
FROM FILE = '\\SQL1\ShareFile\CT_Mirror_SerCWitness.cer';
CREATE LOGIN LOGIN_Mirror_SerCWitness
FROM CERTIFICATE CT_Mirror_SerCWitness;
GRANT CONNECT ON ENDPOINT::EDP_Mirror
TO LOGIN_Mirror_SerCWitness;
9.2 主服务器
CREATE CERTIFICATE CT_Mirror_SerCWitness
FROM FILE = '\\SQL1\ShareFile\CT_Mirror_SerCWitness.cer'
CREATE LOGIN LOGIN_Mirror_SerCWitness
FROM CERTIFICATE CT_Mirror_SerCWitness
GRANT CONNECT ON ENDPOINT::EDP_Mirror
TO LOGIN_Mirror_SerCWitness
Step 10:启用见证服务器
10.1 主服务器(SQL1)启用见证服务器(SQL3)
ALTER DATABASE MirrorDB SET
WITNESS = 'TCP://SQL3:5022'
10.2 结果
如下图
10.3 测试
断开主服务器(SQL1)后,发现SQL2变为主体服务器,SQL1变为镜像服务器,且SQL1状态为断开连接。
再次连接服务器SQL1,结果SQL1还是镜像服务器,主体服务器为SQL2。
至此,SQLServer高可用方案—数据库镜像搭建完毕。