1、数据备份和恢复的概述
a、备份与恢复的必要性
- 由于计算机系统的各种软硬件故障,用户的错误操作以及一些恶意破坏难以避免,因此这就影响到数据的正确性,甚至造成数据损失,服务器崩溃的严重后果。
- 所以经常的备份可以有效地防止数据丢失,能够把数据从错误状态恢复到正确状态。
b、备份解决方案
- Oracle备份有分为:物理备份和逻辑备份。
- 物理备份又分为冷备份和热备份。(热备份又分为用户管理备份和Oracle管理备份)
c、冷备份(脱机备份)具体步骤
sql> conn sys/02000059 as sysdba 已连接。 sql> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
2、把需要备份的文件拷贝到指定的位置。(复制所有需要备份的文件) 3、拷贝完成后,如果继续让用户使用数据库,需要以open方式启动数据库。
sql> startup open ORACLE 例程已经启动。 Total System Global Area 3373858816 bytes Fixed Size 2180424 bytes Variable Size 2013268664 bytes Database Buffers 1342177280 bytes Redo Buffers 16232448 bytes 数据库装载完毕。 数据库已经打开。
d、脱机备份的优点和不足
- 优点: 1、是非常快速的备份方法(只需要拷贝文件)。 2、容易归档(简单拷贝即可)。 3、容易恢复到某个时间点上(只需要将文件在拷贝回去)。 4、能够与归档方法向结合,作为数据库“最新状态”的恢复。 5、低度维护,高度安全。
- 不足: 1、单独使用时,只能提供到“某一时间点上”的恢复。 2、在实施备份的全过程中,数据库必须要做备份而不能作为其他工作。也就是说,在脱机备份过程中,数据库必须是关闭状态。 3、若磁盘空间有限,只能拷贝到其他外部存储设备上时,速度会很慢。 4、不能按表或者按用户恢复。
e、数据库恢复
- 数据库恢复就是把数据库中备份出来的数据重新还原给原来的数据库。
- 数据库恢复技术分为完全恢复和不完全恢复。
- 安全恢复是指把数据库恢复到数据库失败时的数据库状态;不完全恢复是指将数据库恢复到数据库失败前的某一时刻的数据库状态。
f、脱机恢复
g、脱机恢复的具体操作
- 脱机恢复的具体步骤分为三步: 1、以sys用户或者system身份登录数据库,以immediate方式关闭数据库。 2、将所有备份文件全部拷贝到原来的位置。 3、拷贝完成后,如果继续让用户使用数据库,需要以open方式启动数据库。
2、数据的导入和导出
a、图形化导入导出数据的方式
1、使用PLsql Developer工具导出数据: - 第一种是导出为.dump的文件格式,.dmp文件是二进制的,可以跨平台,还能包含权限,效率也很不错,用得最为广泛。 - 第二种是导出为.sql文件的,可用文本编辑器查看,通用性比较好,但是效率不如第一种,适合小数据量导入导出。
2、使用PLsql Developer工具导出数据: - 第一种是导入为.dump格式的文件: - 第二种是导入为.sql格式的文件: - 需要注意,导入的.sql格式的文件可以没有数据,但是必须要有表的结构,不然导入会失败。
b、命令行的方式进行数据的导出
- 数据导出命令执行方式如下:
EXP[username/password] 参数1 参数2
- 示例1:将数据库orc完全导出。
exp system/oracle@orcl file=c:\dump\oracle_bak.dmp full=y
exp scott/tiger1@orcl file=c:\dump\scott_bak.dmp owner=scott
- 示例3:将scott用户中表emp,dept导出
exp scott/tiger1@orcl file=c:\dump\table_bak.dmp tables=(emp,dept)
c、命令行的方式进行数据的导入
- 导入数据命令执行方式如下:
IMP [username/password] 参数1 参数2 ... ...
imp scott/tiger1@orcl file=c:\dump\scott_bak.dmp ignore=y
3、利用触发器实现数据的同步备份
a、利用触发器实现数据的同步备份图示
b、示例:利用触发器实现数据的同步备份
CREATE TABLE emp_bak AS SELECT * FROM emp;
2、创建触发器来实现数据的同步备份。(如当删除员工后,备份表同步删除)
CREATE OR REPLACE TRIGGER syno_bak_tirgger AFTER DELETE ON emp FOR EACH ROW BEGIN DELETE FROM emp_bak WHERE empno = :old.empno; END;
3、测试
DELETE FROM emp WHERE empno = 7951; SELECT * FROM emp; SELECT * FROM emp_bak;