物理备份

对数据库进行脱机备份

脱机备份称为冷备份,首先管理员使用 shutdown 命令关闭数据库服务,之后再复制需要的文件。

对数据库进行联机备份

联机备份又称为热备份,是在数据库归档模式下进行的备份。

查看数据库命令:

  1. archive log list;

image.png

设置数据库日志模式为归档模式使用如下命令:

  1. -- 修改系统日志方式是归档模式
  2. alter system set log_archive_start=true scope=spfile;
  3. -- 关闭数据库
  4. shutdown immediate;
  5. -- 启动mount实例
  6. startup mount;
  7. -- 更改数据库为归档日志模式
  8. alter database archivelog;

image.png

备份表空间

  1. -- 将数据库设置为打开状态
  2. alter database open;
  3. -- 假设备份表空间为test
  4. alter tablespace test begin backup;
  5. -- 打开数据库目录oradata文件夹,将数据文件存放至其他位置。
  6. -- 完成上步操作后执行下面命令来结束备份
  7. alter tablespace test end backup;

恢复表空间

  1. -- 对当前使用的日志进行归档
  2. alter system archive log current;
  3. -- 切换日志文件
  4. alter system switch logfile;
  5. -- 关闭数据库服务
  6. shutdown immediate;
  7. -- 删除数据文件
  8. -- 启动数据库
  9. startup;
  10. -- 报错提示缺少编号数据文件
  11. -- 亦可使用如下语句查询丢失的数据文件
  12. select * from v$recover_file;
  13. -- 将数据文件设置为脱机状态并删除(或另行保存),再把之前备份好的数据文件还原
  14. alter database datafile 编号 offline drop;
  15. -- 完成上述删除还原操作后,将数据库状态设置为open
  16. alter database open;
  17. -- 恢复数据库文件
  18. recover datafile 编号;
  19. -- 设置数据文件为联机状态
  20. alter database datafile 编号 online;

逻辑备份

逻辑备份是使用最多,能有选择性的备份数据库对象,可用性最好。不同于物理备份需要停止数据库服务。

  1. #!/bin/bash
  2. # author: acdiost
  3. # desc: 分表空间备份
  4. # 恢复操作:1. 创建表空间和用户 2. 创建目录对象 3. 授权 4. 导入表空间
  5. # 设置环境变量,根据 Oracle 家目录的环境变量设置
  6. ORACLE_BASE=/data/oracle
  7. ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2
  8. ORACLE_SID=orcl
  9. PATH=$PATH:$ORACLE_HOME/bin
  10. export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
  11. # 设置要备份和恢复的日期
  12. shijian=$(date +%Y%m%d)
  13. # 要备份的服务器
  14. dest_server='root@ip:/data/backup'
  15. # 备份的目录对象
  16. dir_obj=backup
  17. dir_obj_path=$ORACLE_BASE/backup
  18. # 要备份和恢复的表空间
  19. tablespaces=("ts1" "ts2" "ts3")
  20. # 创建目录对象
  21. function dir_object(){
  22. if [ ! -d ${dir_obj_path} ];then
  23. mkdir -p ${dir_obj_path}
  24. fi
  25. chown -R oracle.oinstall ${dir_obj_path}
  26. su - oracle <<EF
  27. sqlplus / as sysdba << EOF
  28. create directory ${dir_obj} as '${dir_obj_path}';
  29. exit;
  30. EOF
  31. EF
  32. }
  33. # 备份
  34. function backup(){
  35. for tablespace in ${tablespaces[@]}; do
  36. su - 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"
  37. done
  38. }
  39. # 清理
  40. function cleanup(){
  41. find ${dir_obj_path} -type f -name "*.dmp" -mtime +30 -exec rm -f {} +
  42. find ${dir_obj_path} -type f -name "*.log" -mtime +30 -exec rm -f {} +
  43. }
  44. # 传输
  45. # 设置免密登录
  46. function trans(){
  47. # yum install rsync -y
  48. for tablespace in ${tablespaces[@]}; do
  49. rsync -azP ${dir_obj_path}/${tablespace}_${shijian}.dmp ${dest_server}
  50. done
  51. }
  52. # 恢复说明
  53. # table_exists_action=replace
  54. # skip:跳过这个表如存在表
  55. # truncate:truncate表后导入数据
  56. # replace:drop表后创建表再插入数据
  57. # append:插入表新的数据
  58. # 还原
  59. # 新数据库的情况下执行,已存在情况下按需修改 remap 参数
  60. function restore(){
  61. for tablespace in ${tablespaces[@]}; do
  62. su - oracle <<EF
  63. sqlplus / as sysdba << EOF
  64. CREATE SMALLFILE TABLESPACE "${tablespace}" DATAFILE "${tablespace}" SIZE 100M AUTOEXTEND ON NEXT 100M LOGGING DEFAULT NOCOMPRESS ONLINE EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
  65. create user "${tablespace}" identified by "${tablespace}" profile "DEFAULT" account unlock default tablespace "${tablespace}" temporary tablespace "TEMP";
  66. grant "CONNECT" to "${tablespace}";
  67. grant "RESOURCE" to "${tablespace}";
  68. grant read,write on directory ${dir_obj} to "${tablespace}";
  69. alter user "${tablespace}" quota unlimited on "${tablespace}";
  70. exit;
  71. EOF
  72. EF
  73. su - oracle -c "${ORACLE_HOME}/bin/impdp ${tablespace}/${tablespace} directory=${dir_obj} dumpfile=${tablespace}_${shijian}.dmp tablespaces=${tablespace} table_exists_action=replace"
  74. done
  75. }
  76. function main(){
  77. # 目录对象可以重复执行,备份启用 backup,trans,还原启用 restore
  78. cleanup
  79. dir_object
  80. backup
  81. trans
  82. # restore
  83. }
  84. main

逻辑导出数据

使用exp工具完成。
10g以后出现expdp工具,使用数据泵技术,速度更快。

使用exp工具备份

不是在sqlplus工具下完成而是命令行下进行的

导出表

用户不能是sys,以scott用户为例导出部门表dept,结尾不能有分号
交互式导入

  1. exp username/password

image.png
image.png

单表导出
  1. exp scott/Oracle file=d:\oraclebackup\dept_by_cmd.dmp tables=dept

image.png
导出的结果
image.png

多表导出
  1. exp scott/Oracle file=d:\oraclebackup\dept_and_emp_by_cmd.dmp tables=scott.dept, scott.emp

image.png
image.png

导出表空间

导出表空间的用户必须是有具备管理员角色的用户

  1. exp username/password file="path/filename.dmp" tablespaces="tablespace_name"

使用expdp导出数据

与exp不同的是expdp需要先创建目录对象,通过这个对象就可以找到要备份的数据库服务器;并且备份出来的数据必须存放在这个目录对象对应的操作系统文件路径。

创建目录对象并授权

  1. -- directory_name 创建的目录对象名称 file_name 存放数据的路径
  2. create directory directory_name as 'file_name';
  3. -- 给使用目录对象的用户授权
  4. grant read,write on directory directory_name to user;
  5. -- 查看目录对象
  6. select * from dba_directories;

image.png

导出表

在命令行窗口

  1. expdp username/password directory=directory_name dumpfile=file_name tables=table_name

示例

单表

  1. expdp scott/Oracle directory=backup_scott dumpfile=scott_by_expdp.dmp tables=dept

image.png

image.png

多表操作

  1. expdp scott/Oracle directory=backup_scott dumpfile=dept_emp_by_expdp.dmp tables=dept,emp

image.png

逻辑导入数据

使用imp导入数据

交互式导入

  1. imp username/password

image.png

删除了一条数据,所以成功导入了一行

命令行导入

  1. imp username/password file="file_path.dmp" tables=table_name

使用impdp导入数据

  1. # 排除统计信息
  2. impdp username/password directory=directoru_name exclude=STATISTICS dumpfile=file_name.dmp tables=table_name

导入到相同用户的不同表空间

  1. impdp username/password directory=directoru_name dumpfile=file_name.dmp
  2. remap_tablespace=old:new

导入到不同用户的不同表空间

  1. impdp new_username/password directory=directoru_name dumpfile=file_name.dmp
  2. remap_schema=old:new remap_tablespace=old:new full=y

导入时遇到空间不足,任务挂起(suspended) ora-39171
  1. alter tablespace "spacename" add datafile 'filename' size 30G autoextend on next 100M;

使用RMAN工具

rman是recovery manager的缩写,可以备份数据库、表空间、数据文件、控制文件及日志文件;压缩备份可以只备份发生变化的内容;集成了第三方的磁带媒介软件;可以在Oracle数据库中存放备份信息。
rman在进行备份恢复操作时,有主要目标数据库、闪回区、介质管理等概念。

目标数据库

是使用rman进行备份和还原的数据库实例。

rman客户端

即rman

闪回区

是指磁盘上的一块区域,这个区域存放数据库备份和恢复的相关文件

介质管理

把数据库备份到介质中。

恢复目录

是一个独立的数据库,用于存放目标数据库的备份,可以是一个也可以是多个。

使用恢复目录

恢复目录是使用rman工具进行备份时要使用的存储备份信息的数据库。比直接把目标数据库中内容存放到控制文件中更节省空间。

创建恢复目录