目录
3)打开数据库中的oradata文件夹(一般数据库对象都存放在该文件夹中),把文件复制到磁盘中的另一个文件夹或其他磁盘上。
1)对当前的日志进行归档,对当前使用的日志进行归档的命令如下:
2)切换日志文件,由于在一个数据库中一般有3个日志文件,所以需要使用3次下面的语句来切换日志文件:
备份是保存数据库的副本,恢复就是把以前从数据库中备份的文件还原到数据库中。对数据库进行备份和恢复是确保数据库中数据安全的一个关键技术。
一、什么是数据库备份?
数据库备份就是将数据库的内容全部复制出来保存到计算机的另一个位置或者其他存储设备上。数据库备份也分很多种,主要有物理备份和逻辑备份。
物理备份是指通常所说的归档模式备份(又叫热备份)和非归档模式备份(又叫冷备份),归档模式备份是当数据库的模式设置成归档模式时对数据库进行的备份;而非归档模式备份是当数据库的模式设置成非归档模式时对数据库的备份。
逻辑备份主要是指对数据库的导入和导出操作,在Oracle 10g之前使用IMP/EMP的方式进行导入和导出操作,从Oracle 10g开始引入了数据泵技术,使用EXPDP/IMPDP的方式对数据进行导入和导出的操作。
数据泵:Data Pump
导入:import
导出:export

二、什么是数据库恢复?
数据库恢复就是把从数据库中备份出来的数据重新还原给原来的数据库,数据库的恢复技术分为完全恢复和不完全恢复两种。完全恢复是指把数据库恢复到数据库失败时的数据库状态,不完全恢复是指将数据库恢复到数据库失败前的某一时刻的数据库状态。数据库备份分物理备份和逻辑备份,数据库恢复也分物理恢复和逻辑恢复:
物理恢复就是把从数据库中备份的文件重新复制到原来的数据库中;
逻辑恢复就是把从数据库中导出的数据再导入原来的数据库。
三、物理备份和恢复数据库
3.1.对数据库进行脱机备份
脱机备份称为冷备份。首先,管理员身份的用户使用shutdown命令关闭数据库的服务,之后复制需要的文件,包括把数据文件和控制文件等相关的内容复制到其他磁盘的路径上。如果数据库出现问题,那么就可以把从数据库中复制出来的相关内容再复制回原来的数据库目录中。
3.2.对数据库进行联机备份
联机备份称为热备份,是在数据库的归档模式下进行的备份。查看数据库中日志的命令如下:archive log list

从示例的查询结果中可以看出,目前数据库的日志模式是非存放模式(No Archive Mode),同时自动存档方式也是禁用(Disabled)的。设置数据库日志模式为归档模式,使用下面的语句完成:
-- 步骤1:修改参数(仅写配置文件)
ALTER SYSTEM SET log_archive_start=TRUE SCOPE=SPFILE;(Oracle 10g+版本之后不需要对该参数log_archive_start进行指定)
-- 作用:将参数写入spfile,但**当前不生效**
-- 原因:SCOPE=SPFILE只修改文件,不修改内存
-- 步骤2:重启数据库
SHUTDOWN IMMEDIATE;
STARTUP MOUNT; -- 启动到mount状态(不打开数据库)
-- 原因:ARCHIVELOG模式只能在MOUNT状态下修改
-- 步骤3:开启归档模式
ALTER DATABASE ARCHIVELOG;
-- 作用:实际改变数据库运行模式
-- 此时:数据库已是归档模式,但自动归档还未生效
-- 步骤4:打开数据库
ALTER DATABASE OPEN;
-- 此时:log_archive_start参数从spfile加载到内存,自动归档生效
bash
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/19c/dbhome_1/dbs/arch
Oldest online log sequence 36
Current log sequence 38
SQL> alter system set log_archive_start=true scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 1073737800 bytes
Fixed Size 8904776 bytes
Variable Size 713031680 bytes
Database Buffers 343932928 bytes
Redo Buffers 7868416 bytes
Database mounted.
SQL>
SQL> alter database archivelog;
Database altered.
SQL> archivelog list;
SP2-0734: unknown command beginning "archivelog..." - rest of line ignored.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/19c/dbhome_1/dbs/arch
Oldest online log sequence 36
Next log sequence to archive 38
Current log sequence 38
SQL> alter database open;
Database altered.
更改完成后使用archive log list语句查看日志模式的状态,即可看到当前日志模式已经被修改为归档模式,并且自动存档方式已经启用。

把数据库设置成归档模式后,就可以进行数据库的备份与恢复操作了。
示例:备份表空间TS_NEWS_DATA
1)将数据库的状态设置为打开状态
将数据库的状态设置成打开状态,改变数据库的状态为open。具体的语句如下:
alter database open;
2)开始备份表空间
假设备份的表空间是TS_NEWS_DATA。命令如下:
alter tablespace TS_NEWS_DATA begin backup;

3)打开数据库中的oradata文件夹(一般数据库对象都存放在该文件夹中),把文件复制到磁盘中的另一个文件夹或其他磁盘上。

4)结束表空间的备份
在完成前面的操作之后,执行下面的命令结束备份:
alter tablespace TS_NEWS_DATA end backup;
此时就完成了表空间TEST的备份操作。具体操作效果如图

示例:恢复表空间中的数据文件
当数据库出现问题时,需要恢复表空间TS_NEWS_DATA。按照下面的步骤完成恢复表空间的操作:
1)对当前的日志进行归档,对当前使用的日志进行归档的命令如下:
alter system archive log current;

2)切换日志文件,由于在一个数据库中一般有3个日志文件,所以需要使用3次下面的语句来切换日志文件:
alter system switch logfile;

3)关闭数据库服务
这里为了模拟TS_NEWS_DATA表空间中的数据文件丢失,先把数据库关闭,然后删除TS_NEWS_DATA表空间中的数据文件ts_app_data01.dbf。关闭数据库的命令如下:
shutdown immediate;

4)删除数据文件并重新启动数据库
删除数据文件首先要找到存放数据文件的位置,默认情况下数据文件会存放在数据库的ORADATA文件夹中,也有在创建表空间添加数据文件时指定的目录。找到数据文件后直接将其删除即可
然后启动数据库。启动数据库的命令如下:
startup;
在使用startup命令启动数据库后,会出现图所示的错误提示界面:

启动后出现错误,从图中可以看到现在已经缺少了编号为5的数据文件,也可以通过查看数据字典v$recover_file确认缺少的数据文件,查看的结果如图所示:

图查询数据字典v$recover_file从查询的结果可以看到,丢失的数据文件编号确实是5
5)将数据文件设置成脱机状态并删除
在恢复数据文件之前需要先把数据文件设置成脱机状态(offline状态),并且删除该数据文件。具体命令如下:
alter database datafile 5 offline drop;

6)把数据库的状态设置成OPEN
在完成上述操作后,就可以为恢复数据库做好准备,把数据库的状态设置成OPEN。具体命令如下:
alter database open;

7)恢复数据文件
前提,将备份文件拷贝到之前的位置:

注意:在恢复数据库中的数据文件时,把数据库文件设置成脱机状态后,就需要把之前备份好的数据文件复制到原来的数据文件存放的位置,否则会出现图所示的错误。

在数据库的状态是OPEN时就可以开始恢复数据库了。恢复表空间TS_NEWS_DATA的数据文件命令如下:
recover datafile 5;
这里的编号5仍然是之前查看到的数据文件的编号,这也是需要注意的问题。在恢复时数据文件的编号要一致。恢复效果如图所示

这里我执行命令之后报错,排查下来是我修改过归档日志格式,系统自动识别不到,这里我们将文件格式修改为一致即可,不行的话,直接进行指定即可。

恢复效果
在使用上面的命令恢复数据文件时会出现指定日志的选项,这里直接输入AUTO或则直接进行指定即可,如指定也不行的话,建议直接修改文件名。

8)设置数据文件为联机状态
在恢复完数据库后还需要把数据文件设置成联机状态。具体的命令如下:
alter database datafile 5 online

至此,就完成了数据文件的恢复操作。为了验证数据文件是否恢复成功,可以重新启动数据库看一下效果。

四、逻辑备份和恢复数据库
逻辑备份数据库是数据库管理员使用最多的,逻辑备份除了在DOS下进行外,还可以在企业管理器的OEM中进行。
4.1.逻辑导出数据
导出数据可以使用EXP工具完成,也可以使用在Oracle 10g以后出现的EXPDP(数据泵)工具完成。
EXPDP是Oracle 10g开始引入的数据泵技术,数据泵技术是在数据库之间或者在数据库与操作系统之间传输数据的工具。EXPDP是数据泵导出的工具,它可以把数据库中的对象导出到操作系统中。使用EXPDP工具与EXP不同的是,在使用EXPDP时要先创建目录对象,通过这个对象就可以找到要备份数据的数据库服务器,并且使用EXPDP工具备份出来的数据必须存放在目录对象对应的操作系统的目录中。下面将分步讲解如何使用EXPDP导出数据。
前提:
如若没有SCOTT用户,则先进行用户创建
create user SCOTT identified by abcd;
grant CONNECT,RESOURCE,CREATE SEESION to SCOTT;
column grantee format a10;
column granted_role format a10;
select * from dba_role_privs where grantee='SCOTT';

连接SCOTT用户创建测试表和测试数据

-- 创建简单的测试表
CREATE TABLE test_data (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
create_time DATE DEFAULT SYSDATE,
value NUMBER(10,2)
);
-- 插入测试数据
INSERT INTO test_data (id, name, value) VALUES (1, '测试数据1', 100.50);
INSERT INTO test_data (id, name, value) VALUES (2, '测试数据2', 200.75);
INSERT INTO test_data (id, name, value) VALUES (3, '测试数据3', 300.25);

4.1.1.创建目录对象
创建目录对象是使用EXPDP工具进行导出的前提。创建目录对象的语法如下:
CREATE [OR REPLACE] DIRECTORY directory_name
AS 'operating_system_path'
ACCESS PARAMETERS
DEFAULT DIRECTORY
PRIVILEGES\]; 语法说明: 其中黑色加粗参数为必选参数 OR REPLACE:表示如果目录已存在,则进行替换 **directory_name:**目录对象的逻辑名称(数据库内标识) **operating_system_path:**操作系统实际路径(绝对路径) ACCESS PARAMETERS:用于外部表的访问参数 DEFAULT DIRECTORY:指定为默认目录 示例:创建指向 /u01/app/oracle/data 的目录对象 CREATE DIRECTORY data_pump_export_test AS '/u01/app/oracle/data';  #### 4.1.2.检查目录对象是否存在 SELECT \* FROM dba_directories WHERE directory_name = 'DATA_PUMP_EXPORT_TEST';  通过另外一个窗口可以看出,该目录没有立马被创建出来。  #### 4.1.3.给使用目录赋予用户权限 新创建的目录对象不是任何用户都可以使用的,只有拥有该目录使用权的用户才能使用,所以要为使用该目录的用户赋一个权限。假设备份数据库的用户是SCOTT,那么赋权限的语句如下: GRANT READ,WRITE ON DIRECTORY directory_name TO SCOTT 这里,directory_name就是创建的目录名称。 示例:给用户SCOTT赋权限 grant read,write on directory data_pump_export_test to SCOTT;  #### 4.1.4.操作系统目录权限 mkdir -p /u01/app/oracle/data chown oracle:dba /u01/app/oracle/data chmod 750 /u01/app/oracle/data  #### 4.1.5.导出表 前面已经创建好了目录,使用EXPDP工具在DOS的命令窗口中实现的。 语法: expdp \[用户名\]/\[密码\]@\[连接字符串
参数1=值1\] \[参数2=值2\] ... 参数说明: |-------------|------------|---------------------| | **参数** | **说明** | **示例** | | DIRECTORY | 转储文件目录对象 | DIRECTORY=dump_dir | | DUMPFILE | 转储文件名 | DUMPFILE=expdat.dmp | | LOGFILE | 日志文件名 | LOGFILE=expdat.log | | SCHEMAS | 导出一个或多个模式 | SCHEMAS=scott,hr | | TABLES | 导出一个或多个表 | TABLES=emp,dept | | TABLESPACES | 导出一个或多个表空间 | TABLES=emp,dept | | FULL | 全库导出 | FULL=YES | | PARALLEL | 并行度 | PARALLEL=4 | | COMPERSSION | 压缩 | COMPERSSION=ALL | | VERSION | 兼容版本 | VERSION=12 | 示例:使用EXPDP工具导出表test_data,命令如下: EXPDP scott/abcd DIRCETORY=data_pump_export_test DUMPFILE=expdp_test_temp.dmp TABLES=test_data 如果执行失败,极大可能是我们之前在创建用户SCOTT的时候没有分配表空间的使用配额,可以使用下边跟着下边的操作进行。 column username format a10 select username,default_tablespace,temporary_tablespace from dba_users where username='SCOTT'; ALTER USER scott QUOTA 500M ON USERS; select tablespace_name,bytes/1024/1024 MB,max_bytes/1024/1024 max_MB from dba_ts_quotas where username='SCOTT'; SQL> select username,default_tablespace,temporary_tablespace from dba_users where username='SCOTT'; USERNAME -------------------------------------------------------------------------------- DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ------------------------------ ------------------------------ SCOTT USERS TEMP SQL> ALTER USER scott QUOTA 500M ON USERS; User altered. SQL> column username format a10 SQL> select username,default_tablespace,temporary_tablespace from dba_users where username='SCOTT'; USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ---------- ------------------------------ ------------------------------ SCOTT USERS TEMP SQL> desc dba_users; Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME NOT NULL VARCHAR2(128) USER_ID NOT NULL NUMBER PASSWORD VARCHAR2(4000) ACCOUNT_STATUS NOT NULL VARCHAR2(32) LOCK_DATE DATE EXPIRY_DATE DATE DEFAULT_TABLESPACE NOT NULL VARCHAR2(30) TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30) LOCAL_TEMP_TABLESPACE VARCHAR2(30) CREATED NOT NULL DATE PROFILE NOT NULL VARCHAR2(128) INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(128) EXTERNAL_NAME VARCHAR2(4000) PASSWORD_VERSIONS VARCHAR2(17) EDITIONS_ENABLED VARCHAR2(1) AUTHENTICATION_TYPE VARCHAR2(8) PROXY_ONLY_CONNECT VARCHAR2(1) COMMON VARCHAR2(3) LAST_LOGIN TIMESTAMP(9) WITH TIME ZONE ORACLE_MAINTAINED VARCHAR2(1) INHERITED VARCHAR2(3) DEFAULT_COLLATION VARCHAR2(100) IMPLICIT VARCHAR2(3) ALL_SHARD VARCHAR2(3) PASSWORD_CHANGE_DATE DATE SQL> select tablespace_name,bytes/1024/1024 MB,max_bytes/1024/1024 max_MB from dba_ts_quotas where username='SCOTT'; TABLESPACE_NAME MB MAX_MB ------------------------------ ---------- ---------- USERS 0 500 SQL> 再次尝试执行语句:  成功导出! ### 4.2.逻辑导入数据 import data pump 逻辑导入数据是逻辑导出数据的逆过程,即通过IMPDP工具完成数据的导入工作。使用IMPDP导入数据的前提是数据是使用EMPDP导出的,同样也是在DOS窗口下直接输入IMPDP和登录数据库的用户名,即可导入数据。 使用IMPDP不指定目录时,系统会找到用户使用的目录对象,将目录对象中的内容全部导入数据库中。除了这种全部导入的方式,也可以根据需要把目录中某一个文件导入。 示例:使用IMPDP导入指定的表 在此之前,先将前边创建的表进行删除  具体导入方法如下: impdp scott/abcd directory=data_pump_export_test dumpfile=temp.dmp tables=test_data  再次查询表内容:  完全欧克,不仅可以导入表,还可以导入方案和表空间,后续进行补充。