本节要点:
- 数据库备份与恢复的概念
- 什么是备份
- 什么是数据恢复
- 物理备份和恢复数据库(不建议浏览,建议跳过该部分)
- 对数据库进行脱机备份
- 对数据库进行联机备份
- 逻辑备份和恢复数据
- 逻辑导出数据
- 逻辑导入数据
1 数据库备份与恢复的概念
1.1 什么是备份
数据库备份就是将数据库的内容全部复制出来保存到计算机的另一个位置或者其他存储设备上。数据库备份也有很多种,主要有物理备份和逻辑备份。
物理备份:对数据库的操作系统物理文件(如数据文件、控制文件和日志文件等)的备份
逻辑备份:对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份
1.2 什么是数据恢复
数据恢复就是把从数据库中备份出来的数据重新还原给原来的数据库。数据库的恢复技术分为完全恢复和不完全恢复两种,完全恢复时指把数据库恢复到数据库失败时的数据库状态;不完全恢复是指将数据库恢复到数据库失败前的某一个时刻的数据库状态。数据库恢复也分物理恢复和逻辑恢复,物理恢复就是把数据从数据库中备份的文件重新复制到原来的数据库中;逻辑恢复就是把从数据库中导出的数据再导入原来的数据库。
2 物理备份和恢复数据库
物理备份数据库的方式是比较容易完成的,主要是把数据库中的文件复制到磁盘的不同位置,然后在数据库出现问题时进行恢复使用。下面将讲述在脱机和联机两种状态下备份与恢复数据库中的文件。
2.1 对数据库进行脱机备份
脱机备份称为冷备份。首先,管理员身份的用户使用shutdown命令关闭数据库的服务,之后复制需要的文件,包括把数据文件和控制文件等相关的内容复制到其他磁盘的路径上。如果数据库出现问题,那么就可以把从数据库中复制出来的相关内容再复制回原来的数据库目录中。
2.2 对数据库进行联机备份
联机备份称为热备份,需要在数据库的归档模式下进行的备份。因为联机备份的时候,数据库还处于可操作状态,而做这些操作会记录到联机日志文件中,当联机日志文件满后就把这些操作存入归档日志中,备份一段时间后,数据库出现问题,就可以用备份的文件与日志文件进行恢复,保证数据不丢失。
在讲解热备份之前,先简单的了解一下oracle的日志切换过程。日志切换涉及到三个概念:重做日志、归档模式(archive log mode)及非归档模式(no archive log mode)。oracle数据库的重做日志是重复写的,一般来说oracle数据库拥有多个重做日志组,我们大部分的数据更改操作都会写入重做日志。当一个重做日志写满或DBA发出switch log命令的时候就会发生日志切换,如果oracle运行在非归档模式下,oracle直接覆盖写下一个重做日志组。如果oracle运行在归档模式下则oracle会查询即将写入的重做日志是否归档,没有归档则等待其归档,等归档完成以后再覆盖写入重做日志记录。当然如果发生了归档等待的话可以通过添加重做日志组或开启更多的归档进程来避免这个等待事件。
总的来说归档模式(archivelog mode)及非归档模式(noarchive mode)的最重要的区别就是当前的重做日志切换以后会不会被归档进程copy到归档目的地。
查看数据库中日志的命令如下:
Archive log list
显示如下:
从上图可以看出,目前数据库的日志模式是非存档模式,同时自动存档方式也是禁用的。
前面讲了联机备份是在归档模式(与存档模式一个概念)下进行的,所以在进行联机备份之前设置数据库日志模式为归档模式,使用下面的语句完成:
Alter system set log_archive_start=true scope=spfile;
Shutdown immediate;
Startup mount;
Alter database archivelog;
- 第1行修改系统的日志方式是归档模式
- 第2行关闭数据库
- 第3行启动mount实例,但不启动数据库
- 第4行更改数据库为归档日志模式
显示如下:
更改完成后使用Archive log list语句查看日志模式的状态,即可看到当前日志模式已经被修改为归档模式,并且自动存档方式已经启用。现在我们可以开始备份与恢复操作了。
示例1:备份表空间TEST
1) 改变数据库的状态为open
Alter database open;
2) 开始备份表空间(begin backup干了什么,有什么意义?)
Alter tablespace TEST begin backup;
3) 打开数据库中oradata文件夹(一般数据库对象都存放在该文件夹中),把文件复制到磁盘中的另一个文件夹或其他磁盘上。
select name from v$datafile;/*可以查看表空间地址*/
4) 结束表空间的备份
Alter tablespace TEST end backup;
由归档模式改为非归档模式:
Alter system set log_archive_start=false scope=spfile;
Shutdown immediate;
Startup mount;
Alter database noarchivelog;
3 逻辑备份和恢复数据
逻辑备份是最常用的备份方式。
3.1 逻辑导出数据
导出数据可以使用EXP工具完成,也可以使用在Oracle 10g以后出现的EXPDP工具完成。下面分别使用这两种方式对数据库进行导出备份。
1) 使用EXP工具备份
EXP工具可以将数据库中的对象有选择性地备份出来,可以使用EXP工具导出的数据库对象有表、方案、表空间以及数据库。使用EXP工具需要在DOS命令窗口下完成。
zhou/123456@zhouyq表示:用户名/用户密码@实例名
- 按表方式导出数据
exp zhou/123456@zhouyq file= F:\oracle\tables.dmp tables=table1, table2
- 按表空间方式导出数据
exp zhou/123456@zhouyq tablespaces=(users) file= F:\oracle\tablespace.dmp
- 按用户方式导出数据
exp zhou/123456@zhouyq file= F:\oracle\user.dmp owner=zhou
2) 使用EXPDP导出数据
EXPDP是Oracle 10g开始引入的数据泵技术。使用EXPDP工具与EXP不同的是,在使用EXPDP时要先创建目录对象,通过这个对象就可以找到要备份数据的数据库服务器,并且使用EXPDP工具备份出来的数据必须存放在目录对象对应的操作系统的目录中。
使用注意事项:
- EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。
- EXPDP和IMPDP是 服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。
- IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。
EXPDP/IMPDP相对于EXP/IMP的优势:
- exp/imp客户端程序,受网络,磁盘的影响;impdp/expdp服务器端程序,只受磁盘的影响
- expdp/IMPDP与EXP/IMP相比提供了并行的方式(写入多个导出文件)
导出步骤:
- 1创建逻辑目录,该命令不会在操作系统创建真正的目录(请先创建真正的目录),最好以system等管理员创建逻辑目录。(该步骤可以在PL/SQL developer中完成)
create directory dump_dir as 'F:\oracle\';
- 2查看管理员目录,如下图所示逻辑目录已经创建成功,同时我们也可以看到有其他的逻辑目录,如果你觉得合适可以不用创建新的逻辑目录,直接沿用以前有的就可以。(注:需要使用管理员用户才能看到,普通用户会提示表或视图不存在)
select * from dba_directories;
- 3给普通用户zhou赋予在指定目录的操作权限,最好以system等管理员赋予。
grant read,write on directory dump_dir to zhou;
- 4导出数据(在这里直接使用现有的目录DATA_PUMP_DIR)
- 导出表
expdp zhou/123456@zhouyq directory=DATA_PUMP_DIR tables=TABLE1,TABLE2 dumpfile=expdp_table.dmp
- 按查询条件导出
expdp zhou/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_query.dmp tables=table1 query='where id!=1'
- 按表空间导
expdp zhou/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_tablespace.dmp tablespaces=USERS
- 导出用户
expdp zhou/123456@zhouyq schemas=zhou dumpfile=expdp_user.dmp directory=DATA_PUMP_DIR
- 导整个数据库
expdp system/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_full.dmp full=y
3.2 逻辑导入数据
1) 使用IMP导入数据
- 导入表
imp zhou/123456@zhouyq file= F:\oracle\tables.dmp tables=table1, table2
- 表空间导入
imp zhou/123456@zhouyq tablespaces=(users) file= F:\oracle\tablespace.dmp full=y
- 用户导入
imp zhou/123456@zhouyq file= F:\oracle\user.dmp fromuser=zhou touser=zhou
2) 使用IMPDP导入数据
- 导入用户(从用户scott导入到用户scott)
impdp zhou/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_user.dmp schemas=zhou
- 导入表(从scott用户中把表dept和emp导入到system用户中)
impdp zhou/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_table.dmp tables=zhou.table1,zhou.table2
- 导入表空间
impdp zhou/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_tablespace.dmp tablespaces=USERS
- 导入数据库
impdp system/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_full.dmp full=y
- 追加数据(之所以模式是tables=table1,是与导出文件expdp_query一致):“追加数据”可以认为是“按查询条件导出”的反向。
impdp zhou/123456@zhouyq directory=DATA_PUMP_DIR dumpfile=expdp_query.dmp tables=table1 TABLE_EXISTS_ACTION=replace