时间:2021-07-01 10:21:17 帮助过:6人阅读
USE master;
CREATE CERTIFICATE SQLSVR1_cert
WITH SUBJECT =
‘SQLSVR1 certificate for database mirroring‘,
start_date=‘2019-03-01‘,expiry_date=‘2030-01-01‘;
GO
--3、 使用主服务器实例的证书 SQLSVR1_cert 为主服务器 SQLSVR1 创建端点。
Use naster;
CREATE ENDPOINT [默认的镜像端点]
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE SQLSVR1_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
--4、备份主体服务器 SQLSVR1 的加密证书。一定要保证证书安全无损。
BACKUP CERTIFICATE SQLSVR1_cert TO FILE =‘d:\temp_bak\SQLSVR1.cer‘;
--5、在主服务器实例的 master 数据库中为镜像服务器创建一个登录名
USE master;
CREATE LOGIN SQLSVR2_login
WITH PASSWORD=
‘Sample@#‘;
GO
--6、为5中新创建的登录名创建一个用户
USE master;
CREATE USER SQLSVR2_user FOR LOGIN SQLSVR2_login;
GO
--7、将用户与镜像服务器的证书相关联。
--已经将从服务器的证书本分SQLSVR2.CER拷贝到D:\temp_bak\
Use master;
CREATE CERTIFICATE SQLSVR2_cert
AUTHORIZATION SQLSVR2_user
FROM
FILE
=
‘D:\temp_bak\SQLSVR2.cer‘
GO
--8、授予其6中登录名对数据库镜像端点的 CONNECT 权限。
GRANT connect on endpoint::[默认的镜像端点] TO [SQLSVR2_login];
GO
--9、设置SQLSVR1中主库为完整恢复模式,并备份到从服务器SQLSVR2
Alter databases db_name set recovery full with no_wait
Backup databases db_name to disk=‘URL‘
/*
【1】先关闭事务备份作业。
【2】注意:模式的区别
(1)简单模式:那么设置为完整模式后全备到SQLSVR2即可
(2)大容量模式:那么设置为完整模式后,要利用之前的大容量模式下的全备,则需要顾及好日志链;(即要把主备+事务备+设置好完整模式后的事务备)
(3)完整模式:
如要利用以前的备份,则需要全备+全备之后的所有事务备
如果库小可以直接全备,再传输到SQLSVR2
(4)我的业务:主库搭建最佳实践:
*/
--10、(后做)设置镜像主从
Alter database db_name set partner=‘TCP//192.168.1.2:5022‘
--1、创建 master 数据库主密钥
Use master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘23987hxJ#KL95234nl0zBe‘;
GO
--2、对服务器实例创建一个用于其数据库镜像出站连接的加密证书。
USE master;
CREATE CERTIFICATE SQLSVR2_cert
WITH SUBJECT =
‘SQLSVR2 certificate for database mirroring‘,
start_date=‘2019-03-01‘,expiry_date=‘2030-01-01‘;
GO
--3、 使用从服务器实例的证书 SQLSVR2_cert 为从服务器 SQLSVR2 创建端点。
Use naster;
CREATE ENDPOINT [默认的镜像端点]
STATE = STARTED
AS TCP(
LISTENER_PORT=5022
, LISTENER_IP =ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE SQLSVR2_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
--4、备份从服务器 SQLSVR2 的加密证书。一定要保证证书安全无损。
BACKUP CERTIFICATE SQLSVR2_cert TO FILE =‘d:\temp_bak\SQLSVR2.cer‘;
--5、在从服务器实例的 master 数据库中为主体服务器创建一个登录名
USE master;
CREATE LOGIN SQLSVR1_login
WITH PASSWORD=
‘Sample@#‘;
GO
--6、为5中新创建的登录名创建一个用户
USE master;
CREATE USER SQLSVR1_user FOR LOGIN SQLSVR1_login;
GO
--7、将用户与镜像服务器的证书相关联。
--已经将主服务器证书的证书备份SQLSVR2.CER拷贝到D:\temp_bak\
Use master;
CREATE CERTIFICATE SQLSVR1_cert
AUTHORIZATION SQLSVR1_user
FROM
FILE
=
‘D:\temp_bak\SQLSVR1.cer‘
GO
--8、授予其6中登录名对数据库镜像端点的 CONNECT 权限。
GRANT connect on endpoint::[默认的镜像端点] TO [SQLSVR1_login];
GO
--9、还原SQLSVR1服务器上传过来的主数据库备份文件
Restore database db_name from disk=‘RRL‘ with norecovery,stats=10,
Move N‘logic_name‘to ‘RRL‘, Move N‘logic_name‘to ‘RRL‘
/*
【1】注意
(1)还原数据库:一定要和主库的数据库名一摸一样
(2)还原模式:一定要选择recovery模式,否则将会失败
(3)还原库文件的存放路径:尽量和主库的盘符及目录及名字一摸一样,否则不支持新增文件同步(我们这里没用到,暂时不用管)。
如果机器盘符目录不一致,那么需要在还原时用move选项来进行位置移动。
(4)我的业务:从库搭建最佳实践:
*/
--10、(先做)设置镜像主从
Alter database db_name set partner=‘TCP//192.168.1.1:5022‘
11、核验—基于SSMS
【11.1】主服务器/从服务器,查看数据库状态
右击数据库,刷新一下,看是否有出现这种情况
主服务器 从服务器
【11.2】查看数据库属性,镜像选项卡
12、核验—基于T-SQL
--创建快照
create database dbtank_demo1
on (name=‘db_tank_data‘,filename=‘d:\temp_bak\db_tank20190325.snap‘)
as SNAPSHOT of db_tank
go
--查看表数据最早时间(可以多弄几个表之类的看看)
select top(5) gettime from dbtank_demo1..sys_users_runegoods
where gettime >=‘20190320‘
order by gettime desc
--删除快照
drop databases dbtank_demo1
【1】.在高安全模式下:
在主机执行:
use master;
alter database Demo1 set partner failover;
即完成主备切换
【2】.在高性能模式下,需要先切换到高安全模式下再执行切换
use master;
alter database Demo1 set partner safety full;
alter database Demo1 set partner failover;
【3】.在主机(SQLSVR1)宕机的情况下在备机(SQLSVR2)进行强制切换:
use master;
alter database Demo1 set partner FORCE_SERVICE_ALLOW_DATA_LOSS;
当主机(SQLSVR1)重新开机后,在SQLSVR2机器上执行
use master;
alter database Demo1 set partner resume;
此时SQLSVR1成为了备机,而SQLSVR2成为了主机。
再到SQLSVR2机器上执行
alter database Demo1 set partner failover;
就成了SQLSVR1成为主机,SQLSVR2成为备机
【4】切换镜像在高性能模式下(慎用,可能会丢失数据)
use master;
alter database Demo1 set partner safety off;
【5】.关闭数据库镜像
ALTER DATABASE Demo1 SET PARTNER OFF
【6】.暂停与恢复数据库镜像
在主体镜像服务器上,若是不小心日志过大,可以进行暂停来设置日志上限
(1)暂停:ALTER DATABASE AdventureWorks2012 SET PARTNER SUSPEND;
(2)恢复:ALTER DATABASE AdventureWorks2012 SET PARTNER RESUME;
【7】移除见证服务器
USE [master]
GO
ALTER DATABASE Demo1 SET WITNESS OFF
GO
【1】启动数据库镜像监视器
sp_dbmmonitoraddmonitoring |
创建定期更新服务器实例上每个镜像数据库的状态信息的作业。 |
sp_dbmmonitorchangemonitoring |
更改数据库镜像监视参数的值。 |
sp_dbmmonitorhelpmonitoring |
返回当前更新持续时间。 |
sp_dbmmonitorresults |
返回所监视数据库的状态行,使您能够选择此过程是否预先获取最新的状态。 |
sp_dbmmonitordropmonitoring |
停止并删除服务器实例上所有数据库的镜像监视器作业。 |
重点查看
Use msdb
Go
--查看2个小时以内的同步数据记录
EXEC sp_dbmmonitorresults db_tank, 2, 0;
请检查网络地址名称,并检查本地和远程端点的端口是否正常运行。 (Microsoft SQL Server,错误: 1418)
后来在SQLServer日志中看到了如下错误: Database mirroring connection error 4 ‘An error occurred while receiving data: ‘10054(远程主机强迫关闭了一个现有的连接。)‘.‘ for ‘TCP://xxx:5022′.
通过这个错误找到了问题,c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\ 没有读写权限,一看真的是这样,加入管理员(即sqlserver的运行用户)的读写权限后一切正常!(如果还不行,配置权限后,再重新配置镜像)
具体见:http://dba.stackexchange.com/questions/6222/mirroring-problems-after-removing-domain
5 ‘Connection handshake failed. The login ‘ZBIAN\Administrator‘ does not have CONNECT permission on the endpoint. State 84.‘。
在日志中看到如上这个错误,发现是因为镜像数据库实例没有权限
对主数据库与镜像数据库进行了调整,主数据库与镜像数据库使用相同的实例账户,并重新启动数据库服务SQL Server (MSSQLSERVER)
(1)标准办法的连接字符串示例(参考:联机丛书—镜像数据库的连接字符串)
一般形式:"Server=Partner_A; Failover Partner=Partner_B; Database=AdventureWorks; "
举例演示:"Server=250.65.43.21,4734; Failover Partner=Partner_B; Database=AdventureWorks; "
(2)程序控制:
直接做IP判断即可,断线重试,重试几次后进行伙伴服务器连接尝试。
当一个数据库从一个实例迁移(恢复)到另外一个实例时,登录名数据并没有随之一起迁移。即使重新新建与数据库用户相同的登录名,却因为SID不同,也成了孤立的用户/孤立的登录名。即-》只有数据库用户。没有登录名,无法登陆实例,则数据库用户无用。 即-》有登录名与同名数据库用户,但是两者没有关联起来,则登录名登录到实例无法访问数据库。解决方案如下:
结论:假设故障转移前自增列的当前值为 X ,在故障转移后,自增列的初始值会变成:((X/1000)+1)*1000+1
(1). 因为主库或镜像库存在内存压力,导致无法完成镜像日志传送和重做
解决办法:设置数据库最小内存,保证数据库有足够内存完成镜像操作
(2) 因为主库和镜像库断开连接,导致镜像失败
解决办法:
1.使用TELNET IP 5022来检查双方之间的网络和端口是否打开
2.重启主库和镜像库的镜像端口
ALTER ENDPOINT [Endpoint_Mirroring] STATE=STOPPED
ALTER ENDPOINT [Endpoint_Mirroring] STATE=STARTED
连接上以后,如果主库与镜像没有自动开始继续同步,则使用如下进行尝试
(1)暂停:ALTER DATABASE AdventureWorks2012 SET PARTNER SUSPEND;
(2)恢复:ALTER DATABASE AdventureWorks2012 SET PARTNER RESUME;
3. 检查证书是否过期和被更换
use master;
select *from sys.certificates
--过期了就新建一个新的证书,然后alter endpoint endpoint_name来应用新的证书。然后从新关联用户与证书。
--查看镜像端点与证书的关系,是否被更换了
4.检查主库是否有非法关机的情况,如果存在,优先运行DBCC CHECKDB和检查备份
如果主库上备份还原失败,则需要使用备份从新搭建镜像
(1)状态:主库会变成Disconected 状态,表示失去与mirror连接,切断所有客户端连接, 停止读写服务,等待故障切换(默认超时为10S)
(2)结果:如果mirror与witness正常连接,mirror成为新的principal,开始对外提供读写服务。
(1)状态:principal与witness连接正常,principal状态变为Disconected,表示终止与mirror连接,mirror状态变为suspend; principal不再向mirror发送事务日志,等待mirror重新建立到witness链接后,principal才会恢复与mirror进行数据同步;
principal与mirror同时保持witness的连接会话,但是principal与mirror之间会话中断,witness会通知mirror,principal依然保持连接状态,不会触发故障切换;此时principal由于保持有witness的连接会话,服务正常;
只要mirror与witness会话正常,即可完成正常的故障转移;如果mirror与witness连接也中断,则无法完成,即便是后来mirror与witness的会话优先恢复,则也无法故障切换,因为已然不确定mirror是否拥有全部principal的数据,此时即便principal处于运行状态,也无法提供服务,等待principal与任意节点会话恢复正常,即可恢复读写服务;
【2】mirror 与 所有节点会话中断
不会触发故障切换,principal切入公开运行模式(异步),即不会再向mirror发送事务日志,也不再需要等待mirror的响应,直到mirror重新恢复会话。
【3】witness 与 所有节点会话中断
不会触发故障切换,principal继续提供读写服务,与mirror数据继续同步,镜像集群丧失自动故障转移能力,退化为不带故障转移的高安全模式;如果三方会话同时连接中断,则principal无法提供服务,直到principal与任意节点通信恢复正常。
镜像集群的监控可以通过SQL Server Management stdio启动镜像监视器,或者系统内置的存储过程来实现,监控的主要指标包括:
(1)未发送日志:principal上未发送的日志超过指定的阈值,会在principal上生成一个警告,在高性能模式下,强制服务时可以作为评估principal上事务丢失数量的依据,同样也适用于在高安全模式切换成异步模式状态下(mirror失去连接)
(2)未还原日志:重做队列中的未被应用的事务日志数量(KB),超过阈值,会在mirror上生成一个警告,该值可以作为评估故障转移时间的主要因素。
(3)最早未被发送的事务:principal发送队列中,最早未被发送的事务的至今的时间,单位时分钟,超过阈值,会在principal上生成警告,与未发送日志量一起,从时间维度,衡量高性能模式下和高安全异步模式下,数据丢失数量;
(4)镜像提交开销:高安全模式下,principal上事务从提交到等到mirror响应的时间开销的平均值,如果超过阈值,则在principal上生成一个警告,在同步模式下,该值可以i衡量同步开销;
USE master;
SELECT * FROM sys.certificates;
(1)数据库镜像端点
SELECT name, role_desc, state_desc, connection_auth_desc, encryption_algorithm_desc
FROM sys.database_mirroring_endpoints;
(2)查看所有端点
select * from sys.endpoints
修改状态:
ALTER ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (LISTENER_PORT = <port_number>)
FOR database_mirroring (ROLE = ALL);
GO
SELECT ‘Metadata Check‘;
SELECT EP.name, SP.STATE,
CONVERT(nvarchar(38), suser_name(SP.grantor_principal_id))
AS GRANTOR,
SP.TYPE AS PERMISSION,
CONVERT(nvarchar(46),suser_name(SP.grantee_principal_id))
AS GRANTEE
FROM sys.server_permissions SP , sys.endpoints EP
WHERE SP.major_id = EP.endpoint_id
ORDER BY Permission,grantor, grantee;
GO
查看与修改:
更多查阅参考:联机丛书--镜像
删除:
【1】. 删除某终端点(终端点不带引号) drop endpoint <endpoint_name>
【2】. 删除证书 在master | Security | Certificates (drop master key...)
【3】. 删除用户 在master |
User
【4】. 然后可以删除登录名 drop login <login_name>
【5】. 修改master key : alter master key
drop encryption by service master key
【6】. 删除master key : drop master key
【7】. 删除镜像的命令: alter databse <dbname>
set partner off
参考:如何使用T-SQL查看镜像状态
主服务器:SQLSVR3, 192.168.1.3 |
加入见证服务器
--USE master; --DROP MASTER KEY
--1、创建 master 数据库主密钥 Use master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘23987hxJ#KL95234nl0zBe‘;
GO ------------ USE master; ---2、然后对服务器实例创建一个用于其数据库镜像出站连接的加密证书。 --drop CERTIFICATE SQLSVR3_cert CREATE CERTIFICATE SQLSVR3_cert WITH SUBJECT = ‘SQLSVR3 certificate for database mirroring‘, start_date=‘2019-03-01‘,expiry_date=‘2030-01-01‘;
GO
--3、使用主体服务器实例的证书 SQLSVR3_cert 为主体服务器 SQLSVR3 创建端点。 CREATE ENDPOINT [默认的镜像端点] STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE SQLSVR3_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
GO
---4、备份见证服务器 SQLSVR3 的加密证书。请确保此证书保存在安全可靠的存储介质上。
BACKUP CERTIFICATE SQLSVR3_cert TO FILE = ‘D:\temp_bak\SQLSVR3.cer‘;
GO
--5、创建登录名,在见证服务器实例的 master 数据库中为主体、镜像服务器分别创建1个登录名
USE master;
CREATE LOGIN SQLSVR2_login WITH PASSWORD = ‘Sample@#‘; GO
CREATE LOGIN SQLSVR1_login WITH PASSWORD = ‘Sample@#‘; GO
--6、为新创建的2登录名分别创建一个用户
USE master;
CREATE USER SQLSVR2_user FOR LOGIN SQLSVR2_login; GO
CREATE USER SQLSVR1_user FOR LOGIN SQLSVR1_login; GO
--7、将用户与镜像服务器的证书相关联 USE master;
CREATE CERTIFICATE SQLSVR2_cert AUTHORIZATION SQLSVR2_user FROM FILE = ‘D:\temp_bak\SQLSVR2.cer‘ GO
CREATE CERTIFICATE SQLSVR1_cert AUTHORIZATION SQLSVR1_user FROM FILE = ‘D:\temp_bak\SQLSVR1.cer‘ GO
--8、授予其各自的登录名对数据库镜像端点的 CONNECT 权限。 USE master;
GRANT connect on endpoint::[默认的镜像端点] TO [SQLSVR2_login]; GO
GRANT connect on endpoint::[默认的镜像端点] TO [SQLSVR1_login]; GO
--9、然后在主、从库上都创建登录名、用户、绑定证书、授权端点(已经复制见证服务器的SQLSVR3.cer证书过去) USE master;
CREATE LOGIN SQLSVR3_login WITH PASSWORD = ‘Sample@#‘; GO
CREATE USER SQLSVR3_user FOR LOGIN SQLSVR3_login; GO
CREATE CERTIFICATE SQLSVR3_cert AUTHORIZATION SQLSVR3_user FROM FILE = ‘D:\temp_bak\SQLSVR3.cer‘ GO
GRANT connect on endpoint::[默认的镜像端点] TO [SQLSVR3_login]; GO
--10、在主从库上进行与见证服务器连接 ALTER DATABASE AdventureWorks2012 SET WITNESS = ‘TCP://192.168.214.13:5022‘
-- 验证结果
复制代码
这里的IP尾数,11为SQLSVR1,12为SQLSVR2,13为见证服务器 然后关掉主库11的引擎服务,查看从库是否实现故障转移~
成功~ |
主服务器:SQLSVR1 |
从服务器:SQLSVR1 |
【1】检查:网络,实例端口,镜像端口(5022),版本信息一致性 |
【1】检查:网络,实例端口,镜像端口(5022),版本信息一致性 |
【2】初始化:完整模式下,备份主库 |
【2】初始化:以norecovery的方式还原从主库获取的完整日志链备份 |
【3】登录名:可以手动构建域账户作为镜像登录名也可以在主数据库镜像配置向导中输入一个不存在的,则sql server会自动创建该登录名,并给与端点connect权限与数据库的public权限; |
|
【4】配置:使用配置数据库安全向导,配置主从与见证,端点与登录名 |
|
【5】核验:
|
【1】 检查:略
(4.1)右击数据库-》属性/右击数据库-》任务-》镜像 (4.2)点击上图中的配置安全性,直接下一步 (4.3)选择是否配置见证服务器,这里暂时先不配置 (4.4)主服务器实例与端口配置 配置向导默认使用 5022 端口进行侦听。如果主体服务器已经手动创建了端点,配置向导将选取这个端点。 (4.5)镜像服务器实例与端口配置 在"镜像服务器实例"页,单击"连接"按钮,连接到镜像服务器实例。在连接到镜像服务器时,请注意使用有权限的登录帐户,该登录帐户必须具有在镜像服务器创建端点和登录名的权限。配置向导可以默认为其分配侦听器端口。如果镜像服务器已经手动创建了端点,配置向导将选取这个端点。 (4.6)服务帐户与端点授权 分别为主体和镜像指定一个域帐户。配置向导将为这些帐户创建登录名,并为其授予对端点的 CONNECT 权限。这个登录名只需要 public 固定服务器角色即可 点击下一步 点击完成 (4.7)开始镜像 完成"配置安全性"过程后,配置向导自动询问是否立即开始镜像。若要立即开始镜像,则单击"开始镜像"。 如果单击"不开始镜像",将返回到数据库镜像配置的主界面。可以在配置界面上单击"开始镜像"。
(5.1)登录名 配置向导如果没有检查到指定的登录名,则将自动为 Windows 帐户创建登录名。 (5.2)端点 确认配置向导是否成功创建了端点。 (5.3)主体数据库和辅助数据库的状态 配置成功后,主体数据库的状态应为"主体,已同步",镜像数据库的状态应为"镜像,已同步/正在还原..."。
|
【转】SQL SERVER 主体,已同步
标签:order sel 均值 基本 持久 end pre 控制 nec