Oracle的备份——EXP

Oracle的备份

    • Oracle备份
      • 注意事项
      • Oracle备份命令——exp
    • Oracle的备份脚本
      • 注意事项
      • Windows
      • Linux
    • 定时备份
      • 注意事项
      • Windows下的定时备份
      • Linux下的定时备份
    • 常见问题
        • 有些表导着导着就没了


Oracle备份

注意事项

  • 命令执行位置
    • Oracle服务端
    • Oracle客户端
  • 备份数据库编码格式
    • Oracle客户端与Oracle服务端的编码格式
  • 是否支持exp命令
    • 是否安装Oracle客户端或Oracle服务端
  • 是否拥有读写权限
    • Window下的系统盘
    • Linux的用户读写权限

Oracle备份命令——exp

  • Oracle服务端下运行
-- 备份指定用户
--exp 用户名/用户密码 buffer=数据缓冲区大小 file=备份文件存储路径 log=备份日志存储路径
--例如:
--Windows
exp scott/pwd buffer=409600 file=D:\Oracle\Backup\scott.dmp log=D:\Oracle\Backup\scott.log
--Linux 
exp scott/pwd buffer=409600 file=/home/dev/oracle/backup/scott.dmp log=/home/dev/oracle/backup/scott.log
  • Oracle客户端下运行
-- 备份指定用户
--exp 用户名/用户密码@连接名 buffer=数据缓冲区大小 file=备份文件存储路径 log=备份日志存储路径
--例如:
--Windows
exp scott/pwd@dev_001 buffer=409600 file=D:\Oracle\Backup\scott.dmp log=D:\Oracle\Backup\scott.log
连接名为:tnsnames.ora下配置的名称
dev_001 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

Oracle的备份脚本

注意事项

  • 脚本执行位置
    • Windows
    • Linux
  • 脚本执行权限
  • 查询Oracle服务端编码
    • select userenv('language') from dual;
  • 脚本的格式
    • Windows:一般为GB2312
    • Linux:一般为UTF-8

Windows

@echo off
title 数据库备份脚本
color 07

:: 设置Oracle编码
:: 如果设置的Oracle编码的与Oracle服务端编码不一致,可能会导致乱码
:: 为减少不必要的麻烦,建议与Oracle服务端编码保持一致
set NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"

:: 获取日期时间
set currentTime=%time:~0,2%%time:~3,2%%time:~6,2%
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%

set basePath="D:\backup\dmp"
set baseRecoveryPath="D:\backup\recovery"

set oneLevelPath=%basePath%\%year%
set secondLevelPath=%oneLevelPath%\%month%
set threeLevelPath=%secondLevelPath%\%day%

:: 一级路径
if not exist "%oneLevelPath%"  mkdir %oneLevelPath%  

:: 二级路径
if not exist "%secondLevelPath%"  mkdir %secondLevelPath%  

:: 三级路径
if not exist "%threeLevelPath%"  mkdir %threeLevelPath%  

:: echo "导出指定用户下的数据文件";
::  导出scott数据库文件
echo "Export scott..."
exp scott/pwd buffer=409600 file=%threeLevelPath%\scott_%currentTime%.dmp log=%threeLevelPath%\scott_%currentTime%.log
echo "已完成数据库备份工作"

echo "开始复制备份文件到恢复文件夹..."
:: scott
copy %threeLevelPath%\scott_%currentTime%.dmp %baseRecoveryPath%\scott.dmp
echo "已完成文件复制工作"

Linux

#! /bin/bash
# Oracle数据库备份

# 设置Oracle备份所需的环境变量
# 如需设置Linxu定时任务自动运行脚本,必须设置环境变量
export ORACLE_HOME="/u01/app/oracle/product/11.2.0/EE";
export ORACLE_SID=EE;
export PATH="$PATH:/u01/app/oracle/product/11.2.0/EE/bin";

# 容器内执行,本地文件备份
# 设置Oracle编码
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK";
# 获取日期
# dateTime=$(date +%Y-%m-%d-%H%M%S);

# 获取当前日期
currentTime=$(date +%H%M%S);
year=$(date +%Y);
month=$(date +%m);
date=$(date +%d);
# 基础路径
basePath="/u01/app/oracle/backup/dmp";
baseRecoveryPath="/u01/app/oracle/backup/recovery";
oneLevelPath="$basePath/$year";
secondLevelPath="$basePath/$year/$month";
threeLevelPath="$basePath/$year/$month/$date";

# 判断一级路径是否存在————年份
if [ ! -d "$oneLevelPath" ]; then
	mkdir "$oneLevelPath"
fi

# 判断二级路径是否存在————月份
if [ ! -d "$secondLevelPath" ]; then
	mkdir "$secondLevelPath"
fi

# 判断三级路径是否存在————日
if [ ! -d "$threeLevelPath" ]; then
	mkdir "$threeLevelPath"
fi

# echo "导出指定用户下的数据文件";
# scott导出数据库文件
echo "Export scott...";
exp scott/pwd buffer=409600 file=$threeLevelPath/scott$currentTime.dmp log=$threeLevelPath/scott$currentTime.log;
echo "已完成数据库备份工作";

echo "开始复制备份文件到恢复文件夹..."
# scott
cp $threeLevelPath/scott$currentTime.dmp $baseRecoveryPath/scott.dmp;
echo "已完成文件复制工作";

echo "所有事项已完成,结束备份工作";


定时备份

注意事项

  • 权限
    • 读、写、可执行权限
  • 不含有中断指令
    • 例如:pause及其他可能导致脚本暂停的指令

Windows下的定时备份

  • 找到并打开“任务计划程序”
    • 位于:控制面板\系统和安全\管理工具 下选中 “任务计划程序”
    • Win10可以直接通过小娜搜索
  • 为了便于管理,可以在任务计划程序库中新建文件夹Oracle的备份——EXP_第1张图片
  • 接下来 创建任务
  • 输入具有描述性的名称、描述
  • 新增触发器,设置合适的执行周期
  • 新建操作,选中启动程序,在设置中选择需要执行的脚本文件
  • 保存即可

Linux下的定时备份

  • 查看是否具有crontab命令
  • 设置定时任务
    • crontab -e
  • 基于vi的编辑方式
    # crontab命令解释
    # *   *  *  *  *  command
    # 分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)  命令
    # 例如:每天01:00执行数据库备份脚本——backup.sh
     0 1 * * * /u01/app/oracle/backup.sh > /u01/app/oracle/cron.log 2>&1
    
  • 在命令模式下,输入wq!保存即可
  • 引用:crontab命令参考地址
    //重新载入配置
    /sbin/service crond reload 
    //重启服务
    /sbin/service crond restart
    

常见问题

有些表导着导着就没了

> 引用:11g默认创建一个表时不分配segment,只有在插入数据时才会产生(当然也可以强制分配),以节省磁盘空间。

参考地址1
参考地址2

  • 解决方案1
    --查询空表,并生成修改空表导出规则语句
    select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null;
    

你可能感兴趣的:(Oracle)