)
目录一、什么是数据库备份二、什么是数据库恢复三、物理备份和恢复数据库手动3.1.对数据库进行脱机备份3.2.对数据库进行联机备份示例备份表空间TS_NEWS_DATA1将数据库的状态设置为打开状态2开始备份表空间3打开数据库中的oradata文件夹一般数据库对象都存放在该文件夹中把文件复制到磁盘中的另一个文件夹或其他磁盘上。4结束表空间的备份示例恢复表空间中的数据文件1对当前的日志进行归档对当前使用的日志进行归档的命令如下2切换日志文件由于在一个数据库中一般有3个日志文件所以需要使用3次下面的语句来切换日志文件3关闭数据库服务4删除数据文件并重新启动数据库5将数据文件设置成脱机状态并删除6把数据库的状态设置成OPEN7恢复数据文件8设置数据文件为联机状态四、逻辑备份和恢复数据库数据泵4.1.逻辑导出数据4.1.1.创建目录对象4.1.2.检查目录对象是否存在4.1.3.给使用目录赋予用户权限4.1.4.操作系统目录权限4.1.5.导出表4.2.逻辑导入数据4.2.1.执行导入操作4.2.2.测试验证备份是保存数据库的副本恢复就是把以前从数据库中备份的文件还原到数据库中。对数据库进行备份和恢复是确保数据库中数据安全的一个关键技术。一、什么是数据库备份数据库备份就是将数据库的内容全部复制出来保存到计算机的另一个位置或者其他存储设备上。数据库备份也分很多种主要有物理备份和逻辑备份。物理备份是指通常所说的归档模式备份又叫热备份和非归档模式备份又叫冷备份归档模式备份是当数据库的模式设置成归档模式时对数据库进行的备份而非归档模式备份是当数据库的模式设置成非归档模式时对数据库的备份。逻辑备份主要是指对数据库的导入和导出也称为迁移操作在Oracle 10g之前使用IMP/EMP的方式进行导入和导出操作从Oracle 10g开始引入了数据泵技术使用EXPDP/IMPDP的方式对数据进行导入和导出的操作。数据泵Data Pump导入import导出export二、什么是数据库恢复数据库恢复就是把从数据库中备份出来的数据重新还原给原来或其它的数据库数据库的恢复技术分为完全恢复和不完全恢复两种。完全恢复是指把数据库恢复到数据库失败时的数据库状态不完全恢复是指将数据库恢复到数据库失败前的某一时刻的数据库状态。数据库备份分物理备份RMAN和手动备份和逻辑备份数据泵数据库恢复自然也分物理恢复和逻辑恢复物理恢复就是把从数据库中备份的文件重新复制到原来的数据库中逻辑恢复就是把从数据库中导出的数据再导入原来的数据库。三、物理备份和恢复数据库手动3.1.对数据库进行脱机备份脱机备份称为冷备份。首先管理员身份的用户使用shutdown命令关闭数据库的服务之后复制需要的文件包括把数据文件和控制文件等相关的内容复制到其他磁盘的路径上。如果数据库出现问题那么就可以把从数据库中复制出来的相关内容再复制回原来的数据库目录中。3.2.对数据库进行联机备份联机备份称为热备份是在数据库的归档模式下进行的备份。查看数据库中日志的命令如下archive log list从示例的查询结果中可以看出目前数据库的日志模式是非存放模式No Archive Mode同时自动存档方式也是禁用Disabled的。设置数据库日志模式为归档模式。使用下面的语句完成--步骤1修改参数仅写配置文件ALTER SYSTEM SET log_archive_startTRUE SCOPESPFILE;Oracle 10g版本之后不需要对该参数log_archive_start进行指定-- 作用将参数写入spfile但**当前不生效**-- 原因SCOPESPFILE只修改文件不修改内存--步骤2重启数据库SHUTDOWN IMMEDIATE;STARTUP MOUNT; -- 启动到mount状态不打开数据库-- 原因ARCHIVELOG模式只能在MOUNT状态下修改--步骤3开启归档模式ALTER DATABASE ARCHIVELOG;-- 作用实际改变数据库运行模式-- 此时数据库已是归档模式但自动归档还未生效--步骤4打开数据库ALTER DATABASE OPEN;-- 此时log_archive_start参数从spfile加载到内存自动归档生效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_starttrue scopespfile; 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_DATA1将数据库的状态设置为打开状态将数据库的状态设置成打开状态改变数据库的状态为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 immediate4删除数据文件并重新启动数据库删除数据文件首先要找到存放数据文件的位置默认情况下数据文件会存放在数据库的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下进行外还可以在Oracle的企业管理器的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 granteeSCOTT;连接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_nameAS 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/datachown oracle:dba /u01/app/oracle/datachmod 750 /u01/app/oracle/data4.1.5.导出表前面已经创建好了目录使用EXPDP工具在DOS的命令窗口中实现的。语法expdp [用户名]/[密码][连接字符串][参数1值1] [参数2值2] ...参数说明参数说明示例DIRECTORY转储文件目录对象DIRECTORYdump_dirDUMPFILE转储文件名DUMPFILEexpdat.dmpLOGFILE日志文件名LOGFILEexpdat.logSCHEMAS导出一个或多个模式SCHEMASscott,hrTABLES导出一个或多个表TABLESemp,deptTABLESPACES导出一个或多个表空间TABLESemp,deptFULL全库导出FULLYESPARALLEL并行度PARALLEL4COMPERSSION压缩COMPERSSIONALLVERSION兼容版本VERSION12示例使用EXPDP工具导出表test_data命令如下EXPDP scott/abcd DIRCETORYdata_pump_export_test DUMPFILEexpdp_test_temp.dmp TABLEStest_data如果执行失败极大可能是我们之前在创建用户SCOTT的时候没有分配表空间的使用配额可以使用下边跟着下边的操作进行。column username format a10select username,default_tablespace,temporary_tablespace from dba_users where usernameSCOTT;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 usernameSCOTT;SQL select username,default_tablespace,temporary_tablespace from dba_users where usernameSCOTT; 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 usernameSCOTT; 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 usernameSCOTT; TABLESPACE_NAME MB MAX_MB ------------------------------ ---------- ---------- USERS 0 500 SQL再次尝试执行语句成功导出4.2.逻辑导入数据import data pump逻辑导入数据是逻辑导出数据的逆过程即通过IMPDP工具完成数据的导入工作。使用IMPDP导入数据的前提是数据是使用EMPDP导出的同样也是在DOS窗口下直接输入IMPDP和登录数据库的用户名即可导入数据。使用IMPDP不指定目录时系统会找到用户使用的目录对象将目录对象中的内容全部导入数据库中。除了这种全部导入的方式也可以根据需要把目录中某一个文件导入。4.2.1.执行导入操作示例使用IMPDP导入指定的表在此之前先将前边创建的表进行删除具体导入方法如下impdp scott/abcd directorydata_pump_export_test dumpfiletemp.dmp tablestest_data4.2.2.测试验证再次查询表内容完全欧克不仅可以导入表还可以导入用户、表空间以及PDB插拔式数据库后续在其它文章中进行补充。