当前位置: 首页 > news >正文

Linux 定时任务 + Oracle 19c 备份完整操作手册(Linux→windows server)

流程顺序建议

1. 上传脚本到 Linux
2. 设置权限并配置环境变量
3. 手动执行脚本,确认备份成功
4. 配置 SSH 免密登录(Linux → Windows)
5. 配置 cron 定时任务
6. 检查日志,确保每天自动执行

一、Linux 定时任务的种类及区别

工具一次性 / 周期性适用场景是否依赖 24h 运行典型用法
at一次性明天某个时间执行任务at 22:00
batch一次性系统空闲时执行任务batch
cron周期性7×24h 服务器定时任务crontab -e
anacron周期性笔记本/非 24h 设备/etc/anacrontab
systemd timer周期性/灵活新版 Linux,复杂任务systemctl enable xxx.timer

在 Linux 中,实际工作中常见的定时任务主要有以下几种:

cron(目前最常用)
适合:长期、周期性任务(每天/每周/每月/每分钟都执行的任务)。
特点:配置灵活,几乎所有生产环境都会用。

at
适合:只执行一次的任务(比如今晚2点跑一个脚本)。
特点:一次性任务,执行完就没了。

systemd timer
适合:新版本 Linux,用 systemd 替代 cron,更现代,配置也更复杂。
特点:支持日志与系统集成。

👉 生产系统 7×24 小时每天要执行的自动任务,推荐用 cron,安全可靠,业界通用。

二、操作流程

2.1 本地编写脚本

在你的电脑本地编写好备份脚本,例如文件名为3.144backup_oracle19c.sh

#!/bin/bash
# ==========================================
# Oracle 19c 热备全量+增量备份脚本(带详细备份逻辑注释)
# 每天夜间执行
# 自动清理7天前备份(RMAN恢复窗口管理)
# 本地 + 异地备份同时执行
# ==========================================# ---------- 1. Oracle 环境变量 ----------
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCLCDB
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
# ORACLE_HOME:Oracle软件安装目录
# ORACLE_SID:数据库实例名
# PATH:确保rman等命令可直接执行
# NLS_LANG:字符集配置,保证日志中字符正常显示# ---------- 2. 本地备份目录 ----------
BASE_BACKUP_DIR=/backup/oracle                # 本地基础备份目录
TODAY_DIR=$BASE_BACKUP_DIR/$(date +%Y%m%d)   # 当天备份目录
mkdir -p $TODAY_DIR                           # 创建目录,防止不存在报错# ---------- 3. 异地备份配置 ----------
REMOTE_IP=10.1.12.192
REMOTE_DIR=/F:/10.1.3.144backuptest
# 异地备份存放路径,按当天日期存放
REMOTE_TODAY_DIR=$REMOTE_DIR/$(date +%Y%m%d)# ---------- 4. 日志 ----------
LOG_FILE=$TODAY_DIR/backup.log
echo "备份开始时间: $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE# ---------- 5. RMAN 备份逻辑 ----------
rman target / <<EOF >> $LOG_FILE 2>&1
# 配置恢复窗口为7天
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;# 配置本地备份存放格式
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '$TODAY_DIR/%U.bkp';RUN {DECLAREweekday VARCHAR2(9);BEGINSELECT TO_CHAR(SYSDATE,'DY') INTO weekday FROM dual;-- 周日全量备份 + 归档日志IF weekday = 'SUN' THENBACKUP DATABASE PLUS ARCHIVELOG;ELSE-- 工作日增量备份 Level 1 + 归档日志BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;END IF;END;
END;/* 自动清理超过恢复窗口的备份(超过7天的备份会被删除) */
DELETE NOPROMPT OBSOLETE;
EOF# ---------- 6. 异地备份 ----------
# 使用 rsync 将当天本地备份同步到远程服务器
# 注意:需配置 oracle 用户免密 SSH 登录远程服务器
ssh oracle@$REMOTE_IP "mkdir -p $REMOTE_TODAY_DIR"
rsync -avz --progress $TODAY_DIR/ oracle@$REMOTE_IP:$REMOTE_TODAY_DIR/ >> $LOG_FILE 2>&1# ---------- 7. 日志记录 ----------
echo "备份结束时间: $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE
echo "异地备份完成:$REMOTE_IP:$REMOTE_TODAY_DIR" >> $LOG_FILE
echo "----------------------------------------" >> $LOG_FILE# ---------- 8. 备份逻辑说明 ----------
# 1. 全量备份(Full Backup):每周一次,备份整个数据库数据文件
# 2. 增量备份(Incremental Level 1):每天一次,只备份变化的数据块
# 3. 归档日志(Archived Redo Log):每次备份都包含,支持时间点恢复(PITR)
# 4. 恢复窗口(Recovery Window):保留最近7天备份链,自动清理过期备份
# 5. 热备(Hot Backup):数据库在线,无需停机
# 6. 异地备份:
#    - 同步本地备份到远程服务器 10.1.12.192
#    - 路径:/F:/10.1.3.144backuptest/YYYYMMDD
#    - 使用 rsync + SSH 免密登录

2.2 利用XFTP上传脚本至服务器指定路径

1.打开 Xftp,左边是本地电脑,右边是服务器目录。
2.在服务器端(右侧)进入目标目录,比如:
/opt/scripts/
3.如果没有该目录,可以提前建好:
mkdir -p /opt/scripts


4.把本地的.sh 文件拖拽到 /opt/scripts/ 目录。


5.上传完成后,服务器上检查,确认已经上传成功:

2.3 设置执行权限(添加+x执行权限)

chmod +x /opt/scripts/3.144backup_oracle19c.sh

chmod 755 /opt/scripts/3.144backup_oracle19c.sh

两个语句都是给文件所有者添加了执行权限

👉 这样脚本才可以被执行。

2.4设置环境变量(避免执行时找不到命令)

因为 Linux 默认不会去 /opt/scripts 这个目录找命令。Linux 找命令靠的就是 PATH 变量。

2.4.1编辑环境变量配置文件

1.打开配置文件

vim ~/.bash_profile


意思是:
打开你用户的环境变量配置文件(.bash_profile)
~ = 当前用户的家目录,比如 /home/yourname
以后你要给这个用户设置环境变量,就在这里写。

在最后加上这一行 👇
export PATH=$PATH:/opt/scripts

解释:
$PATH → 保留原来的命令搜索目录
:/opt/scripts → 把你的脚本目录也加进去

2.保存并让配置立即生效
source ~/.bash_profile

3.验证 PATH
echo $PATH


你应该能看到末尾多了:...:/opt/scripts

4.直接执行脚本
以后你就可以直接运行:
3.144backup_oracle19c.sh

[root@mydbhost scripts]# 3.144backup_oracle19c.sh
-bash: /opt/scripts/3.144backup_oracle19c.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录

📌 解决办法
方法:用 dos2unix 转换(推荐)
dos2unix /opt/scripts/3.144backup_oracle19c.sh
然后再执行:
/opt/scripts/3.144backup_oracle19c.sh

手动执行脚本,确认备份成功!

三、配置 SSH 免密登录(Linux → Windows)

3.1在 Linux 上生成 SSH 密钥(如果还没生成)

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

[root@mydbhost scripts]# ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? n
[root@mydbhost scripts]# 

之前已经生成过密钥,系统问你是否要覆盖原来的密钥。不覆盖,直接使用已有密钥

  • 直接按 n 回车,不覆盖旧密钥

  • 旧密钥依然有效,可以继续用来配置免密登录

  • 适合不想丢掉之前的 SSH 配置或已有远程授权的情况

3.2 查看密钥文件

ls -l ~/.ssh


正常会看到两个文件:
id_rsa → 私钥(千万不要泄露给别人)
id_rsa.pub → 公钥(可以上传到远程服务器,用于免密登录)

3.3查看公钥内容(用于上传到 Windows)

cat ~/.ssh/id_rsa.pub

  • 输出的一整行就是公钥内容,可以直接复制到 Windows 的 authorized_keys 文件里。

  • 注意不要复制空格或换行,保持完整一行。

3.4把公钥复制到 Windows Server(Windows 端powershell)

一、用管理员身份的 PowerShell 创建文件并追加写入公钥

#创建 authorized_keys 文件并写入公钥(替换下面内容为你的公钥)
$pubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDnFxYpWS9qgZexPJMf8KtuofChjFIAL8FZv55JAKRXbXX/+PftOrSDsmJcXKgD2VJMJY4iYQVkJd8YsSskJOwN8KUr4GeEaKAaVy0aUINwHlvfFhLoU5z0ExyMlZy2dbOcfFtpWKexZ11NF5V1agHGwuszSfdvJdTb6p4ZxDHS+5sP4nqOB4qRkbtCYIgxz/lYn4dyVPZOKxmth0Wt86WQ9Dc2l96jSxXwG68izQZhMtWxrz7hHhtA7AqlbKtdpKiSkqV+pxFoqBULMwJFXyTxygQbKsK+0Efa3pxEtyEF8WJfquQmqLRDFR0IpaMEphfPl45vWaWAHSPzWFL/EwlF root@mydbhost"

二、✅ 安全做法

1.追加而不是覆盖
Add-Content -Encoding ascii -Path "C:\Users\Administrator\.ssh\authorized_keys" -Value $pubkey

Add-Content 会把你的公钥 追加到已有文件末尾,不会删除现有公钥。

2.先备份原文件(手动备份也可以)
Copy-Item "C:\Users\Administrator\.ssh\authorized_keys" "C:\Users\All Users\ssh\authorized_keys.bak_$(Get-Date -Format yyyyMMddHHmmss)"
万一操作出错,可以随时恢复。

3.确认路径
先确认哪一个 authorized_keys 文件是现有备份系统实际使用的,再对该文件追加公钥。

4.直接强制覆盖写入文件(谨慎执行)
$pubkey | Out-File -Encoding ascii -FilePath "C:\Users\Administrator\.ssh\authorized_keys" -Force(谨慎执行)

  • -Force 会直接 覆盖原文件内容。

  • 如果原来这个文件里有其他数据库服务器备份用的公钥,它们就会被删除。

  • 结果可能导致这些备份任务失效,需要重新配置免密登录。

这一步非常重要,如果这台备份服务器有其他台数据库服务器的备份通过SSH写到这里,那就不能执行,千万不能执行,执行所有的公钥都被覆盖了,只能是追加。

5.若发生上述第4步错误,解决办法如下:

一、如果有问题的话是由于下面的1,2步导致原文件被覆盖。
#1.创建 authorized_keys 文件并写入公钥(替换下面内容为你的公钥)
$pubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDnFxYpWS9qgZexPJMf8KtuofChjFIAL8FZv55JAKRXbXX/+PftOrSDsmJcXKgD2VJMJY4iYQVkJd8YsSskJOwN8KUr4GeEaKAaVy0aUINwHlvfFhLoU5z0ExyMlZy2dbOcfFtpWKexZ11NF5V1agHGwuszSfdvJdTb6p4ZxDHS+5sP4nqOB4qRkbtCYIgxz/lYn4dyVPZOKxmth0Wt86WQ9Dc2l96jSxXwG68izQZhMtWxrz7hHhtA7AqlbKtdpKiSkqV+pxFoqBULMwJFXyTxygQbKsK+0Efa3pxEtyEF8WJfquQmqLRDFR0IpaMEphfPl45vWaWAHSPzWFL/EwlF root@mydbhost"

#2.写入文件
$pubkey | Out-File -Encoding ascii -FilePath "C:\Users\Administrator\.ssh\authorized_keys" -Force

3.第2步写入文件把原文件覆盖,导致其他数据库备份不能免密登录。

4.解决办法把对应备份源服务器的公钥依次添加到C:\Users\Administrator\.ssh\authorized_keys这个文件里。
4.1查询每台服务器公钥方法(数据库服务器端):
cat ~/.ssh/id_rsa.pub
4.2然后把每台公钥追加回 Windows Server

路径:C:\Users\Administrator\.ssh
文件名:authorized_keys

注意顺序没关系,但每行一个公钥

三、完成文件创建后,一定要设置权限:
icacls "C:\Users\Administrator\.ssh" /inheritance:r


icacls "C:\Users\Administrator\.ssh" /grant Administrator:F


四、回到 Linux 测试免密登录:

回到 Linux
ssh administrator@10.1.12.192
如果不再提示密码,说明免密登录成功

五、配置 cron 定时任务

六、检查日志,确保每天自动执行

http://www.dtcms.com/a/339421.html

相关文章:

  • 【git】改 GitLab 远程分支名;
  • Unity高级开发:反射原理深入解析与实践指南 C#
  • Java 线程状态与线程组
  • 水闸安全综合监测系统解决方案
  • Kafka 面试题及详细答案100道(1-10)-- 基础概念与架构
  • NestJS @Inject 装饰器入门教程
  • Hugging Face 核心组件介绍
  • 大功率变速箱总成双联试验台架系统参数
  • 机器人控制基础:运动控制中的串级pid原理以及实现方案(包含代码示例)
  • C/C++ 常见笔试题与陷阱详解
  • .net core web程序如何设置redis预热?
  • 【大白话解析】 OpenZeppelin 的 Address 库:Solidity安全地址交互工具箱​(附源代码)
  • Mybatis执行SQL流程(四)之MyBatis中JDK动态代理
  • Ansible 异步任务管理与内容重用详解
  • 10.Ansible角色管理
  • Ubuntu 和麒麟系统创建新用户 webapp、配置密码、赋予 sudo 权限并禁用 root 的 SSH 登录的详细
  • 网络间的通用语言TCP/IP-网络中的通用规则3
  • 缓存雪崩、缓存穿透、缓存击穿在实际中如何处理
  • Windows Git安装配置
  • PCL+Spigot服务器+python进行MC编程(使用Trae进行AI编程)---可以生成彩虹
  • 代码随想录Day56:图论(冗余连接、冗余连接II)
  • 【python】列表复制注意事项
  • 大模型+RPA:如何用AI实现企业流程自动化的“降本增效”?
  • 什么类型的项目会优先选择Headless CMS
  • 【habitat学习二】Habitat-Lab 快速入门指南(Quickstart)详解
  • 完美解决git报错拉取不到项目
  • 如何禁用 Windows 服务器的自动更新以避免意外重启
  • VMWare主机和客户机无法ping通
  • Android-ContentProvider的跨应用通信学习总结
  • Matplotlib数据可视化实战:Matplotlib安装与入门-跨平台环境配置与基本操作