SQL server-镜像复制

Posted Log4g

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL server-镜像复制相关的知识,希望对你有一定的参考价值。

一、背景:
需要将苏州业务实例搭建一套灾备实例,用于苏州实例异常情况下的高可用
苏州实例可以支撑当前业务访问量,所以不需要无锡灾备拥有读写能力,只要苏州异常,无锡可以接管业务即可
考虑到使用发布订阅需要所有表带有主键,并且灾备实例拥有写的能力,有可能会产生数据冲突,当前没有更好的办法进行限制,故排除。
镜像复制没有主键要求,并且备机不可读写,所以不会产生数据冲突,实时复制,延迟小,作为灾备实例更合适,当主机异常时可以手动进行切换。

二、配置镜像注意点:
1.数据库的模式要是完整模式。
2.要对数据库完整备份和事务日志备份,分别还原到镜像库上,使用 NORECOVERY 模式。
3.镜像数据库是不允许删除和操作,即便查看属性也不行。
4.先删除端点,再删除证书,再删除主密钥。
5.只有是同步模式的时候,才能手动故障转移,异步模式不能手动故障转移。
6.要进行sql server的镜像设置一定要使用sql server 的配置管理器开启TCP/IP协议,如果没有启用TCP/IP协议则只能在同一个网段内的机器配置镜像,前面的配置步骤里面所用到的IP地址要换成对应的实例名。同一个网段配置并使用镜像的时实性、传输速率更高,适用于大数据量的同步,跨网段或者跨公网的sql server 镜像一般适用于数据量小,时实性要求不高的数据同步,而且数据库在公网上同步也不安全。

三、配置镜像操作步骤:

1.修改主机名,更改完会提示需要重启,确认重启即可
苏州主机:10.60.96.98  更改为 suz-etos2mdb
无锡备机:10.70.75.232 更改为 wux-etos2mdb

2.更改host解析
进入C:\\Windows\\System32\\drivers\\etc,找到hosts文件,编辑添加主机和备机的IP主机名
如:
10.60.96.98    suz-etos2mdb
10.70.75.232   wux-etos2mdb

3.苏州主机数据/日志还原到无锡备机
主/备数据库的名字,账号密码建议统一一样,服务不会自动维护用户密码,所以需要提前设置好,防止切换以后应用连接不上。
数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。
通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用’myuser’作为登录名访问数据库,但是在备机中没有’myuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"。在主机和备机数据库上建立相同用户名及密码即可。

#还原数据参考链接:https://blog.csdn.net/tony0225/article/details/103452771
#刷新数据库:RESTORE database 数据库名  with recovery  --清除正在还原字样,注意:不能还原,否则无法镜像成功
#windows界面配置镜像:https://blog.csdn.net/dba_huangzj/article/details/28904503

##主机操作##
1.创建数据库主密钥
  use master
  create master key encryption by password = \'Etocrm2014\';  --密码要符合复杂度
  select * from sys.symmetric_keys ;  --查看生成的数据库主密钥
  
2.创建证书,证书名字为suzhou
  use master
  create certificate suzhou_cert with subject = \'suzhou certificate for database mirroring\', start_date = \'09/06/2022\', expiry_date = \'12/31/2039\';  
  select * from sys.certificates;  --查询证书
  drop certificate suzhou_cert;  --删除证书
  
3.创建主库镜像和端点
  use master
  create endpoint db_mirr state = started as tcp( listener_port=5022 ,listener_ip = all ) for database_mirroring( authentication = certificate suzhou_cert, encryption = required algorithm rc4, role = all); 
  --db_mirr  --端点名字
  --listener_port=5022  --镜像端点使用的通信端口
  --listener_ip = all   --侦听的IP地址
  --authentication = certificate suzhou_cert  --证书身份验证
  --encryption = required algorithm rc4 --不对传输的数据加密,如果需要加密,可以配置为 SUPPORTED 或 REQUIRED, 并可选择加密算法
  --role = all  --端点支持所有的数据库镜像角色, 也可以设置为 WITNESS(仅见证服务器),或 PARTNER(仅镜像伙伴)
  --查询创建的镜像和端点
  --select * from sys.tcp_endpoints;      
  --select * from sys.database_mirroring_endpoints;

4.备份证书
  use master
  backup certificate suzhou_cert to file = \'D:\\ShareFile\\suzhou.cer\';  --备份目录没有的话,需要先创建
  
5.创建登入,创建登录名,和证书关联,主机创建备机,备机创建主机
  use master
  create login wuxi_login with password = \'Etocrm2014\'; 
  create user wuxi_user for login wuxi_login;

##备机操作##
1.创建数据库主密钥
  use master
  create master key encryption by password = \'Etocrm2014\';
  select * from sys.symmetric_keys ;  --查看生成的数据库主密钥
  
2.创建证书,证书名字为wuxi
  use master
  create certificate wuxi_cert with subject = \'wuxi certificate for database mirroring\', start_date = \'09/06/2022\', expiry_date = \'12/31/2039\'
  select * from sys.certificates;   --查询证书
  
3.创建镜像端点
  use master
  create endpoint db_mirr state = started as tcp( listener_port=5022 ,listener_ip = all ) for database_mirroring( authentication = certificate wuxi_cert, encryption = required algorithm rc4, role = all);
  --db_mirr  --端点名字
  --listener_port=5022  --镜像端点使用的通信端口
  --listener_ip = all   --侦听的IP地址
  --authentication = certificate wuxi_cert  --证书身份验证
  --encryption = required algorithm rc4 --不对传输的数据加密,如果需要加密,可以配置为 SUPPORTED 或 REQUIRED, 并可选择加密算法
  --role = all  --端点支持所有的数据库镜像角色, 也可以设置为 WITNESS(仅见证服务器),或 PARTNER(仅镜像伙伴)
  --查询创建的镜像端点 
  --select * from sys.tcp_endpoints;
  --select * from sys.database_mirroring_endpoints;
  
4.备份证书
  use master
  backup certificate wuxi_cert to file = \'D:\\ShareFile\\wuxi.cer\';
  
5.创建登入,创建登录名,和证书关联,主机创建备机,备机创建主机(需要验证,此步两篇博文写的不一样)
  use master
  create login suzhou_login with password = \'Etocrm2014\'; 
  create user suzhou_user for login suzhou_login;

#复制交换密匙,保证在主机和备机的\\ShareFile\\下路径都有suzhou.cer和wuxi.cer文件
##主机操作##
1.从副机服务器上D:\\ShareFile\\下拷贝备份出来的证书wuxi.cer到主机服务器的D:\\ShareFile\\下
  还原备机服务器证书到主机服务器上
  use master 
  create certificate wuxi_cert authorization wuxi_user from file = \'D:\\ShareFile\\wuxi.cer\';
  grant connect on endpoint::db_mirr to [wuxi_login];  #赋权 
  
##备机操作##
1.从主机服务器上D:\\ShareFile\\下拷贝备份出来的证书suzhou.cer到副机服务器的D:\\ShareFile\\下
  还原主机服务器证书到备机服务器上;
  use master 
  create certificate suzhou_cert authorization suzhou_user from file = \'D:\\ShareFile\\suzhou.cer\'
  grant connect on endpoint::db_mirr to [suzhou_login];  #赋权 

#设置伙伴,建立镜像关系(自动启动镜像,先在备机库上操作,然后在主机库上操作)
#切换到备机服务器
use master
alter database test01 set partner = \'TCP://suz-etos2mdb:5022\';
说明:test01为数据库名,需要根据实际进行修改。WIN-SUZHOU001为主机域名,需根据实际进行修改

#切换到主机服务器
use master
alter database test01 set partner = \'TCP://wux-etos2mdb:5022\';

#这时就已经完成镜像备份了,可以打开数据库镜像监视器查看同步情况,状态不对的话,先刷新试试,完成状态如下图
#参考图:https://www.cnblogs.com/Lxxv5/p/14089973.html

#创建主库中的用户到备机中
#主库执行:
use master
select sid,name from syslogins

#备库执行:
use master
exec sp_addlogin @loginame = haha , @passwd = Etocrm2014 , @sid = 0xDAB903E5DECAF2469799AC92F8810D46

#主库有多个用户时执行多次 
#至此完成镜像所有配置

四、切换主备

#主库宕机后,怎么恢复镜像库为可用状态#
1.脱离镜像
alter database test01 set partner off

2.修改数据库的状态为recovery
restore database test01 with recovery

#脱离镜像后还要建立镜像的话,可以重新备份数据库和事务日志用NORECOVERY模式还原,然后连接镜像#
use master  --连接镜像,先在备机库上操作,然后在主机库上操作
ALTER DATABASE test01 SET PARTNER = \'TCP://suz-etos2mdb:5022\';

#常用命令#
--切换主备(在主机principle数据库所在HOST上执行)
use master;
alter database test01 set partner failover;

--备机强制切换(在备机上数据库状态非同步状态下可执行)
use master;
alter database testdb set partner force_service_allow_data_loss;

--恢复镜像
use master;
alter database testdb set partner resume;

#备份主数据库出现: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;

五、参考链接
参考链接:https://blog.csdn.net/pixel123/article/details/107056719/
参考链接:https://blog.csdn.net/tony0225/article/details/103452771
参考链接:https://www.cnblogs.com/soleds/p/11854906.html
参考链接:https://www.cnblogs.com/Lxxv5/p/14089973.html

如何使用 SQL Query 在 SQL Server 中的表级别进行镜像或复制

【中文标题】如何使用 SQL Query 在 SQL Server 中的表级别进行镜像或复制【英文标题】:How to do mirroring or replication in table level in SQL Server with SQL Query 【发布时间】:2021-11-26 13:54:48 【问题描述】:

将一行从一个表插入到第二个数据库的另一个表中

 Insert into Task1.dbo.Patients (FirstName, Lastname, Address, ContactNo,Gender,DateOfBirth )
  Select FirstName, Lastname, Address, ContactNo,Gender,DateOfBirth from Tasks.dbo.Patients

我想在另一个数据库中存在的类似表中仅插入 插入的行 的副本。 Insert Into 是一种选择,但它会从源表中复制整个数据并附加到目标表中。 我想在插入另一个数据库时只镜像一行。

【问题讨论】:

【参考方案1】:

您可以为此使用简单的触发器

CREATE TRIGGER tr_Patients_Tasks1Copy ON dbo.Patients AFTER INSERT
AS

SET NOCOUNT ON;

IF EXISTS (SELECT 1 FROM inserted)
    INSERT Task1.dbo.Patients
      (FirstName, Lastname, Address, ContactNo, Gender, DateOfBirth)
    SELECT FirstName, Lastname, Address, ContactNo, Gender, DateOfBirth
    FROM inserted i;

GO

注意插入的表可能有多行甚至零行

【讨论】:

以上是关于SQL server-镜像复制的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL Query 在 SQL Server 中的表级别进行镜像或复制

SQL Server 中使用镜像、日志传送、复制和集群的场景都有哪些

SQL Server - 将表中的某些列镜像到同一服务器上的另一个数据库,无需复制

SQL Server 复制需要有实际的服务器名称问题

SQL SERVER2008 镜像全攻略

sql server 高可用性技术总结