MS SQL 事物日志传送能否跨数据库版本吗

MS SQL 事物日志传送能否跨数据库版本吗,第1张

SQL SERVER的事物日志传送(log shipping)功能,相信很多人都使用过或正在应用,这是MS SQL提供的一个非常强大的功能,一般需要一个主数据库服务器(primary/production database server)和辅助数据库服务器(standby server)来完成这个配置,默认情况下,主数据库和辅助数据库的版本应该是一致的,那么如果这两个数据库版本不一致,会不会有什么问题?还能做log shipping配置吗?

那么数据库版本不一致分两种情况:

1: 类似于MS SQL 2005 64 bit SP4 与MS SQL 2005 SP3 32 bit这样的版本差别

2: 完全不同的版本,例如MS SQL SERVER 2005 和 MS SQL SERVER 2008.

可能有人就要吐槽了,为啥要搞成不同的版本呢,这不是自己没事找事做吗?出现这种情况,真是一言难尽,历史的问题.....等等,你叫我怎么吐槽呢?好了,咱们就不纠结这些鸡毛蒜皮的事情了,现在回到上面的问题上来。

至于第一种情况,完全可以做log shipping,不存在什么问题,我做了两个这样的案例,都配置成功,而且工作的好好的。

案例1的环境:

数据库服务器

版本信息

主数据库服务器

Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

辅助数据库服务器

Microsoft SQL Server 2005 - 9.00.5000.00 (X64) Dec 10 2010 10:38:40 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

案例2的环境:

数据库服务器

版本信息

主数据库服务器

Microsoft SQL Server 2005 - 9.00.4000.00 (Intel X86) Dec 10 2010 10:56:29 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

辅助数据库服务器

Microsoft SQL Server 2005 - 9.00.5000.00 (X64) Dec 10 2010 10:38:40 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

第二种版本不同的情况,也要细分多种不同情况:

1: 主数据库服务器为SQL SERVER 2008, 辅助数据库服务器为SQL SERVER 2005, 对于这种情况,这是完全行不通的,因为你在SQL SERVER 2008上的备份,不能在低版本SQL SERVER 2005上还原(当然更低的版本也是如此),以此类推,Primary Server is SQL 2012 Std and Secondary Server is SQL 2008 R2 Std 这种情况也是行不通的。

2:主数据库服务器为SQL SERVER 2005, 辅助数据库服务器为SQL SERVER 2008R2,对于这种情况,log shipping部署时,你选择Standby Mode时,就会报错:

相关出错信息:System.Data.SqlClient.SqlError: This backup cannot be restored using WITH STANDBY because a database upgrade is needed. Reissue the RESTORE without WITH STANDBY. (Microsoft.SqlServer.Smo)

所以你只能选择No Recovery mode选项,至于这个就有点鸡肋了。关于上面出错的原因,下面这段解释非常清晰,明了(出处请见下面参考资料):

Each version of SQL Server has a database version numberfor SQL 2000 it is 8, SQL 2005: 9 and SQL 2008: 10. When a database backup that came from a lower SQL Server version is restored, SQL Server will run an upgrade process to bring that older database version up to the database version supported by the new instance. This process is run automatically as part of SQL Server’s recovery process. The recovery process itself is certain operations that need to happen to ensure the database is in a consistent state for user access (roll-forwards and roll-backs etc).

Placing a database in “Standby/Read Only” mode instructs SQL Server to recover the database after each restore, but also create a special standby file that contains information which will allow this recovery to be undone when it is time to do additional transaction logs restores.

However unfortunately, once a database has been upgraded it cannot be undone. This is why if you try and use the “Standby/Read Only” option when restoring a database of an older version SQL Server fails with

Msg 3180, Level 16, State 1, Line 1

This backup cannot be restored using WITH STANDBY because a database upgrade is needed. Reissue the RESTORE without WITH STANDBY.

Msg 3013, Level 16, State 1, Line 1

RESTORE DATABASE is terminating abnormally.

This error message essentially says you cannot bring an older database version online in “Standby/Read Only” mode.

But you can restore transaction logs and log shipping from an older database version to a newer database version when you keep the database offline. This is because the recovery (and upgrade process) for the database is deferred until the point you do actually bring the database online. This means you can log ship from an older version of SQL Server to a newer version until the point you bring that database online for user access.

翻译如下(水平有限,仅供参考):

每一个版本的SQL Server数据库都有相应版本号例如SQL 2000是8,SQL 2005是9,SQL2008:10。当数据库恢复一个从较低的SQL Server版本的备份时,SQL Server将执行一个升级过程,把那个旧的数据库版本升级到新实例支持的版本。这个过程是SQL Server的恢复过程中自动运行的一部分。恢复过程本身就需要某些 *** 作发生,以确保数据库处于一致的状态向前回滚,向后回滚等)。

把数据库置于“待机/只读”模式不仅会指示SQL Server的每次还原后恢复 *** 作,还会创建一个特殊的备用文件,当它做其他事务日志恢复时,包含的恢复撤销时的信息。

然而不幸的是,一旦数据库已经升级,它不能被撤消。这就是为什么如果你尝试使用“待机/只读”选项时,旧版本的SQL Server数据库恢复失败的原因

Msg 3180, Level 16, State 1, Line 1

This backup cannot be restored using WITH STANDBY because a database upgrade is needed. Reissue the RESTORE without WITH STANDBY.

Msg 3013, Level 16, State 1, Line 1

RESTORE DATABASE is terminating abnormally.

这个错误消息本质上是说,你不能把一个旧的数据库版本设置为联机在“待机/只读”模式下。

但是你可以从一个旧的数据库版本还原事务日志和日志传送到一个新的数据库版本,当你保持数据库脱机。这是因为,为数据库的恢复(升级过程中)被推迟,直到点你确实使数据库联机。这意味着您可以登录到一个新的版本,直到从旧版本的SQL Server用户访问您带来的联机数据库。

数据库镜像:数据库或其中的关键数据在另一个物理磁盘上的拷贝,当主数据库更新时,从数据库也得到更新,从而使两个数据库保持一致。

日志传送:数据库镜像的一种方式。即从数据库通过主数据库传送的重做日志,执行相同的 *** 作,而使主从数据库达到一致。

说明:

数据库镜像是为保证数据库高可用性,高性能的一种技术,当主数据库(业务数据库)发生故障时,从数据库能够实时接管业务,从而使业务不致于中断。

数据库镜像的方式有物理方式和逻辑方式,物理方式即将主数据库的物理文件传输到从数据库,两者达成一致,而逻辑方式即将主数据库的重做日志传输到从数据库,由从数据库按照重做日志做恢复,两者达成一致。

由于频繁地复制自然会降低系统运行效率,因此在实际应用中用户往往只选择对关键数据镜像,如对日志文件镜像,而不是对整个数据库进行镜像。

您好,很高兴为您解答。

-----SQLSERVER2008  事务日志传送 备份数据库  

1、在主机上执行完整备份数据库  

2、在备份机上 创建三个文件夹 。  

·  第一个文件夹A(原主机上:比如)用来存放:备份数据库。  

  第二个文件夹B(目标机) 需要共享 存放:为备份数据库传送过来的事务日志。  

  第三个文件组C(目标机) 需要共享 存放:为还原数据库复制的事务日志。--  

3、将主机上备份好的数据库 拷贝复制到 备份主机的对应文件夹中。并还原备份机上的数据库。  

    还原选项为  “覆盖现有数据库(WITH REPLACE)”。  

    .恢复状态 选第二项 即 “不对数据库执行任何 *** 作。不回滚未提交的事务。可以还原其他事务日志” "RESTORE WITH NORECOVERY"   

     也就是恢复模式。  

4、在主数据库服务器上>>>>>>选择数据库,右键>>>>任务>>>>>传送事务日志>>>>>  

5、勾选 将此数据库启用为日志传送配置中的主数据库  

      >>>点击 备份设置>>>>>>填写事务日志备份参数(备份文件夹的网络路径:此处填写备份服务器上建立的用于存放事务日志备份的文件夹的网络路径。  

      此例中为"B"(也可写<a href="file://\\127.0.0.1\B">\\127.0.0.1\B</a>文件夹名)。这里说明一下,此例中将备份文件夹放在了备份服务器上,但这不是必需的,也可以将备份文件夹放在数据库服务器上,或者放在第三台服务器上,只要保证此文件夹能从网络上被数据库服务器和备份服务器访问即可)。备份文件夹位于主机 这项 输入 本机的绝对路径这里输入 A 文件夹的路径。  

6、点击 计划 开始设置备份作业计划。  

7、回到 数据库>>>>属性>>>>传送事务日志的界面。  在 “辅助数据库” 下 点 “添加” >>>>>设置 辅助数据库 即 备份数据库服务器  

8、连接到 备份数据库服务器 (服务器名称 最后写 计算机的名称 不要写 IP地址),并选择 对应的数据库。  

9、由于开始 完成了对 备份数据库服务器上的数据库还原,所以在 “初始化辅助数据库”TBA选项卡 中选择“否”。  

10、点击 “复制文件‘TAB 选项卡>>>>>>在d出的窗体设置中 输入 复制文件的目标文件夹 C(目标机器上的C文件夹路径).填写下面的 复制作业的作业名称 >>>>>>>>>点编辑作业>>>>>>设置作业计划  

11、点击 ”还原事务日志“TAB选项卡>>>>选中下面的 ”备用模式“。同样填写 作业名称 并编辑作业计划  

12、 最后点击确定(OK) 则 备份数据库就会变为 ”备用/只读“的状态。  

  

---备注: 也可以 用第三方工具在 目标机器上通过FTP 的方式将A 路径下的文件拷贝到 B 路径下。(下面的案例就是通过ServU 第三方工具定时将A 中的日子传递到B 下,然后通过日志传送产生的作业,再将B中的日志COPY到C中,然后利用C中的日志 来实现数据库恢复的。)

<p>  

-- 在主服务器上执行下列语句,以便为数据库 [WIN2008R2-SERVER0].[db_name_read]   

-- 配置日志传送。  

-- 需要在主服务器上 [msdb] 数据库的上下文中运行该脚本。    

-------------------------------------------------------------------------------------   

-- 添加日志传送配置 </p><p>-- ****** 开始: 要在主服务器 [WIN2008R2-SERVER0] 上运行的脚本 ******</p><p>  

DECLARE @LS_BackupJobId AS uniqueidentifier   

DECLARE @LS_PrimaryId AS uniqueidentifier   

DECLARE @SP_Add_RetCode As int </p><p>  

EXEC @SP_Add_RetCode = master.dbo.sp_add_log_shipping_primary_database   

  @database = N'db_name_read'   

  ,@backup_directory = N'F:\db_name_log' ---A文件夹  

  ,@backup_share = N'\\127.0.0.1\db_name_share_log' ---B文件夹  

  ,@backup_job_name = N'LSBackup_db_name_read'   

  ,@backup_retention_period = 4320  

  ,@backup_compression = 1  

  ,@backup_threshold = 180   

  ,@threshold_alert_enabled = 1  

  ,@history_retention_period = 5760   

  ,@backup_job_id = @LS_BackupJobId OUTPUT   

  ,@primary_id = @LS_PrimaryId OUTPUT   

  ,@overwrite = 1 </p><p>  

IF (@@ERROR = 0 AND @SP_Add_RetCode = 0)   

BEGIN </p><p>DECLARE @LS_BackUpScheduleUID As uniqueidentifier   

DECLARE @LS_BackUpScheduleID AS int </p><p>  

EXEC msdb.dbo.sp_add_schedule   

  @schedule_name =N'LSBackupSchedule_WIN2008R2-SERVER01'   

  ,@enabled = 1   

  ,@freq_type = 4   

  ,@freq_interval = 1   

  ,@freq_subday_type = 1   

  ,@freq_subday_interval = 15   

  ,@freq_recurrence_factor = 0   

  ,@active_start_date = 20121026   

  ,@active_end_date = 99991231   

  ,@active_start_time = 30000   

  ,@active_end_time = 235959   

  ,@schedule_uid = @LS_BackUpScheduleUID OUTPUT   

  ,@schedule_id = @LS_BackUpScheduleID OUTPUT </p><p>EXEC msdb.dbo.sp_attach_schedule   

  @job_id = @LS_BackupJobId   

  ,@schedule_id = @LS_BackUpScheduleID  </p><p>EXEC msdb.dbo.sp_update_job   

  @job_id = @LS_BackupJobId   

  ,@enabled = 1 </p><p>  

END </p><p>  

EXEC master.dbo.sp_add_log_shipping_alert_job </p><p>EXEC master.dbo.sp_add_log_shipping_primary_secondary   

  @primary_database = N'db_name_read'   

  ,@secondary_server = N'192.168.1.19,18991'   

  ,@secondary_database = N'db_name_read'   

  ,@overwrite = 1 </p><p>-- ****** 结束: 要在主服务器 [WIN2008R2-SERVER0] 上运行的脚本  ******</p><p>  

-- 在辅助服务器上执行下列语句,以便为数据库 [192.168.1.19,18991].[db_name_read]   

-- 配置日志传送。  

-- 需要在辅助服务器上 [msdb] 数据库的上下文中运行该脚本。   

-------------------------------------------------------------------------------------   

-- 添加日志传送配置 </p><p>-- ****** 开始: 要在辅助服务器 [192.168.1.19,18991] 上运行的脚本 ******</p><p>  

DECLARE @LS_Secondary__CopyJobId AS uniqueidentifier   

DECLARE @LS_Secondary__RestoreJobId AS uniqueidentifier   

DECLARE @LS_Secondary__SecondaryId AS uniqueidentifier   

DECLARE @LS_Add_RetCode As int </p><p>  

EXEC @LS_Add_RetCode = master.dbo.sp_add_log_shipping_secondary_primary   

  @primary_server = N'WIN2008R2-SERVER0'   

  ,@primary_database = N'db_name_read'   

  ,@backup_source_directory = N'\\127.0.0.1\db_name_share_log' ---B文件夹  

  ,@backup_destination_directory = N'D:\db_name_log' ---C文件夹  

  ,@copy_job_name = N'LSCopy_WIN2008R2-SERVER0_db_name_read'   

  ,@restore_job_name = N'LSRestore_WIN2008R2-SERVER0_db_name_read'   

  ,@file_retention_period = 4320   

  ,@overwrite = 1   

  ,@copy_job_id = @LS_Secondary__CopyJobId OUTPUT   

  ,@restore_job_id = @LS_Secondary__RestoreJobId OUTPUT   

  ,@secondary_id = @LS_Secondary__SecondaryId OUTPUT </p><p>IF (@@ERROR = 0 AND @LS_Add_RetCode = 0)   

BEGIN </p><p>DECLARE @LS_SecondaryCopyJobScheduleUID As uniqueidentifier   

DECLARE @LS_SecondaryCopyJobScheduleID AS int </p><p>  

EXEC msdb.dbo.sp_add_schedule   

  @schedule_name =N'DefaultCopyJobSchedule'   

  ,@enabled = 1   

  ,@freq_type = 4   

  ,@freq_interval = 1   

  ,@freq_subday_type = 1   

  ,@freq_subday_interval = 15   

  ,@freq_recurrence_factor = 0   

  ,@active_start_date = 20121026   

  ,@active_end_date = 99991231   

  ,@active_start_time = 32500   

  ,@active_end_time = 235959   

  ,@schedule_uid = @LS_SecondaryCopyJobScheduleUID OUTPUT   

  ,@schedule_id = @LS_SecondaryCopyJobScheduleID OUTPUT </p><p>EXEC msdb.dbo.sp_attach_schedule   

  @job_id = @LS_Secondary__CopyJobId   

  ,@schedule_id = @LS_SecondaryCopyJobScheduleID  </p><p>DECLARE @LS_SecondaryRestoreJobScheduleUID As uniqueidentifier   

DECLARE @LS_SecondaryRestoreJobScheduleID AS int </p><p>  

EXEC msdb.dbo.sp_add_schedule   

  @schedule_name =N'DefaultRestoreJobSchedule'   

  ,@enabled = 1   

  ,@freq_type = 4   

  ,@freq_interval = 1   

  ,@freq_subday_type = 1   

  ,@freq_subday_interval = 15   

  ,@freq_recurrence_factor = 0   

  ,@active_start_date = 20121026   

  ,@active_end_date = 99991231   

  ,@active_start_time = 40000   

  ,@active_end_time = 235959   

  ,@schedule_uid = @LS_SecondaryRestoreJobScheduleUID OUTPUT   

  ,@schedule_id = @LS_SecondaryRestoreJobScheduleID OUTPUT </p><p>EXEC msdb.dbo.sp_attach_schedule   

  @job_id = @LS_Secondary__RestoreJobId   

  ,@schedule_id = @LS_SecondaryRestoreJobScheduleID  </p><p>  

END </p><p>  

DECLARE @LS_Add_RetCode2 As int </p><p>  

IF (@@ERROR = 0 AND @LS_Add_RetCode = 0)   

BEGIN </p><p>EXEC @LS_Add_RetCode2 = master.dbo.sp_add_log_shipping_secondary_database   

  @secondary_database = N'db_name_read'   

  ,@primary_server = N'WIN2008R2-SERVER0'   

  ,@primary_database = N'db_name_read'   

  ,@restore_delay = 0   

  ,@restore_mode = 1   

  ,@disconnect_users = 1   

  ,@restore_threshold = 45     

  ,@threshold_alert_enabled = 1   

  ,@history_retention_period = 5760   

  ,@overwrite = 1 </p><p>END </p><p>  

IF (@@error = 0 AND @LS_Add_RetCode = 0)   

BEGIN </p><p>EXEC msdb.dbo.sp_update_job   

  @job_id = @LS_Secondary__CopyJobId   

  ,@enabled = 1 </p><p>EXEC msdb.dbo.sp_update_job   

  @job_id = @LS_Secondary__RestoreJobId   

  ,@enabled = 1 </p><p>END </p><p>  

-- ****** 结束: 要在辅助服务器 [192.168.1.19,18991] 上运行的脚本 ******  

</p>

如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!

~ O(∩_∩)O~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9921617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存