ALTER DATABASE [Database_Name] SET WITNESS OFF
Before you set a mirroring Witness, create an endpoint for database mirroring on the witness server instance, andgrant connect permissions on the witness mirroring endpoint (
When a mirroring endpoint is created, only members of the sysadmin role and the endpoint owner have connect permissions to the endpoint.
To grant CONNECT on a previously created Mirroring Endpoint in SQL Server run following query:
USE master;
GO
GRANT CONNECT on ENDPOINT::Mirroring_Endpoint_Name TO [domain_name\user_name];
GO
To grant VIEW DEFINITION on a previously created Mirroring Endpoint in SQL Server run following query:
USE master;
GO
GRANT VIEW DEFINITION on ENDPOINT::Mirroring_Endpoint_Name TO [domain_name\user_name];
GO
To list logins that have been granted permissions on SQL Server Mirroring Endpoint, run following query:
SELECT e.name as mirror_endpoint_name, s.name AS login_name
)
, p.permission_name, p.state_desc as permission_state, e.state_desc endpoint_state
FROM sys.server_permissions p
INNER JOIN sys.endpoints e ON p.major_id = e.endpoint_id
INNER JOIN sys.server_principals s ON p.grantee_principal_id = s.principal_id
WHERE p.class_desc = 'ENDPOINT' AND e.type_desc = 'DATABASE_MIRRORING'
to login account of partner instances. On each of the partner server instances grant connect permissions on mirroring endpoint to login account of witness instance. On the principal server, run this code to set the new Witness (in this example database name is AdventureWorks, the Witness address is WTNSRVR, the witness database mirroring endpoint is 5024):
ALTER DATABASE AdventureWorks
SET WITNESS = 'TCP://WTNSRVR:5024'
GO
镜像数据库是SQL Server高可用性方案的一种。配置比较简单,但是有多种模式。如果镜像数据库出现异常,在不同模式下的表现形式也是各异的。这里,我们演练在不同模式下,服务器出现异常后,可能的效果,这样能帮助我们选择合适的模式,以及了解在对数据库镜像做维护期间,需要注意的地方。
【数据库镜像的模式】
数据库镜像主要有这么几种模式:
· High Performance模式(也就是异步模式)
数据库在Principle的事务,不需要得到Mirror的确认,可以直接完成。Principle数据库性能会比较好。但是Mirror跟Principle之间事务传递可能延迟。
· High Safety 模式(也就是同步模式)没有 witness服务器
数据库在Principle的事务,需要马上得到mirror的确认,才能完成。这种情况下,Mirror和Principle的数据是同步的。但是因为所有的事务需要mirror的确认,所以性能可能会有所影响。
· High Satefy模式(也就是同步模式)有 witness服务器
如果带有witness,那么一旦Principle数据库有异常,无法连通,则在witness服务器的见证下,会做自动切换。镜像数据库会变成主数据库,以继续提供服务。
【High Performance模式下,出现异常】
· MIRROR数据库有问题,这时候PRINCIPLE数据库会处于 (Principle, Disconnected)状态。在这种情况下,Principle数据库依旧能正常服务。当Mirror数据库恢复正常后,数据会自动进行同步,同步后,PRINCIPLE服务器会恢复到(Principle, Synchronized) 正常状态。这种情况虽然不会对服务造成问题,但是我们应该尽快恢复Mirror数据库,否则,在Principle端,日志会累积,变得越来越大。会占满磁盘空间。
· Principle数据库有问题,无法连接,这时候应用当然不能使用。Mirror数据库处于 (Mirror, Disconnected/In Recovery)状态。这时候我们有两种选择,1. 尽快恢复Principle数据库运营。2.使用Forcing Service方法把Mirror数据库改为主数据库以继续服务。对于Forcing Service方法,我们要注意:
1. 完全停掉旧的PRINCIPLE 数据库,以避免出现两边同时做数据更新。
2. 在mirror服务器上,我们用下面命令把mirror数据库改为主数据库:
ALTERDATABASE <Database> SETPARTNER FORCE_SERVICE_ALLOW_DATA_LOSS
3. 使用Forcing Service会导致数据有丢失的可能。如果在原先的主数据库数据还没来得及传送到镜像数据库,那么该部分数据会被丢失。所以使用Forcing Service我们需要权衡。
4. 原先的主数据库起来后,Mirror会处于暂停状态,我们可以恢复镜像,把原来的主数据库为新的镜像数据库 (当然,会导致部分数据永久丢失)。或者把原先的主数据库去除镜像设置,改为普通数据库,查看在原主数据库上写入而在原镜像数据库上没有写入的记录,然后手工倒入到新的主数据库上。用这种办法倒数据,我们需要对应用非常熟悉。
【High Satefy模式没有witness,出现异常】
· MIRROR数据库有问题,无法连接,PRINCIPLE数据库会处于 (Principle, Disconnected)状态。在这种情况下,PRINCIPLE数据库依旧能正常服务。当MIRROR服务器恢复正常后,数据会自动进行同步,同步后,PRINCIPLE数据库会处于 (Principle, Synchronized) 正常状态。这种情况虽然不会对服务造成问题,但是我们应该尽快恢复MIRROR数据库,否则,在PRINCIPLE数据库上,日志会累积,变得越来越大。最后可能导致磁盘满。
· PRINCIPLE服务器有问题,这时候应用当然不能使用。MIRROR数据库处于 (Mirror, Disconnected/In Recovery)状态。这时候我们有两种选择,1. 尽快恢复PRINCIPLE数据库。2.使用Forcing Service方法把Mirror数据库改为Principle以继续服务。
【High Satefy模式但有witness,出现异常】
· MIRROR数据库有问题,PRINCIPLE数据库会处于 (Principle, Disconnected)状态。在这种情况下,PRINCIPLE数据库依旧能正常服务。当MIRROR数据库恢复正常后,数据会自动进行同步,同步后,PRINCIPLE数据库会恢复到(Principle, Synchronized) 正常状态。同样,这种情况虽然不会对服务造成问题,但是我们应该尽快恢复MIRROR服务器,否则,在PRINCIPLE端,日志会累积,变得越来越大。
· PRINCIPLE数据库服务器有问题,服务停止,这时候,witness和mirror服务器会组成新的仲裁,由mirror数据库转换成Principle.处于(Principle, Disconnected)状态,继续服务。当原先的PRINCIPLE数据库服务器恢复正常时,镜像会自动形成,原先的Principle数据库会变成新的镜像服务器。如果PRINCIPLE数据库服务本身并没有中止,而是处于无法连接状态,这种情况,我们下面会进一步解释。
· WITNESS服务器有问题,这时候,没有影响,PRINCIPLE数据库还是处于(Principle, Synchronized)状态。当然,这时候系统处于有风险状态,万一Principle数据库再有危险,无法连接,整个镜像无法自动提供服务。
· WITNESS服务器和MIRROR数据库有问题。跟Principle数据库处于断网状态。
o 如果MIRROR和WITNESS之间,能够互联,这时候MIRROR和WITNESS会组成新的仲裁,以继续提供服务。为避免两个数据库同时提供服务,原先的Principle的数据库一旦无法同时连接到WITNESS服务器和MIRROR服务器,它会把自己设为暂停状态。无法打开该数据库,这样以避免两份数据库同时提供服务的情况,导致两边数据不一致。
o 如果WITNESS和MIRROR服务器之间也不能互联,这时候,整个镜像会停止工作。
· WITNESS服务器和PRINCIPLE服务器有问题。跟Mirror数据库处于断网状态。
o 如果PRINCIPLE和WITNESS之间,能够互联,则PRINCIPLE处于(Principle, Disconnected)状态,但数据库继续提供服务。
o 如果Principle和Witness之间,不能互联,则整个镜像会停止工作。
· PRINCIPLE服务器和Mirror服务器有问题。跟witness服务器处于断网状态。
o 如果PRINCIPLE和MIRROR之间,能够互联,则PRINCIPLE处于(Principle, Disconnected)状态,但数据库继续提供服务。
o 如果Principle和MIRROR之间,不能互联,则整个镜像会停止工作。
【小结】
在有witness服务器的情况下,数据库要能提供服务,必须要求三方中的至少两方能够互联。
我们要么不用Witness服务器,一旦用witness服务器,则这台witness服务器很重要。因为如果witness和mirror数据库同时连不上,则会导致Principle数据库停止工作。
Witness服务器应该跟Principle和mirror放在不同的网段中。如果一定要放在一起,那么宁可跟Principle放在一起,也不要跟mirror服务器放在一起。
在做维护的时候,如果有witness服务器,建议先把WITNESS去掉。不然有可能会导致我们所不期望的切换。
在做维护的时候且没有witness,则镜像数据库可以在High Satefy模式,也可以在High Performance模式。从风险角度来看,这两个模式差别不大。当然,如果可能,最好切换到High Performance模式做维护。
CREATE ENDPOINT DbMirroringEP
AS TCP (LISTENER_PORT = 5024)
FOR DATABASE_MIRRORING (ROLE = WITNESS, ENCRYPTION = SUPPORTED);
GO
ALTER ENDPOINT DbMirroringEP STATE = STARTED
GO
SELECT * FROM sys.database_mirroring_endpoints