询问者
镜像配置出现的一些问题

问题
-
今晚按照这篇文章做了一下镜像配置:http://www.cnblogs.com/killkill/archive/2008/05/23/1205792.html
我的环境:家里两台电脑,一台手提:win7 32位 SQL2005开发版SP3 ,台式机Windows2003 32位 SQL2008 SP1 企业版
家里的局域网,没有见证服务器,就这两台电脑做镜像 win7是主机 win2003是备机
出现两个问题
问题一:向备机发出ALTER DATABASE DB SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
备机会执行出错,抛出“无法对数据库 "DB" 强制执行数据库镜像服务,因为该数据库未处于要成为主体数据库的正确状态。”
下面是问题一的图片
问题二:在做测试的时候执行下面语句就报错
USE master;
ALTER DATABASE GPOSDB SET PARTNER RESUME; --恢复镜像
ALTER DATABASE GPOSDB SET PARTNER FAILOVER; --切换到主机
消息 1422,级别 16,状态 2,第 3 行
镜像服务器实例未反映数据库 "GPOSDB" 的最近更改。无法进行故障转移。本人没有设置过安全模式 ALTER DATABASE GPOSDB SET PARTNER SAFETY ,采用的是默认设置
问题二图片
- 已编辑 Steven.桦仔 2017年3月30日 6:25 sdf
全部回复
-
问题1,确认你的操作是正确的,并且满足条件
参考联机帮助上的语法说明:
http://msdn.microsoft.com/zh-cn/library/bb522476.aspx
- FORCE_SERVICE_ALLOW_DATA_LOSS
未发生自动故障转移时,在数据库处于不同步状态或处于同步状态的情况下当主体服务器失败后,强制数据库服务转向镜像数据库。
强烈建议仅在主体服务器不再运行时强制运行该服务。 否则,某些客户端可能会继续访问原始主体数据库而不是新的主体数据库。
FORCE_SERVICE_ALLOW_DATA_LOSS 仅在镜像服务器上可用,且下列条件必须全部成立:
-
主体服务器已关闭。
-
WITNESS 设置为 OFF,或者将见证服务器连接到镜像服务器。
-
今晚我是这样操作的
--1、主备互换
--主机停掉SQL服务
--2、主服务器Down掉,备机紧急启动并且开始服务
--备机执行:
USE master;
ALTER DATABASE S_C_SC SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
ALTER DATABASE S_C_SC SET ONLINE--这时候备机可以访问了
--3、开启主机的SQL服务,原来的主服务器恢复,可以继续工作,需要重新设定镜像
--备机执行:
USE master;
ALTER DATABASE S_C_SC SET PARTNER RESUME; --恢复镜像--主机执行
ALTER DATABASE S_C_SC SET PARTNER FAILOVER; --切换到主机当我做到第3步的时候,在备机执行下面这句话的时候弹出下面这个错误,我没有做过任何操作,不知道为何会这样
ALTER DATABASE S_C_SC SET PARTNER FAILOVER; --切换到主机
消息 1417,级别 16,状态 1,第 1 行
数据库 "S_C_SC" 的管理员已禁用数据库镜像。
- 已编辑 Steven.桦仔 2017年3月30日 6:25 e
-
-
今晚加了见证服务器 3台计算机都可以telnet通和ping通,但是当我停掉主机的SQL服务的时候,备机没有自动变成主体服务器,不知道是不是见证服务器不起作用,
见证服务器使用的是SQLEXPRESS2005 sp3 ,用手动切换服务器也不行,就快放弃了,我按照下面的脚本配置的
在备机执行下面语句报错:
USE master;
ALTER DATABASE S_C_SC SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
ALTER DATABASE S_C_SC SET ONLINE
消息 1455,级别 16,状态 106,第 2 行
无法对数据库 "S_C_SC" 强制执行数据库镜像服务,因为该数据库未处于要成为主体数据库的正确状态。
消息 1468,级别 16,状态 5,第 3 行
无法对数据库 "S_C_SC" 执行该操作,因为该数据库参与了数据库镜像会话。
消息 5069,级别 16,状态 1,第 3 行
ALTER DATABASE 语句失败。 -
配置的脚本
--SQL2005数据库镜像的步骤 ------------------------------------------------------------------------------------------- --1、设置镜像数据库为完整恢复模式 alter DATABASE S_C_SC set recovery FULL --2、创建证书(主备可并行执行) --主机执行 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'joe'; CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' , START_DATE = '2012-09-25'; --备机执行 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'joe'; CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate' , START_DATE = '2012-09-25'; --见证执行 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'joe'; CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = 'HOST_C certificate' , START_DATE = '2012-09-25'; --3、创建连接的端点(主备可并行执行) --主机执行: USE master CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_A_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL ); --备机执行: USE master CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL ); --见证执行: USE master CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_C_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = WITNESS ); --4、备份证书以备建立互联(主备可并行执行) --主机执行: USE master BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\SQLBackup\HOST_A_cert.cer'; --备机执行: USE master BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\SQLBackup\HOST_B_cert.cer'; --见证执行: USE master BACKUP CERTIFICATE HOST_C_cert TO FILE = 'D:\SQLBackup\HOST_C_cert.cer'; --5、互换证书 -- --将备份到D:\SQLBackup\的证书进行互换,即HOST_A_cert.cer复制(是复制不是剪切) --到备机的D:\SQLBackup\。HOST_B_cert.cer复制(是复制不是剪切)到主机的D:\SQLBackup\ --见证的证书HOST_C_cert.cer复制到主机和备机,主机和备机复制到见证 --6、添加登陆名、用户(主备见证可并行执行) --以下操作只能通过命令行运行,通过图形界面无法完成。(截至文档编写结束,SQL Server2005的版本号为SP2) --主机执行: USE master CREATE LOGIN HOST_B_login WITH PASSWORD = 'test'; CREATE USER HOST_B_user FOR LOGIN HOST_B_login; --CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer'; CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\HOST_B_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login] USE master CREATE LOGIN HOST_C_login WITH PASSWORD = 'test'; CREATE USER HOST_C_user FOR LOGIN HOST_C_login; CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'D:\HOST_C_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login]; GO --备机执行: USE master CREATE LOGIN HOST_A_login WITH PASSWORD = 'test'; CREATE USER HOST_A_user FOR LOGIN HOST_A_login; --CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\SQLBackup\HOST_A_cert.cer'; CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\HOST_A_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login]; USE master CREATE LOGIN HOST_C_login WITH PASSWORD = 'test'; CREATE USER HOST_C_user FOR LOGIN HOST_C_login; CREATE CERTIFICATE HOST_C_cert AUTHORIZATION HOST_C_user FROM FILE = 'D:\HOST_C_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login]; GO --见证执行: USE master CREATE LOGIN HOST_A_login WITH PASSWORD = 'test'; CREATE USER HOST_A_user FOR LOGIN HOST_A_login; --CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\SQLBackup\HOST_A_cert.cer'; CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'D:\HOST_A_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login]; USE master CREATE LOGIN HOST_B_login WITH PASSWORD = 'test'; CREATE USER HOST_B_user FOR LOGIN HOST_B_login; --CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer'; CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\HOST_B_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login]; ------------------------------------------------------------------------------------------------------- --建立镜像关系--------------------------------------------------------------------------------------- --以下步骤是针对每个数据库进行的,例如:现有主机中有5个数据库以下过程就要执行5次。 --7、 手工同步登录名和密码 --在前面提到数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录解决孤立用户。 --在主数据库中执行如下语句: USE master; select sid,name,dbname from syslogins WHERE dbname='S_C_SC' --查找出要做镜像的那个数据库里面有哪些用户名和sid,例如:上述的’myuser’ --在备库中执行如下语句: USE master; exec sp_addlogin @loginame = '<LoginName>', @passwd = '<Password>', @sid = <sid> ; --8、准备备机数据库 --主库要备份两个bak文件 --第一个:完整备份 --第二个:事务日志备份 ,截断事务日志 --(1)先在备机还原完整备份,“restore with norecovery”和 覆盖现有数据库 --(2)再还原事务日志,“restore with norecovery” 和时间点:最近状态 --由于是实验,没有为服务器配置双网卡,IP地址与图有点不一样,但是原理一样。 --9、必须要在镜像数据库中先设置好伙伴后,才能在主体服务器执行 --再在主体服务器实例上,将 备机上的服务器实例设置为伙伴 --备机执行 USE master ALTER DATABASE S_C_SC SET PARTNER = 'TCP://192.168.1.100:5022' --主机执行 USE master ALTER DATABASE S_C_SC SET PARTNER = 'TCP://192.168.1.103:5022' --10、在主机执行设置见证服务器 ALTER DATABASE S_C_SC SET WITNESS = 'TCP://192.168.1.101:5022'; GO -------------------------测试------------------------------ --1、主备互换 --主机停掉SQL服务 --2、主服务器Down掉,备机紧急启动并且开始服务 --备机执行: USE master; ALTER DATABASE S_C_SC SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS; ALTER DATABASE S_C_SC SET ONLINE --3、开启主机的SQL服务,原来的主服务器恢复,可以继续工作,需要重新设定镜像 --备机执行: USE master; ALTER DATABASE S_C_SC SET PARTNER RESUME; --恢复镜像 ALTER DATABASE S_C_SC SET PARTNER FAILOVER; --切换到主机 --4、原来的主服务器恢复,可以继续工作