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 中使用镜像、日志传送、复制和集群的场景都有哪些