以下是详细讲解“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
目录中。我们可以按照以下步骤操作:
- 在Oracle数据库中创建一个用户
myuser
,并授予其备份权限:
CREATE USER myuser IDENTIFIED BY mypassword;
GRANT CREATE SESSION TO myuser;
GRANT DBA TO myuser;
- 创建备份脚本
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
变量指定了备份文件保存的路径,USER
、PASSWORD
、HOST
、PORT
、SID
分别指定了连接Oracle数据库的参数。
- 创建备份命令脚本
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
参数指定了任务运行的时间间隔。
- 设置计划任务,每天凌晨 2 点自动执行:
crontab -e
在打开的文件中添加以下内容:
0 2 * * * /path/to/backup.sh
示例二
假设我们需要备份多个Oracle数据库,并将备份文件分类保存。我们可以按照以下步骤操作:
- 在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;
- 创建备份脚本
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}
组成。USER
、PASSWORD
、HOST
、PORT
、SID
分别指定了连接Oracle数据库的参数。
-
创建备份命令脚本
backup.sql
:与示例一相同。 -
设置计划任务,每天凌晨 2 点自动执行:
crontab -e
在打开的文件中添加以下内容:
0 2 * * * /path/to/backup.sh
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份 - Python技术站