一键备份 MS server 主机中所有数据库

USE [master]
GO
/****** Object: StoredProcedure [dbo].[BackupAllDatabases] Script Date: 2023/7/5 8:44:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[BackupAllDatabases]
@BackupDirectory NVARCHAR(255)
AS
BEGIN
-- 获取当前日期和时间
DECLARE @CurrentDateTime VARCHAR(14) = REPLACE(CONVERT(VARCHAR(14), GETDATE(), 120), ':', '');
DECLARE @DateTimeAMonthAgo VARCHAR(14) = REPLACE(CONVERT(VARCHAR(14), DATEADD(DAY, -7, GETDATE()), 120), ':', '');

-- 创建临时表来存储备份文件的详细信息
CREATE TABLE #BackupFiles
(
DatabaseName NVARCHAR(128),
BackupFilePath NVARCHAR(255)
);

-- 查询所有用户数据库,并进行备份
INSERT INTO #BackupFiles
SELECT name, @BackupDirectory + '\' + name + '_' + @CurrentDateTime + '.bak'
FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
AND state = 0; -- 只备份处于在线状态的数据库

-- 执行备份
DECLARE @DatabaseName NVARCHAR(128);
DECLARE @BackupFilePath NVARCHAR(255);
DECLARE @SQL NVARCHAR(MAX);

DECLARE db_cursor CURSOR FOR
SELECT DatabaseName, BackupFilePath
FROM #BackupFiles;

OPEN db_cursor;

FETCH NEXT FROM db_cursor INTO @DatabaseName, @BackupFilePath;

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'BACKUP DATABASE ' + QUOTENAME(@DatabaseName) + ' TO DISK = N''' + @BackupFilePath + '''';

EXEC sp_executesql @SQL;

FETCH NEXT FROM db_cursor INTO @DatabaseName, @BackupFilePath;
END;

CLOSE db_cursor;
DEALLOCATE db_cursor;

PRINT '一阶段完成'

-- 创建临时表来存储需要删除的备份文件路径
CREATE TABLE #ToDelFiles
(
BackupFilePath NVARCHAR(255)
);

-- 插入一个月前的备份文件路径
INSERT INTO #ToDelFiles
SELECT @BackupDirectory + '\' + name + '_' + @DateTimeAMonthAgo + '.bak'
FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
AND state = 0;

 

-- 执行 xp_cmdshell 删除过期备份文件
DECLARE @DeleteSQL NVARCHAR(MAX) = '';

DECLARE @TodelBackupFilePath NVARCHAR(255);

DECLARE del_cursor CURSOR FOR
SELECT BackupFilePath
FROM #ToDelFiles;

OPEN del_cursor;

FETCH NEXT FROM del_cursor INTO @TodelBackupFilePath;

WHILE @@FETCH_STATUS = 0
BEGIN
SET @DeleteSQL = 'EXEC xp_cmdshell ''DEL /Q "' + @TodelBackupFilePath + '"''';
print @DeleteSQL;
EXEC sp_executesql @DeleteSQL;

FETCH NEXT FROM del_cursor INTO @TodelBackupFilePath;
END;

CLOSE del_cursor;
DEALLOCATE del_cursor;

 

 

-- 删除临时表
DROP TABLE #BackupFiles;
DROP TABLE #ToDelFiles;
END;

 


EXEC dbo.BackupAllDatabases 'D:\DataBak';

在 SQL server 代理中增加相关作业,每天执行脚本即可。注意文件备份的目录一定存在。
以下备注:

【错误描述】:

SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问。因为此组件已作为此服务嚣安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure启用‘xp_cmdshell’。有关启用‘xp_cmdshell’的详细信息,请参阅sQL帮助文件。

【原因分析】:
xp_cmdshell可以让系统管理员以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出,是一个功能非常强大的扩展存贮过程。一般情况下,xp_cmdshell对管理员来说也是不必要的,xp_cmdshell的消除不会对Server造成任何影响。
【解决办法】:
通过查询分析器,选择Master数据库,然后执行以下SQL内容:
sp_configure 'show advanced options',1
reconfigure
go
sp_configure 'xp_cmdshell',1
reconfigure
go

  

以下脚本每三天进行一次全备份,每天进行一次增量备份,每半小时进行一次日志备份

#!/bin/bash

# RMAN备份脚本

# 设置环境变量
export ORACLE_HOME=/path/to/oracle_home
export ORACLE_SID=your_oracle_sid

# 定义备份目录
BACKUP_DIR=/path/to/backup_dir

# 定义日期格式
DATE=$(date +"%Y%m%d")

# 定义全备份函数
function full_backup {
  echo "Starting full backup..."
  rman target / <<EOF
  RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE disk;
    BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
    DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-10';
    RELEASE CHANNEL c1;
  }
  EXIT;
  EOF
  echo "Full backup completed!"
}

# 定义增量备份函数
function incremental_backup {
  echo "Starting incremental backup..."
  rman target / <<EOF
  RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE disk;
    BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
    DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';
    RELEASE CHANNEL c1;
  }
  EXIT;
  EOF
  echo "Incremental backup completed!"
}

# 定义日志备份函数
function log_backup {
  echo "Starting log backup..."
  rman target / <<EOF
  RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE disk;
    BACKUP ARCHIVELOG ALL NOT BACKED UP;
    DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1/48';
    RELEASE CHANNEL c1;
  }
  EXIT;
  EOF
  echo "Log backup completed!"
}

# 获取当前时间
CURRENT_HOUR=$(date +"%H")
CURRENT_MINUTE=$(date +"%M")

# 判断是否为全备份时间(每三天的0点执行)
if [ $((($(date +%-j)-1)/3%2)) -eq 0 ] && [ "$CURRENT_HOUR" == "00" ] && [ "$CURRENT_MINUTE" == "00" ]; then
  # 执行全备份
  full_backup
else
  # 判断是否为增量备份时间(每天的0点执行)
  if [ "$CURRENT_HOUR" == "00" ] && [ "$CURRENT_MINUTE" == "00" ]; then
    # 执行增量备份
    incremental_backup
  fi
  
  # 执行日志备份
  log_backup
fi

在windows的oracle中,您可以尝试:

REM RMAN备份脚本

REM 设置环境变量
set ORACLE_HOME=C:\path\to\oracle_home
set ORACLE_SID=your_oracle_sid

REM 定义备份目录
set BACKUP_DIR=C:\path\to\backup_dir

REM 获取当前日期
set DATE=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%

REM 定义全备份函数
:full_backup
echo Starting full backup...
%ORACLE_HOME%\bin\rman target / <<EOF
RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE disk;
  BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
  DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-10';
  RELEASE CHANNEL c1;
}
EXIT;
EOF
echo Full backup completed!
goto end

REM 定义增量备份函数
:incremental_backup
echo Starting incremental backup...
%ORACLE_HOME%\bin\rman target / <<EOF
RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE disk;
  BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
  DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1';
  RELEASE CHANNEL c1;
}
EXIT;
EOF
echo Incremental backup completed!
goto end

REM 定义日志备份函数
:log_backup
echo Starting log backup...
%ORACLE_HOME%\bin\rman target / <<EOF
RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE disk;
  BACKUP ARCHIVELOG ALL NOT BACKED UP;
  DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-1/48';
  RELEASE CHANNEL c1;
}
EXIT;
EOF
echo Log backup completed!
goto end

REM 获取当前时间
for /f "tokens=1-3 delims=: " %%A in ("%TIME%") do (
  set CURRENT_HOUR=%%A
  set CURRENT_MINUTE=%%B
)

REM 判断是否为全备份时间(每三天的0点执行)
if %DATE:~-2% equ 01 (
  goto full_backup
)

REM 判断是否为增量备份时间(每天的0点执行)
if "%CURRENT_HOUR%" equ "00" if "%CURRENT_MINUTE%" equ "00" (
  goto incremental_backup
)

REM 执行日志备份
:log_backup
goto log_backup

:end

 

  1. 打开任务计划程序。您可以在 Windows 搜索框中输入 "任务计划程序" 并打开它。

  2. 在任务计划程序窗口中,点击 "创建基本任务"(位于右侧面板)。

  3. 在创建基本任务向导中,输入任务的名称和描述,然后点击 "下一步"。

  4. 在触发器选项中,选择 "每天" 并点击 "下一步"。

  5. 在特定时间选项中,输入第一个触发时间,然后勾选 "重复任务每" 并设置为 "30 分钟"。点击 "下一步"。

  6. 在操作选项中,选择 "启动程序" 并点击 "下一步"。

  7. 在程序/脚本选项中,输入要执行的备份脚本的完整路径。例如,C:\path\to\your\backup_script.sh。点击 "下一步"。

  8. 在确认选项中,检查您的任务设置,确认一切正确后点击 "完成"。

 

 

 

 

 
posted on 2023-07-02 21:19  程序员肯定不是好牙医  阅读(128)  评论(0编辑  收藏  举报