SQL server实现异地增量备份和全量备份

要将SQL Server数据库通过作业备份到同一局域网的另一台服务器,需要完成共享目录配置、权限设置和作业创建三个核心步骤。以下是详细操作指南:

一、目标服务器(备份存储服务器)配置

在局域网内的目标服务器(如172.70.74.211)上创建共享目录,用于存放备份文件。

1. 创建本地文件夹
  • 在目标服务器上新建文件夹(例如 D:\SQLBackups),用于实际存储备份文件。
2. 配置共享权限
  • 右键文件夹 → 属性共享高级共享→ 勾选"共享此文件夹"。
  • 共享名设为 SQLBackups(后续访问路径为 \\172.70.74.211\SQLBackups)。
  • 点击权限 → 添加 Everyone 或指定用户(如 Administrator),并授予"读取"和"写入"权限。
  • 切换到安全标签页 → 确保相同用户有"完全控制"权限(避免NTFS权限与共享权限冲突)。
3. 测试共享访问
  • 在SQL Server所在服务器的"运行"中输入 \\172.70.74.211\SQLBackups,验证能否正常访问(无需输入密码或使用目标服务器账号登录)。

二、SQL Server服务器配置

确保SQL Server服务账户有权限访问目标服务器的共享目录。

1. 确认SQL Server服务账户
  • 打开"服务" → 找到 SQL Server (MSSQLSERVER) → 查看"登录身份"(通常是 NT Service\MSSQLSERVER 或域账户)。
2. 授予服务账户访问权限(可选)
  • 如果服务账户是本地账户(如 NT Service\MSSQLSERVER),需在目标服务器的共享目录权限中添加SQL Server服务器的计算机账户(格式:域\SQL服务器名$,例如 WORKGROUP\SQLSERVER$),并授予读写权限。
  • 如果是域账户,直接在目标服务器共享权限中添加该域账户即可。

三、创建备份作业

通过SQL Server代理创建定时备份作业,自动将数据库备份到目标服务器的共享目录。

1. 启用SQL Server代理
  • 打开SQL Server Management Studio (SSMS) → 连接到数据库引擎 → 确保"SQL Server代理"已启动(右键→"启动")。
2. 创建新作业
  • 展开"SQL Server代理" → 右键"作业" →新建作业
    • 名称数据库异地备份
    • 所有者 :保持默认(sa)。
    • 类别 :选择"数据库维护"。
3. 添加作业步骤
  • 切换到步骤新建

    • 步骤名称执行备份
    • 类型Transact-SQL (T-SQL)
    • 数据库 :选择要备份的数据库(如 AIS20250224105414)。
    • 命令 :输入以下T-SQL脚本(替换为实际路径和数据库名):
  • 步骤1

    sql 复制代码
    -- 步骤1:建立Administrator网络连接
    DECLARE 
        @SharePath NVARCHAR(100),
        @User NVARCHAR(100),
        @Pwd NVARCHAR(50),
        @Cmd NVARCHAR(4000)
    
    -- 定义变量值(单独赋值,避免复杂拼接)
    SET @SharePath = '\\172.70.74.211\SQLBackups'
    SET @User = '172.70.74.211\Administrator'
    SET @Pwd = '123456' -- 替换为实际密码
    
    -- 创建临时表存储命令结果(用#临时表替代@表变量,避免作用域问题)
    CREATE TABLE #Result (OutputText NVARCHAR(4000))
    
    -- 1. 断开旧连接
    SET @Cmd = 'net use "' + @SharePath + '" /delete /y'
    DELETE FROM #Result
    INSERT INTO #Result EXEC master.dbo.xp_cmdshell @Cmd
    
    -- 2. 建立新连接(用双引号包裹路径和参数,兼容特殊字符)
    SET @Cmd = 'net use "' + @SharePath + '" /user:' + @User + ' "' + @Pwd + '"'
    DELETE FROM #Result
    INSERT INTO #Result EXEC master.dbo.xp_cmdshell @Cmd
    
    -- 3. 输出连接命令执行结果(用于排查错误)
    PRINT '=== 网络连接命令执行结果 ==='
    SELECT OutputText AS 执行结果 FROM #Result WHERE OutputText IS NOT NULL
    
    -- 4. 验证共享目录是否可访问
    SET @Cmd = 'dir "' + @SharePath + '"'
    DELETE FROM #Result
    INSERT INTO #Result EXEC master.dbo.xp_cmdshell @Cmd
    
    -- 5. 判断连接状态
    IF EXISTS (SELECT 1 FROM #Result WHERE OutputText LIKE '%<DIR>%')
    BEGIN
        PRINT '=== 连接成功 ==='
        PRINT '已成功访问共享目录:' + @SharePath
    END
    ELSE
    BEGIN
        PRINT '=== 连接失败 ==='
        RAISERROR('无法访问共享目录,请检查共享名、账号密码或权限', 16, 1)
        RETURN
    END
    
    -- 删除临时表
    DROP TABLE #Result
  • 步骤2

    sql 复制代码
    -- 步骤2:执行备份
    DECLARE @BackupType VARCHAR(10),
            @BackupPath NVARCHAR(255),
            @BackupName NVARCHAR(255),
            @WeekDay INT;
    
    -- 获取当前星期几(1=周一,7=周日)
    SET @WeekDay = DATEPART(WEEKDAY, GETDATE());
    
    -- 判定备份类型
    IF @WeekDay = 7 OR NOT EXISTS (
        -- 检查是否存在全量备份(首次执行时无全量,强制全量)
        SELECT 1 FROM msdb.dbo.backupset 
        WHERE database_name = 'AIS20250224105414' 
          AND type = 'D' -- 'D'表示全量备份
    )
    BEGIN
        SET @BackupType = 'Full';
        SET @BackupName = N'ERP全量备份';
    END
    ELSE
    BEGIN
        SET @BackupType = 'Diff';
        SET @BackupName = N'ERP增量备份';
    END
    
    -- 构建备份路径
    SET @BackupPath = N'\\172.70.74.211\SQLBackups\AIS20250224105414_' 
        + @BackupType + '_'
        + CONVERT(VARCHAR(8), GETDATE(), 112) 
        + '.bak';
    
    -- 执行对应类型的备份
    IF @BackupType = 'Full'
    BEGIN
        BACKUP DATABASE [AIS20250224105414]
        TO DISK = @BackupPath
        WITH INIT, -- 全量备份覆盖同名文件
             NAME = @BackupName,
             SKIP, NOREWIND, NOUNLOAD, 
             STATS = 10;
    END
    ELSE
    BEGIN
        BACKUP DATABASE [AIS20250224105414]
        TO DISK = @BackupPath
        WITH DIFFERENTIAL, -- 增量备份关键参数
             NOINIT, -- 增量备份不覆盖,追加到备份集
             NAME = @BackupName,
             SKIP, NOREWIND, NOUNLOAD, 
             STATS = 10;
    END
    
    PRINT '备份完成!类型:' + @BackupType + ',路径:' + @BackupPath;
  • 步骤3

    sql 复制代码
    -- 步骤3:断开网络连接
    DECLARE 
        @SharePath NVARCHAR(100),
        @Cmd NVARCHAR(4000)
    
    -- 设置共享路径
    SET @SharePath = '\\172.70.74.211\SQLBackups'
    
    -- 构建完整命令(用双引号包裹路径,避免特殊字符问题)
    SET @Cmd = 'net use "' + @SharePath + '" /delete /y'
    
    -- 执行断开连接命令
    EXEC master.dbo.xp_cmdshell @Cmd
    
    -- 输出结果
    PRINT '网络连接已断开:' + @SharePath
4. 配置作业调度
  • 切换到调度新建
    • 名称每日备份
    • 调度类型重复执行
    • 频率:例如"每天"、"凌晨2点"。
    • 点击"确定"保存调度。
5. 测试作业
  • 右键新建的作业 →执行步骤 → 选择"执行备份" → 检查目标服务器共享目录是否生成备份文件。

四、常见问题解决

  1. "无法访问网络路径"错误

    • 检查共享目录路径是否正确(如 \\172.70.74.211\SQLBackups)。
    • 验证SQL Server服务账户是否有访问权限(参考步骤二)。
    • 关闭目标服务器防火墙或添加文件共享例外(端口139、445)。
  2. 备份文件为空或大小异常

    • 检查T-SQL脚本中的 BACKUP DATABASE 语句是否正确。
    • 确认数据库处于正常状态(非离线或恢复中)。
  3. 作业执行失败无日志

    • 在作业属性的通知中,勾选"当作业失败时写入Windows事件日志",通过"事件查看器"排查详细错误。

通过以上步骤,即可实现SQL Server数据库自动备份到局域网内的另一台服务器,确保数据安全和异地存储。

相关推荐
小蒜学长8 小时前
基于Hadoop的网约车公司数据分析系统设计(代码+数据库+LW)
java·大数据·数据库·hadoop·spring boot·后端
Hello.Reader8 小时前
一文通关 Proto3语法 + 风格的实战指南
java·开发语言·数据库
ssjnbnbnb8 小时前
学习资料1(粗略版)
数据库·学习·数据分析
小蒜学长8 小时前
大学园区二手书交易平台(代码+数据库+LW)
java·数据库·spring boot·后端
深栈8 小时前
SQL:连续登录类型问题的解题思路
数据库·sql·数据分析·连续登录
代码的余温8 小时前
SQL Server服务管理
数据库·sqlserver
LQ深蹲不写BUG8 小时前
Redis的五种常用数据类型。
数据库·redis·缓存
年年测试9 小时前
Browser Use 浏览器自动化 Agent:让浏览器自动为你工作
前端·数据库·自动化
XYiFfang9 小时前
【mysql】SQL自连接实战:查询温度升高的日期
数据库·sql·mysql