oracle数据库的逻辑备份与恢复
# oracle数据库的逻辑备份与恢复
# 引言
- 为什么要备份?
随着计算机的不断发展,数据安全显得愈发重要。一旦造成数据丢失,将会付出巨大的工作量去弥补数据,也可能因此造成不可挽回的损失。因此,无论是数据库管理员或是与数据交互的维护人员,都必须要学习备份知识,做好数据备份工作,以防备可能出现的数据丢失/损坏风险。
- 何为逻辑备份?
逻辑备份是指从数据库中导出数据并写入一个输出文件。逻辑备份只能用来对数据库进行逻辑恢复,即数据导入,而不能按数据库原来的存储特征进行物理恢复。逻辑备份可以使用exp命令来完成,逻辑导入可以使用imp命令来完成。
# 备份命令的使用
# 导出(exp 命令)
查看用户表信息
select * from tab;
导出表数据
## 命令示例
exp dxzh/duxingzhe@192.168.0.200:1521/orcl owner=dxzh file=x:\database\Oracle\\data\\exp\\1019\\userinfo.dmp log=X:\database\Oracle\\logs\\exp\\1019\\exp.log
## 示例中scott表示用户名,tiger表示用户口令
#导出一张表中的数据
exp scott/tiger tables=emp file=/home/oracle/bak/emp.dmp buffer=1000000
#导出多张表中的数据
exp scott/tiger tables=emp,dept file=/home/oracle/bak/emp_dept.dmp buffer=1000000
#导出emp表中的10部门数据
exp scott/tiger tables=emp query=\'where deptno=10\' file=/home/oracle/bak/emp10.dmp buffer=1000000
#导出emp表中的10部门数据
exp scott/tiger tables=emp query=\"where ename like \'%M%\'\" file=/home/oracle/bak/emp_ename.dmp buffer=1000000
#导出表结构
exp scott/tiger tables=emp,dept,salgrade rows=N file=/home/oracle/bak/scott_stru.dmp
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 导出用户数据
#scott用户导出自己的数据
exp scott/tiger owner=scott file=/home/oracle/bak/scott.dmp buffer=1048576
#system用户导出其它用户的数据
exp system/system owner=scott,jack file=/home/oracle/bak/user.dmp buffer=1048576
#导出整个数据库中的数据
exp system/system full=y file=/home/oracle/bak/full.dmp buffer=1048576
2
3
4
5
6
7
8
9
# 参数作用说明
- FULL
导出整个数据库,只有拥有exp_full_database角色的用户或者特权用户如sys,system等才能进行全库导出.full=y 或full=n
- BUFFER
指定数据缓冲区大小,单位为字节,不能写成buffer=1m的形式。(buffer=n #n为字节数)
- OWNER
需要导出的用户,如果需要导出多个用户可以使用逗号隔开。(说明:普通用户只能导出自己的数据,不能导出其它用户的数据。只有system用户才能导出其它用户的数据。)
- FILE
指定输出文件
- TABLES
指定需要导出的表,如果需要导出多个表可以使用逗号隔开。
- ROWS
指定导出后的表是否带数据(取值为N或Y,默认为Y)
- QUERY
导出表时指定条件以导出部分数据。
# 导入(imp命令)
- 导入命令及其示例
一、导入e01和e02表
imp scott/tiger tables=e01,e02 file=/home/oracle/bak/e01_02.dmp buffer=1048576
二、通过数据导入追加数据
#导出e02表中的10部门员工
exp scott/tiger tables=e02 query=\'where deptno=10\' file=/home/oracle/bak/e02_10.dmp buffer=1048576
#把导出的10部门的员工追加到e02表中
imp scott/tiger tables=e02 ignore=y file=/home/oracle/bak/e02_10.dmp buffer=1048576
三、导出并恢复一个用户下的所有数据
#导出scott用户下的所有数据
exp scott/tiger owner=scott file=/home/oracle/bak/scott.dmp buffer=1048576
#导入scott用户数据
imp scott/tiger full=y file=/home/oracle/bak/scott.dmp buffer=1048576
四、导出并恢复多个用户的数据(此操作必须有system用户完成)
#导出scott用户和jack用户的数据
exp system/system owner=scott,jack file=/home/oracle/bak/scott_jack.dmp buffer=1048576
#导入scott用户和jack用户的数据
imp system/system full=y file=/home/oracle/bak/scott_jack.dmp buffer=1048576
五、把一个用户的所有数据导入到另一个用户
#导出scott用户的数据
exp scott/tiger owner=scott file=/home/oracle/bak/scott.dmp buffer=1048576
#把scott用户的数据导入到jack用户
imp system/system fromuser=scott touser=jack file=/home/oracle/bak/scott.dmp buffer=1048576
六、把一个用户的部分数据导入到另一个用户
#导出scott用户的数据
exp scott/tiger owner=scott file=/home/oracle/bak/scott.dmp buffer=1048576
#把scott用户的e01和e02表导入到jack用户
imp system/system fromuser=scott touser=jack tables=e01,e02 file=/home/oracle/bak/scott.dmp buffer=1048576
七、恢复整个数据库中的数据
imp system/system full=y file=/home/oracle/bak/full.dmp buffer=1048576
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 参数作用说明
imp命令的参数和exp命令大部分是相同的,USERID、TABLES、OWNER、FILE、BUFFER等参数的含义和exp命令完全相同。
- 只导入数据
imp有一个参数,data_only, 默认为N,需要导入数据时添加data_only=y 即可
- ignore参数
(1)oracle imp 导入可以使用 ignore=y 参数进行覆盖数据库。如果不使用 ignore=y 参数在进行imp 导入时,就会对已经存在的表就不会进行导入,如果加上ignore=y 参数就会对已经存在的表中没有的记录进行更新,但对已经存在记录不会进行覆盖修改。
(2)在恢复数据的过程中,当导入某个表时,如果该表已经存在,则根据ignore参数的设置来决定如何操作。 若ignore=y,不执行CREATE TABLE语句,直接将数据插入到表中,如果插入的记录违背了约束条件,比如主键约束,唯一索引等,则出错的记录不会插入,但合法的记录会添加到表中。 若ignore=n,不执行CREATE TABLE语句,同时也不会将数据插入到表中,而是忽略该表的错误,继续导入下一个表。