Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份

yizhihongxing

以下是详细讲解“Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份”的完整攻略:

步骤一:安装必要软件

为了自动备份Oracle数据库,我们需要安装以下两个软件:
- Oracle Instant Client: 可以在不安装完整版Oracle数据库的情况下,连接Oracle数据库服务;
- Oracle SQLcl: 是一款命令行工具,可以在Linux终端上与Oracle数据库进行交互。

我们可以使用以下命令进行安装:

# 安装 Oracle Instant Client
sudo yum install oracle-instantclient18.5-basic.x86_64 oracle-instantclient18.5-sqlplus.x86_64

# 安装 Oracle SQLcl
sudo yum -y install oracle-sqlcl

步骤二:编写备份脚本

备份脚本的主要作用是连接Oracle数据库,执行备份命令,并删除过期备份。下面是一个示例脚本:

#!/bin/bash

# 设置环境变量
export ORACLE_HOME=/usr/lib/oracle/18.5/client64
export PATH=$PATH:$ORACLE_HOME/bin

# 备份目录
BACKUP_DIR=/tmp/backup

# MySQL登陆信息
USER=myuser
PASSWORD=mypassword
HOST=192.168.1.10
PORT=1521
SID=orcl

# 备份文件命名规则
DATE=`date +%Y%m%d%H%M%S`
BACKUP_FILE=${BACKUP_DIR}/${SID}_${DATE}.dmp

# 备份数据库
sqlcl -S ${USER}/${PASSWORD}@${HOST}:${PORT}/${SID} @backup.sql ${BACKUP_FILE}

# 删除过期备份
find ${BACKUP_DIR} -type f -name "${SID}*.dmp" -mtime +7 -delete

其中,backup.sql 文件中存放了备份的具体命令,示例内容如下:

-- backup.sql
DECLARE
  jobno NUMBER;
BEGIN
  dbms_scheduler.create_job(job_name => 'backup_job',
                            job_type => 'EXPORT',
                            job_action => 'expdp scott/tiger@orcl directory=DATA_PUMP_DIR dumpfile=${BACKUP_FILE} logfile=${BACKUP_DIR}/backup.log',
                            repeat_interval => 'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;',
                            enabled => FALSE);
  dbms_scheduler.set_attribute(name => 'backup_job',
                               attribute => 'logging_level',
                               value => DBMS_SCHEDULER.LOGGING_OFF);
  dbms_scheduler.enable(name => 'backup_job');
  SELECT job_name, state FROM user_scheduler_jobs WHERE job_name='backup_job';
END;

步骤三:设置计划任务

为了自动执行备份脚本,我们需要设置计划任务。可以使用以下命令进行设置:

crontab -e

在打开的文件中添加以下内容(每天凌晨 2 点自动执行):

0 2 * * * /path/to/backup.sh

示例说明

示例一

假设我们需要备份名为 orcl 的Oracle数据库,备份文件保存在 /data/backup 目录中。我们可以按照以下步骤操作:

  1. 在Oracle数据库中创建一个用户 myuser,并授予其备份权限:
CREATE USER myuser IDENTIFIED BY mypassword;

GRANT CREATE SESSION TO myuser;
GRANT DBA TO myuser;
  1. 创建备份脚本 backup.sh
#!/bin/bash

# 设置环境变量
export ORACLE_HOME=/usr/lib/oracle/18.5/client64
export PATH=$PATH:$ORACLE_HOME/bin

# 备份目录
BACKUP_DIR=/data/backup

# MySQL登陆信息
USER=myuser
PASSWORD=mypassword
HOST=192.168.1.10
PORT=1521
SID=orcl

# 备份文件命名规则
DATE=`date +%Y%m%d%H%M%S`
BACKUP_FILE=${BACKUP_DIR}/${SID}_${DATE}.dmp

# 备份数据库
sqlcl -S ${USER}/${PASSWORD}@${HOST}:${PORT}/${SID} @backup.sql ${BACKUP_FILE}

# 删除过期备份
find ${BACKUP_DIR} -type f -name "${SID}*.dmp" -mtime +7 -delete

其中,BACKUP_DIR 变量指定了备份文件保存的路径,USERPASSWORDHOSTPORTSID 分别指定了连接Oracle数据库的参数。

  1. 创建备份命令脚本 backup.sql
-- backup.sql
DECLARE
  jobno NUMBER;
BEGIN
  dbms_scheduler.create_job(job_name => 'backup_job',
                            job_type => 'EXPORT',
                            job_action => 'expdp ${USER}/${PASSWORD}@${SID} directory=DATA_PUMP_DIR dumpfile=${BACKUP_FILE} logfile=${BACKUP_DIR}/backup.log',
                            repeat_interval => 'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;',
                            enabled => FALSE);
  dbms_scheduler.set_attribute(name => 'backup_job',
                               attribute => 'logging_level',
                               value => DBMS_SCHEDULER.LOGGING_OFF);
  dbms_scheduler.enable(name => 'backup_job');
  SELECT job_name, state FROM user_scheduler_jobs WHERE job_name='backup_job';
END;

其中,job_action 参数指定了备份命令,repeat_interval 参数指定了任务运行的时间间隔。

  1. 设置计划任务,每天凌晨 2 点自动执行:
crontab -e

在打开的文件中添加以下内容:

0 2 * * * /path/to/backup.sh

示例二

假设我们需要备份多个Oracle数据库,并将备份文件分类保存。我们可以按照以下步骤操作:

  1. 在Oracle数据库中分别创建用户,并授予备份权限:
CREATE USER user1 IDENTIFIED BY password1;

GRANT CREATE SESSION TO user1;
GRANT DBA TO user1;

CREATE USER user2 IDENTIFIED BY password2;

GRANT CREATE SESSION TO user2;
GRANT DBA TO user2;
  1. 创建备份脚本 backup.sh
#!/bin/bash

# 设置环境变量
export ORACLE_HOME=/usr/lib/oracle/18.5/client64
export PATH=$PATH:$ORACLE_HOME/bin

# 备份目录
BACKUP_DIR=/data/backup

# 备份文件命名规则
DATE=`date +%Y-%m-%d`
FILE_PREFIX=${BACKUP_DIR}/${DATE}

# 备份 user1 数据库
USER=user1
PASSWORD=password1
HOST=192.168.1.10
PORT=1521
SID=orcl1
BACKUP_FILE=${FILE_PREFIX}_${SID}.dmp
sqlcl -S ${USER}/${PASSWORD}@${HOST}:${PORT}/${SID} @backup.sql ${BACKUP_FILE}
find ${BACKUP_DIR} -type f -name "${SID}*.dmp" -mtime +7 -delete

# 备份 user2 数据库
USER=user2
PASSWORD=password2
HOST=192.168.1.20
PORT=1521
SID=orcl2
BACKUP_FILE=${FILE_PREFIX}_${SID}.dmp
sqlcl -S ${USER}/${PASSWORD}@${HOST}:${PORT}/${SID} @backup.sql ${BACKUP_FILE}
find ${BACKUP_DIR} -type f -name "${SID}*.dmp" -mtime +7 -delete

其中,通过 ${DATE} 变量实现备份文件分类保存,每个备份文件名称由 ${FILE_PREFIX}${SID} 组成。USERPASSWORDHOSTPORTSID 分别指定了连接Oracle数据库的参数。

  1. 创建备份命令脚本 backup.sql:与示例一相同。

  2. 设置计划任务,每天凌晨 2 点自动执行:

crontab -e

在打开的文件中添加以下内容:

0 2 * * * /path/to/backup.sh

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 在客户端配置TNS测试报错ORA-12170:TNS:连接超时

    针对客户端配置TNS报错ORA-12170:TNS:连接超时,我们需要进行以下的完整攻略: 确认网络连接是否正常 首先,我们需要确认客户端与数据库服务器之间的网络连接是否正常。可以使用ping命令测试客户端与数据库服务器之间的网络连通性。例如,我们可以在客户端机器上执行如下命令: ping [数据库服务器的IP地址] 如果可以ping通数据库服务器地址,则说…

    database 2023年5月22日
    00
  • Oracle计算时间差常用函数

    Oracle计算时间差常用函数攻略 在Oracle数据库中,可以使用常用函数计算时间差,以下是常用的几个函数: 1. DATEDIFF函数 DATEDIFF函数用于计算两个日期之间的差值,它的语法如下所示: DATEDIFF( datepart, startdate, enddate ) 其中,datepart表示要计算的时间单位,如年、月、日、小时等;st…

    database 2023年5月21日
    00
  • MySQL INSERT:插入数据(添加数据)详解

    MySQL INSERT语句用于向MySQL表中插入新数据。常常用于添加新行或记录。 INSERT语法: INSERT INTO table_name (column1, column2, column3, …) VALUES (value1, value2, value3, …); 其中,table_name为要插入数据的表名;column1、co…

    MySQL 2023年3月9日
    00
  • 如何使用Python将数据插入到数据库中?

    在Python中,可以使用多种方式将数据插入到数据库中,包括使用标准库中的sqlite3模块、使用第三方库如pymysql、psycopg2等。以下是使用sqlite3模块和pymysql库将插入到数据库中的完整攻略: 使用sqlite3模块将数据插入到数据库中 sqlite3模块是Python标准库中的一个模块,用于与SQLite数据库进行交互。以下是使用…

    python 2023年5月12日
    00
  • 详解SQLite中的数据类型

    详解SQLite中的数据类型 SQLite中的数据类型是决定存储在数据库中数据格式的基础。SQLite提供了五种原始数据类型和三种大对象(LOB)类型,包括: NULL:表示一个无效值或空值。 INTEGER:表示带符号的整数值,可以是1,2,3,4,6,或8字节长度。 REAL:浮点数值,存储为8字节的IEEE浮点数字,仅适用于一些需要精确浮点数运算的场景…

    database 2023年5月19日
    00
  • ehcache memcache redis 区别

    之前用过redis 和 memcache ,没有ehcache 的开发经验,最近也查阅不少文档和博客,写一些总结,也有不少内容总结与诸多博客中的博主总结:  Ehcache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,所以被用于大型复杂分布式web application的各…

    Redis 2023年4月12日
    00
  • 半小时带你复习数据库三级复习大纲(小结)

    首先我会将“半小时带你复习数据库三级复习大纲(小结)”放在自己的网站上,并将它分为几个小节,以便读者可以更加清晰地了解复习大纲的内容。以下是详细的攻略: 标题 首先,我会在页面上设置了适当的标题。这包括整个页面的标题以及每个小节的子标题。标题应该简洁而明确,同时能够涵盖相关的主题。以下是一个示例页面的标题: 半小时带你复习数据库三级复习大纲(小结) 知识点1…

    database 2023年5月19日
    00
  • MySQL的if,case语句使用总结

    示例数据库   Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() …

    MySQL 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部