为了方便,这里以主数据库和镜像数据库为例,不设置见证数据;

1、环境准备。

(1)准备一个主数据库服务器 10.10.10.1,一个镜像据库服务器 10.10.10.2;

(2)两个服务器都安装好SqlServer 2012;

2、数据库文件准备。

(1)主库创建一个数据库 EmptyDb,恢复模式为【完整】,自动关闭为【false】,

也可以用已经有的数据库,但是注意保证【恢复模式】:【完整】、【自动关闭】:【false】

 

 

(2)主库备份数据库 (完整备份)(注意还有做一次【事务日志备份】,备份指定的是一个文件)

(3)在镜像库还原数据库 ,保证镜像库还原中状态;

 

3、加密、证书生成、证书互换

(1)主库执行(保证主服务器存在路径d:\mirror)

USE master
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123456'
--创建本地证书
CREATE CERTIFICATE MirrorDB0_Cerf WITH SUBJECT='MirrorDB0_Cerf ',EXPIRY_DATE='20501230'
-- 创建镜像端点
CREATE ENDPOINT Mirroring STATE=STARTED
   AS TCP(LISTENER_PORT = 5022, LISTENER_IP = ALL)
   FOR DATABASE_MIRRORING
    (AUTHENTICATION = CERTIFICATE MirrorDB0_Cerf, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE=ALL)
-- 备份证书文件
BACKUP CERTIFICATE MirrorDB0_Cerf TO FILE ='D:\Mirror\MirrorDB0_Cerf.cer'

CREATE LOGIN sqlmirror WITH PASSWORD ='123456' --; //如果已经存在这个用户则不需要创建
CREATE USER sqlmirror FOR LOGIN sqlmirror--; //如果已经存在这个用户则不需要创建

(2) 镜像库执行(保证镜像服务器存在路径d:\mirror),跟主库基本一致,只是证书文件不一样;

 USE master
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123456'
--创建本地证书
CREATE CERTIFICATE MirrorDB0_Cerf WITH SUBJECT='MirrorDB1_Cerf ',EXPIRY_DATE='20501230'
-- 创建镜像端点
CREATE ENDPOINT Mirroring STATE=STARTED
   AS TCP(LISTENER_PORT = 5022, LISTENER_IP = ALL)
   FOR DATABASE_MIRRORING
    (AUTHENTICATION = CERTIFICATE MirrorDB0_Cerf, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE=ALL)
-- 备份证书文件
BACKUP CERTIFICATE MirrorDB0_Cerf TO FILE ='D:\Mirror\MirrorDB1_Cerf.cer'

CREATE LOGIN sqlmirror WITH PASSWORD ='123456' --; //如果已经存在这个用户则不需要创建
CREATE USER sqlmirror FOR LOGIN sqlmirror--; //如果已经存在这个用户则不需要创建

(3)文件拷贝

 把主库服务器的D:\Mirror\MirrorDB0_Cerf.cer 拷贝到镜像数据库服务器的D:\Mirror;

 把镜像服务器的D:\Mirror\MirrorDB1_Cerf.cer 拷贝到主库数据库服务器的D:\Mirror;

(4)主库执行

--交换证书
GRANT CONNECT ON ENDPOINT::Mirroring TO sqlmirror;
CREATE CERTIFICATE MirrorDB1_Cerf AUTHORIZATION sqlmirror FROM FILE='D:\Mirror\MirrorDB1_Cerf.cer'

 

(5)镜像库执行

GRANT CONNECT ON ENDPOINT::Mirroring TO sqlmirror;
CREATE CERTIFICATE MirrorDB0_Cerf AUTHORIZATION sqlmirror FROM FILE='D:\Mirror\MirrorDB0_Cerf.cer'

4、生成镜像

(1)镜像库执行

 ALTER DATABASE EmptyDb SET PARTNER = 'TCP://10.10.10.1:5022';

 

(2)主库执行

 ALTER DATABASE EmptyDb SET PARTNER = 'TCP://10.10.10.2:5022';

 5、查验是否成功

(1)主库的状态【主体,已同步】;

(2)镜像库的状态【镜像,已同步/正在还原中】;

(3)语句查询(主库和镜像库都可以),name表示启用了镜像的数据名称;

SELECT DISTINCT
        d.name ,
        m.mirroring_role_desc ,
        m.mirroring_state_desc 
FROM    sys.database_mirroring m
        JOIN sys.databases d ON m.database_id = d.database_id
WHERE   m.mirroring_role_desc IS NOT NULL

6、删除镜像。

 --手动执行故障转移
ALTER DATABASE ModelingTest_8011_Mirror SET PARTNER FAILOVER; 
--取消数据库镜像
ALTER DATABASE ModelingTest_8011_Mirror SET PARTNER OFF
--恢复数据库
restore database Modeling_EmptyDB with RECOVERY ;