本文档详细介绍了在Linux/AIX环境下Oracle数据库的备份恢复方法,包括exp/imp和expdp/impdp两种方式,自动备份脚本的编写与配置,以及统计分析的方法。exp/imp方式涉及传统的备份恢复命令,包括数据泵(Data Pump)的expdp/impdp方式,后者支持更高效的备份和恢复。文档还提供了自动备份脚本的编写示例,并介绍了如何通过crontab设置定时任务实现自动备份。此外,还提供了统计分析的SQL命令,帮助优化数据库性能,并介绍了删除Oracle用户的方法。
Linux/AIX环境下oracle数据库的备份恢复及自动备份脚本
vekoy_lin
目录
[list]
[*]1、exp/imp方式
[*]2、expdp/impdp方式
[*]3、自动备份方案
[*]4、统计分析
[/list]
1、exp/imp方式
1.1 exp备份
[code]su - oracle
exp pjwdb/password@orcl file=/home/oracle/backup/pjwdb_`date +%Y%m%d`.dmp log=/home/oracle/backup/pjwdb_`date +%Y%m%d`.log owner=pjwdb //(将生成 pjwdb_20160901.dmp文件)[/code]或
[code]su - oracle
exp pjwdb/password@orcl file=/home/oracle/backup/pjwdb_`date +%A`.dmp log=/home/oracle/backup/pjwdb_`date +%A`.log owner=pjwdb //(将生成 pjwdb_星期四.dmp文件,可直接作为7天自动备份脚本)[/code]
备注:如数据库是RAC环境,备份脚本需要增加参数 CLUSTER=N1.2 imp恢复
创建表空间及用户(用户以pjwdb为例):
[code]--创建表空间前需要先查询原导出用户所使用的所有表空间,然后创建同名表空间,一般情况下可能没有VT表空间,可以不建,视备份的数据为准
--预估下正式库占用了多大空间,一个数据文件最大到32G,建立数据文件个数=[EAS_D_YJEAS_STANDARD表空间大小/32G]
--创建临时表空间
create temporary tablespace EAS_T_PJWDB_STANDARD
tempfile 'F:\oradata\orcl\EAS_T_PJWDB_STANDARD.ORA'
size 2000m
autoextend on
next 100m maxsize unlimited
extent management local;
--创建主表空间
create tablespace EAS_D_PJWDB_STANDARD
logging
datafile 'F:\oradata\orcl\EAS_D_PJWDB_STANDARD.ora'
size 3000m
autoextend on
next 200m maxsize unlimited
extent management local;
--主表空间增加数据文件
alter tablespace EAS_D_PJWDB_STANDARD
add
datafile 'I:\oradata\orcl\EAS_D_PJWDB_STANDARD1.ora'
size 3000m
autoextend on;
--创建VT表空间
create tablespace EAS_D_PJWDB_TEMP2
logging
datafile 'F:\oradata\orcl\EAS_D_PJWDB_TEMP2.ora'
size 1000m
autoextend on
next 200m maxsize unlimited
extent management local;
--创建索引表空间
create tablespace EAS_D_PJWDB_INDEX
logging
datafile 'F:\oradata\orcl\EAS_D_PJWDB_INDEX.ora'
size 1000m
autoextend on
next 200m maxsize unlimited
extent management local;
--创建用户并制定默认表空间
create user PJWDB identified by pjwdb2012
default tablespace EAS_D_PJWDB_STANDARD
temporary tablespace EAS_T_PJWDB_STANDARD;
--新增用户授权
grant connect,resource,dba to PJWDB;[/code]编辑如上文件,保存为create.sql,放在某目录,执行该脚本
[code]su - oracle
sqlplus / as sysdba //如果有多实例,指定实例连接:sqlplus /@orcl as sysdba
SQL>@/home/oracle/create.sql[/code]执行完毕,检查对应目录是否已创建好数据文件。
1.2.1 imp同名恢复
[code]su - oracle
set ORACLE_SID=orcl //如果有多个数据库实例
set NLS_LANG=AMERICAN_AMERICA.UTF8
imp pjwdb/password@orcl file=/home/oracle/backup/pjwdb0825exp log=/home/oracle/backup/easimp.log fromuser=pjwdb[/code]1.2.2imp异名恢复(从pjwdb用户导入到pjwdb01)
[code]su - oracle
set ORACLE_SID=orcl //如果有多个数据库实例
set NLS_LANG=AMERICAN_AMERICA.UTF8
imp pjwdb/password@orcl file=/home/oracle/backup/pjwdb0825exp log=/home/oracle/backup/easimp.log fromuser=pjwdb touser=pjwdb01[/code]2、expdp/impdp方式
2.1 expdp备份
[code]su - oracle
sqlplus / as sysdba //如果有多实例,指定实例连接:sqlplus /@orcl as sysdba
sql>create directory eas_dump as '/home/oracle/backup'; //建立oracle目录
sql>grant read,write on directory eas_dump to pjwdb;
sql>exit
expdp pjwdb/password schemas=pjwdb directory=eas_dump dumpfile=pjwdb_`date +%Y%m%d`.dmp logfile=pjwdb_`date +%Y%m%d`.log exclude=table:\"like \'VT%\'\",statistics parallel=2
或
expdp pjwdb/password schemas=pjwdb directory=eas_dump dumpfile=pjwdb_`date +%A`.dmp logfile=pjwdb_`date +%A`.log exclude=table:\"like \'VT%\'\",statistics parallel=2[/code]备注:如数据库是RAC环境,备份脚本需要增加参数 CLUSTER=N
2.2 impdp恢复
创建表空间及用户(用户以pjwdb为例):
内容同上,参见1.2
……
编辑如上文件,放在某目录,执行该脚本
[code]su - oracle
sqlplus / as sysdba //如果有多实例,指定实例连接:sqlplus /@orcl as sysdba
SQL>@/home/oracle/create.sql[/code]执行完毕,检查对应目录是否已创建好数据文件。
2.2.1 impdp同名恢复
[code]--将备份文件拷贝至/home/oracle/backup,建立oracle目录
su - oracle
sqlplus / as sysdba //如果有多实例,指定实例连接:sqlplus /@orcl as sysdba
sql>create directory eas_dump as '/home/oracle/backup';
sql>grant read,write on directory eas_dump to pjwdb;
sql>exit
set ORACLE_SID=orcl //如果有多个数据库实例
set NLS_LANG=AMERICAN_AMERICA.UTF8
impdp pjwdb/password schemas=pjwdb directory=eas_dump dumpfile=pjwdb20150901.dmp logfile=pjwdb20150901.log parallel=2
--如果导出时未排除VT临时表和统计信息
impdp pjwdb/password schemas=pjwdb directory=eas_dump dumpfile=pjwdb20150901.dmp logfile=pjwdb20150901.log exclude=table:\"like \'VT%\'\",statistics parallel=2[/code]2.2.2 impdp异名恢复(从pjwdb用户导入到pjwdb01,表空间也不同)
[code]--将备份文件拷贝至/home/oracle/backup,建立oracle目录
su - oracle
sqlplus / as sysdba //如果有多实例,指定实例连接:sqlplus /@orcl as sysdba
sql>create directory eas_dump as '/home/oracle/backup';
sql>grant read,write on directory eas_dump to pjwdb;
sql>exit
set ORACLE_SID=orcl //如果有多个数据库实例
set NLS_LANG=AMERICAN_AMERICA.UTF8
impdp system/kdlsys remap_schema=pjwdb:pjwdb01 remap_tablespace=EAS_D_PJWDB_STANDARD:EAS_D_PJWDB01_STANDARD remap_tablespace=EAS_D_PJWDB_TEMP2:EAS_D_PJWDB01_TEMP2 remap_tablespace=EAS_T_PJWDB_STANDARD:EAS_T_PJWDB01_STANDARD remap_tablespace=EAS_D_PJWDB_INDEX:EAS_D_PJWDB01_INDEX directory=eas_dump dumpfile=pjwdb20160901.DMP logfile=pjwdb20150901.log parallel=2
--如果导出时未排除VT临时表和统计信息,用如下语句
impdp system/kdlsys remap_schema=pjwdb:pjwdb01 remap_tablespace=EAS_D_PJWDB_STANDARD:EAS_D_PJWDB01_STANDARD remap_tablespace=EAS_D_PJWDB_TEMP2:EAS_D_PJWDB01_TEMP2 remap_tablespace=EAS_T_PJWDB_STANDARD:EAS_T_PJWDB01_STANDARD remap_tablespace=EAS_D_PJWDB_INDEX:EAS_D_PJWDB01_INDEX directory=eas_dump dumpfile=pjwdb20160901.DMP logfile=pjwdb20150901.log exclude=table:\"like \'VT%\'\",statistics parallel=2[/code]备注:导入时,若环境为RAC环境,先关闭一个节点再执行导入工作
3、自动备份方案(参考)
编辑backup.sh处理文件内容(保存7天内容):
[code]#保留数据截止日期,15天
prerq=`perl -e '($a,$b,$c,$day,$mon,$year,$d,$e,$f) = localtime(time-86400*15);printf "%4d%02d%02d",$year+1900,$mon,$day+15'`
ls /oraback/pjwdb_* |awk -v pd="$prerq" '{frq=substr($0,17,8); if (pd>frq) { str="rm -rf "$0; print str;system(str);} } '
#删除备份日志文件
find /oraback/oralog -ctime +10 |xargs rm 2>&1 > /dev/null
#当期日期
rq=`date +%Y%m%d`
expdp pjwdb/password schemas=pjwdb directory=eas_dump dumpfile=pjwdb_$rq.dmp logfile=pjwdb_$rq.log exclude=table:\"like \'VT%\'\",statistics parallel=2
gzip /oraback/pjwdb_$rq.dmp
gzip /oraback/pjwdb_$rq.log[/code]设置脚本定时执行:
[code]crontab -e
30 1 * * * oracle /home/oracle/backup.sh #每天凌晨1点30分,以oracle用户执行backup.sh备份文件
:wq! #保存退出[/code]例行性工作排程crontab示范
[code][root@study ~]# cat /etc/crontab
SHELL=/bin/bash <==使用哪種 shell 介面
PATH=/sbin:/bin:/usr/sbin:/usr/bin <==執行檔搜尋路徑
MAILTO=root <==若有額外STDOUT,以 email將資料送給誰
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed[/code]
4、统计分析
对新导入的用户数据,进行统计分析
方法一:SQL执行dbms_stats.gather_schema_stats
[code]sqlplus / as sysdba //如果有多实例,指定实例连接:sqlplus /@orcl as sysdba
--对没有统计信息的用户进行统计分析,即第一次统计分析
exec dbms_stats.gather_schema_stats(ownname => 'PJWDB', options => 'GATHER AUTO',estimate_percent =>dbms_stats.auto_sample_size, method_opt => 'for all columns size 1',cascade=>TRUE,degree => 4 ) ;
--若存在统计信息,对用户重新进行统计分析
exec dbms_stats.gather_schema_stats(ownname=>'PJWDB',cascade=>true,estimate_percent=>null,degree=>4,granularity=>'auto',method_opt=>'FOR ALL COLUMNS SIZE AUTO',options=>'GATHER AUTO');[/code]方法二:利用EAS管理控制台对所有表进行逐表统计分析
备注:Linux 平台下,若oracle用户密码存在特殊字符:1个双引号扩密码,1个单引号扩 用户名+密码,即: '用户名/"密码"'@服务名
附
如何删除已存在的用户
方法一:
sqlplus / as sysdba 连接
1) 关闭数据库
shutdown immediate
2) 以migrate模式启动
startup migrate
3) 删除用户及其数据时间较长
drop user pjwdb cascade;
4) 关闭数据库
shutdown immediate
5) 启动
startup
方法二:如不能重启数据库,则删除所有当前用户的连接后再删除用户
[code]alter user pjwdb account lock;
SELECT * FROM V$SESSION WHERE USERNAME='pjwdb';
alter system kill session 'xx,xx';
drop user pjwdb cascade;[/code]
推荐阅读