物理备份
对数据库进行脱机备份
脱机备份称为冷备份,首先管理员使用 shutdown 命令关闭数据库服务,之后再复制需要的文件。
对数据库进行联机备份
联机备份又称为热备份,是在数据库归档模式下进行的备份。
查看数据库命令:
archive log list;

设置数据库日志模式为归档模式使用如下命令:
-- 修改系统日志方式是归档模式alter system set log_archive_start=true scope=spfile;-- 关闭数据库shutdown immediate;-- 启动mount实例startup mount;-- 更改数据库为归档日志模式alter database archivelog;

备份表空间
-- 将数据库设置为打开状态alter database open;-- 假设备份表空间为testalter tablespace test begin backup;-- 打开数据库目录oradata文件夹,将数据文件存放至其他位置。-- 完成上步操作后执行下面命令来结束备份alter tablespace test end backup;
恢复表空间
-- 对当前使用的日志进行归档alter system archive log current;-- 切换日志文件alter system switch logfile;-- 关闭数据库服务shutdown immediate;-- 删除数据文件-- 启动数据库startup;-- 报错提示缺少编号数据文件-- 亦可使用如下语句查询丢失的数据文件select * from v$recover_file;-- 将数据文件设置为脱机状态并删除(或另行保存),再把之前备份好的数据文件还原alter database datafile 编号 offline drop;-- 完成上述删除还原操作后,将数据库状态设置为openalter database open;-- 恢复数据库文件recover datafile 编号;-- 设置数据文件为联机状态alter database datafile 编号 online;
逻辑备份
逻辑备份是使用最多,能有选择性的备份数据库对象,可用性最好。不同于物理备份需要停止数据库服务。
#!/bin/bash# author: acdiost# desc: 分表空间备份# 恢复操作:1. 创建表空间和用户 2. 创建目录对象 3. 授权 4. 导入表空间# 设置环境变量,根据 Oracle 家目录的环境变量设置ORACLE_BASE=/data/oracleORACLE_HOME=$ORACLE_BASE/product/12.1.0.2ORACLE_SID=orclPATH=$PATH:$ORACLE_HOME/binexport ORACLE_BASE ORACLE_HOME ORACLE_SID PATH# 设置要备份和恢复的日期shijian=$(date +%Y%m%d)# 要备份的服务器dest_server='root@ip:/data/backup'# 备份的目录对象dir_obj=backupdir_obj_path=$ORACLE_BASE/backup# 要备份和恢复的表空间tablespaces=("ts1" "ts2" "ts3")# 创建目录对象function dir_object(){if [ ! -d ${dir_obj_path} ];thenmkdir -p ${dir_obj_path}fichown -R oracle.oinstall ${dir_obj_path}su - oracle <<EFsqlplus / as sysdba << EOFcreate directory ${dir_obj} as '${dir_obj_path}';exit;EOFEF}# 备份function backup(){for tablespace in ${tablespaces[@]}; dosu - oracle -c "${ORACLE_HOME}/bin/expdp \'sys/pwd as sysdba\' directory=${dir_obj} dumpfile=${tablespace}_${shijian}.dmp logfile=${tablespace}_${shijian}.log tablespaces=${tablespace} compression=ALL"done}# 清理function cleanup(){find ${dir_obj_path} -type f -name "*.dmp" -mtime +30 -exec rm -f {} +find ${dir_obj_path} -type f -name "*.log" -mtime +30 -exec rm -f {} +}# 传输# 设置免密登录function trans(){# yum install rsync -yfor tablespace in ${tablespaces[@]}; dorsync -azP ${dir_obj_path}/${tablespace}_${shijian}.dmp ${dest_server}done}# 恢复说明# table_exists_action=replace# skip:跳过这个表如存在表# truncate:truncate表后导入数据# replace:drop表后创建表再插入数据# append:插入表新的数据# 还原# 新数据库的情况下执行,已存在情况下按需修改 remap 参数function restore(){for tablespace in ${tablespaces[@]}; dosu - oracle <<EFsqlplus / as sysdba << EOFCREATE SMALLFILE TABLESPACE "${tablespace}" DATAFILE "${tablespace}" SIZE 100M AUTOEXTEND ON NEXT 100M LOGGING DEFAULT NOCOMPRESS ONLINE EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;create user "${tablespace}" identified by "${tablespace}" profile "DEFAULT" account unlock default tablespace "${tablespace}" temporary tablespace "TEMP";grant "CONNECT" to "${tablespace}";grant "RESOURCE" to "${tablespace}";grant read,write on directory ${dir_obj} to "${tablespace}";alter user "${tablespace}" quota unlimited on "${tablespace}";exit;EOFEFsu - oracle -c "${ORACLE_HOME}/bin/impdp ${tablespace}/${tablespace} directory=${dir_obj} dumpfile=${tablespace}_${shijian}.dmp tablespaces=${tablespace} table_exists_action=replace"done}function main(){# 目录对象可以重复执行,备份启用 backup,trans,还原启用 restorecleanupdir_objectbackuptrans# restore}main
逻辑导出数据
使用exp工具完成。
10g以后出现expdp工具,使用数据泵技术,速度更快。
使用exp工具备份
导出表
用户不能是sys,以scott用户为例导出部门表dept,结尾不能有分号
交互式导入
exp username/password
单表导出
exp scott/Oracle file=d:\oraclebackup\dept_by_cmd.dmp tables=dept
多表导出
exp scott/Oracle file=d:\oraclebackup\dept_and_emp_by_cmd.dmp tables=scott.dept, scott.emp


导出表空间
导出表空间的用户必须是有具备管理员角色的用户
exp username/password file="path/filename.dmp" tablespaces="tablespace_name"
使用expdp导出数据
与exp不同的是expdp需要先创建目录对象,通过这个对象就可以找到要备份的数据库服务器;并且备份出来的数据必须存放在这个目录对象对应的操作系统文件路径。
创建目录对象并授权
-- directory_name 创建的目录对象名称 file_name 存放数据的路径create directory directory_name as 'file_name';-- 给使用目录对象的用户授权grant read,write on directory directory_name to user;-- 查看目录对象select * from dba_directories;
导出表
在命令行窗口
expdp username/password directory=directory_name dumpfile=file_name tables=table_name
示例
单表
expdp scott/Oracle directory=backup_scott dumpfile=scott_by_expdp.dmp tables=dept


多表操作
expdp scott/Oracle directory=backup_scott dumpfile=dept_emp_by_expdp.dmp tables=dept,emp

逻辑导入数据
使用imp导入数据
交互式导入
imp username/password

删除了一条数据,所以成功导入了一行
命令行导入
imp username/password file="file_path.dmp" tables=table_name
使用impdp导入数据
# 排除统计信息impdp username/password directory=directoru_name exclude=STATISTICS dumpfile=file_name.dmp tables=table_name
导入到相同用户的不同表空间
impdp username/password directory=directoru_name dumpfile=file_name.dmpremap_tablespace=old:new
导入到不同用户的不同表空间
impdp new_username/password directory=directoru_name dumpfile=file_name.dmpremap_schema=old:new remap_tablespace=old:new full=y
导入时遇到空间不足,任务挂起(suspended) ora-39171
alter tablespace "spacename" add datafile 'filename' size 30G autoextend on next 100M;
使用RMAN工具
rman是recovery manager的缩写,可以备份数据库、表空间、数据文件、控制文件及日志文件;压缩备份可以只备份发生变化的内容;集成了第三方的磁带媒介软件;可以在Oracle数据库中存放备份信息。
rman在进行备份恢复操作时,有主要目标数据库、闪回区、介质管理等概念。
目标数据库
rman客户端
闪回区
是指磁盘上的一块区域,这个区域存放数据库备份和恢复的相关文件
介质管理
恢复目录
是一个独立的数据库,用于存放目标数据库的备份,可以是一个也可以是多个。
使用恢复目录
恢复目录是使用rman工具进行备份时要使用的存储备份信息的数据库。比直接把目标数据库中内容存放到控制文件中更节省空间。


