平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“SQL Server2008 R2 数据库镜像实施手册(双机)SQL S……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
一、设置主备机
1、 服务器基本信息
主机名称为:HOST_A,IP地址为:192.168.1.155
备机名称为:HOST_B,IP地址为:192.168.1.156
二、主备实例互通
理解这一步时,实现互通能够采用域或证书来实现,考虑实现的轻松,以下选取证书的方式实现。注意:实现“主备数据库实例互通”的操作只需做一次,比如为了将两个SQL Server 2008的实例中的5个数据库建成镜像关系,则只需做一次以下操作就能够了;或者这样理解:每一对主备实例(不是数据库)做一次互通。
1、新建证书(主备可并行执行)
--主机执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
START_DATE = '2012-08-02',
EXPIRY_DATE = '2099-08-02';
--备机执行:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
START_DATE = '2012-08-02',
EXPIRY_DATE = '2099-08-02';
2、新建连接的端点(主备可并行执行)
--主机执行:
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 );
--备机执行:
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 );
3、备份证书以备建立互联(主备可并行执行)
--主机执行:
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'C:SQLBackupHOST_A_cert.cer';
--备机执行:
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'C:SQLBackupHOST_B_cert.cer';
4、互换证书
从实现思路看,将备份到C:SQLBackup的证书进行互换,即HOST_A_cert.cer复制到备机的C:SQLBackup。HOST_B_cert.cer复制到主机的C:SQLBackup。
5、添加登陆名、用户(主备可并行执行)
理解这一步时,以下操作只能借助命令行运行,借助图形界面无法完成。(截至SQL Server2005的补丁号为SP2)
--主机执行:
CREATE LOGIN HOST_B_login WITH PASSWORD = '123456';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'C:SQLBackupHOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
--备机执行:
CREATE LOGIN HOST_A_login WITH PASSWORD = '123456';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'C:SQLBackupHOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
三、建立镜像关系
结合项目来看,以下步骤是针对每个数据库进行的,比如:现有主机中有5个数据库以下过程就要执行5次。
1、 手工同步登录名和密码
从实现思路看,在上下文提到数据库镜像的缺点之一是无法维护登录名,所以需我们手工维护登录。
从实现思路看,通常来说数据库都将会有若干个用户作为访问数据库的用户,同时且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,比如某业务系统采用'myuser'作为登录名访问数据库,但是在备机中没有'myuser'这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"。在主机和备机数据库上建立相同用户名及密码即可。
2、 准备备机数据库(主机备份及镜像还原)
在主机上备份数据库,先做完整备份,再做日志事务备份。
1、主数据必须设置成完整模式进行备份,如下所示图:

上图中将“恢复模式”选成“完整模式”。
2、备份数据库,如下所示图:

备份时将“备份类型”选成“完整”。
3、备份事务日志,如下所示图:

将“备份类型”选成“事务日志”且备份目录与备份数据库的目录一致。
落到代码里,将备份文件在备机上采用主机的全备文件进行还原,在还原数据的时候需采用选上“with non recover”。如图所示:

如果执行成功数据库将会变成这个样子:
3、 建立镜像
--在备机中执行如下语句:
ALTER DATABASE shishan SET PARTNER = 'TCP://192.168.1.155:5022';
说明:shishan为数据库名,需要根据实际进行修改。192.168.1.155为主机IP地址,需根据实际进行修改。
--主机执行:
ALTER DATABASE shishan SET PARTNER = 'TCP://192.168.1.156:5022';
说明:shishan为数据库名,需根据实际进行修改。192.168.1.156为备机IP地址,需根据实际进行修改。
执行成功后:

到此,SQL镜像热备设置完成。
四、常用命令
--切换主备
use master;
alter database testdb set partner failover;
-- 备机强制切换
use master;
alter database testdb set partner force_service_allow_data_loss;
--恢复镜像
use master;
alter database testdb set partner resume;
--取消见证服务器
ALTER DATABASE testdb SET WITNESS OFF ;
--取消镜像
ALTER DATABASE testdb SET PARTNER OFF;
--设置镜像数据库还原为正常
RESTORE DATABASE testdb WITH RECOVERY;
备份主数据库出现:Backup a database on a HDD with a different sector size,能够执行以下语句备份:
BACKUP DATABASE MyDB TO DISK = N'D:MyDB.bak' WITH INIT , NOUNLOAD , NAME = N'MyDB backup', STATS = 10, FORMAT
总结
结合项目来看,要进行以上sql server的镜像设置一定要采用sql server 的设置管理器开启TCP/IP协议,如下所示图

在这个场景下,若没有启用TCP/IP协议则只能在同一个网段内的机器设置镜像,前面的设置步骤里面所用到的IP地址要换成对应的实例名。同一个网段设置同时采用镜像的时实性、传输速率更高,适用来大数据量的同步,跨网段或者跨公网的sql server 镜像一般适用来数据量小,时实性要求不高的数据同步,而且数据库在公网上同步也不安全。
- sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(181418456)
- Java连接sqlserver2008数据库代码
- PHP 5.6.11 访问SQL Server2008R2的几种情况详解
- win2008 r2 服务器php+mysql+sqlserver2008运行环境设置(从安装、优化、安全等)
- SqlServer2008误操作数据(delete或者update)后恢复数据的方法
- sqlserver2008首次登录失败问题及解决方法