ORACLE的文件管理(RMAN的备份与恢复)
以下模拟丢失与RMAN恢复操作在实验环境操作
一、RMAN备份
1、RMAN参数设置
(1)、configure retention policy to...,配置保留备份策略
configure retention policy to redundancy n,保留最新的n份备份,不是最新的n份被标记为redundancy
configure retention policy to recover window of n days,保留最近n天的备份,不是最近n天内的被标记为obsolete
configure retention policy clear,还原默认值
(2)、configure backup of optimization off,数据文件scn无变化,之前备份过,本次可以不备份
(3)、configure default device type to disk|sbt,默认备份到磁盘或磁带
(4)、configure controlfile autobackup off,控制文件自动备份功能关闭
(5)、configure controlfile autobackup format for device type disk to '%F',配置控制文件的备份路径与备份格式
(6)、configure device type disk parallelism n,配置数据库设备类型的并行度
configure device type disk clear,还原默认值
(7)、configure datafile backup copies for device type disk to,n,配置数据库每次备份的copy数量,每一次备份都有可以有多份完全相同的拷贝
(8)、configure archivelog backup copies for device type disk to n,配置数据库的归档日志的存放设备类型
(9)、configure maxsize to unlimited,
2、RMAN创建备份
rman target /;
backup spfile; //备份参数文件 list backup of spfile; //输出参数文件信息 backup current controlfile; //备份正在使用的控制文件,文件必须处于归档模式 list backup of controlfile; //输出控制文件信息 backup tablespace users; //备份表空间 backup datafile 4,5; //备份数据文件 backup database; //备份所有的数据文件,控制文件,日志文件和参数文件 backup database format '...%U....'; //将数据库备份到指定路径 backup archivelog all; backup atchivelog all delete input; //归档日志备份到备份路径后把已经备份的归档日志从归档路径删除 backup database plus archivelog; //备份所有的数据文件,控制文件,日志文件和参数文件,加上归档日志 backup incremental level 0|1|2|3|4 database|datafile<>|tablespace <>; //差异增量,备份上次增量级别以来变化的数据。0必须存在才能差异或累积
查看备份进度
select sid,serial#,opname,context,sofar,totalwork,round(sofar/totalwork*100,2) complete from v$session_longops where opname like 'RMAN%' and sofar<>totalwork;
show parameter diag; //显示自我诊断路径 show parameter db_unique_name;
实例的诊断日志常规存放路径是在$ORACLE_BASE/diag/rdbms/db_unique_name/sid
3、命令
restore命令:从备份中还原数据库文件
recover命令:通过应用重做日志文件中记录的更改来恢复已还原文件
4、自我诊断(在11g之后的版本存在)
使用这三条命令后省略一系列操作。
list failure; advise failure; //必须处于mount以上阶段 repair failure;
系统表空间、undo表空间在mount阶段,其他数据文件可以在open阶段,即可联机。
二、密码文件管理
远程登录需要有密码文件,且remote_login_passwordfile为exclusive或shared。
select * from v$pwfile_users; //有输出说明有密码文件 $ORACLE_HOME/dbs/orapw$ORACLE_SID; //linux下存放的位置 //文件丢失后,可直接生成一个密码文件来恢复 rm $ORACLE_HOME/dbs/orapw$ORACLE_SID; orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=xxx; //生成一个密码文件
三、参数文件管理
参数文件主要用来记录数据库的配置,在instance的启动阶段读取参数文件,根据这些参数来配置数据库
1、参数文件的分类
pfile是文本文件,静态参数文件,可以通过编辑器修改。命名为init<$ORACLE_SID>.ora,可以不放在database server上
spfile是二进制文件,动态参数文件,不可以通过编辑器修改。命名为spfile<$ORACLE_SID>.ora,必须挡在database server上
//pfile与spfile相互转换 create pfile from spfile; create spfile from pfile; create pfile='/tmp/a.ora' from spfile; //通过spfile创建pfile文件,且定义pfile文件路径 show parameter spfile; //查看参数文件位置
2、修改spfile文件的方法
alter system set 参数=值 [scope=memory|spfile|both]
scope=memory:参数修改后立刻生效,但不修改spfile
scope=spfile:修改spfile文件,重启后生效
scope=both:前两种都满足
desc v$parameter; select name,isses_modifiable,isinstance_modifiable,issys_modifiable from v$parameter //isses表示session级别修改参数,即是否可以通过alter session set 修改值 //issys表示system级别修改参数,即是否可以通过alter system set更改值 //输出值为false时不可以更改,但是可以在后面加上scope=spfile来修改
四、控制文件管理
1、控制文件实现多路存放
select * from v$controlfile; //查看数据库的控制文件 show parameter control_files; //现有oradata下control01.ctl和control02.ctl,为实现多路径存放控制文件,将control01保存到fast_recovery_area下的control03.ctl alter system set control_files='/u01/oracle/oradata/cmh/control01.ctl','/u01/oracle/oradata/cmh/control02.ctl','/u01/oracle/fast_recovery_area/cmh/control03.ctl' scope=spfile shutdown; //关闭数据库 cp /u01/oracle/oradata/cmh/control01.ctl /u01/oracle/fast_recovery_area/cmh/control03.ctl //在操作系统层面复制控制文件 startup; //重启数据库 show parameter control_files; //看到control03.ctl已存在
2、控制文件内容详解
alter database backup controlfile to trace as '/tmp/c.sql' reuse; //将控制文件转为文本文件 vi /tmp/c.sql; //控制文件有两段,NORESETLOGS case和RESETLOGS case :set nu; //设置行号 /Set #1; //找到有Set #1的行,在37行,Set #1. NORESETLOGS case /Set #2; //找到有Set #2的行,在94行,Set #2. RESETLOGS case cp /tmp/c.sql /tmp/noReset.sql /tmp/Reset.sql
(1)、注释
Below are two sets of SQL statements, each of which creates a new control file and uses it to open the database. The first set opens the database with the NORESETLOGS option and should be used only if the current versions of all online logs are available. The second set opens the database with the RESETLOGS option and should be used if online logs are unavailable.
以下是两组SQL语句,每组SQL都创建一个新的控制文件并使用它打开数据库;如果所有在线日志的当前版本可用时使用NORESETLOGS方式,如果在线日志不可用使用RESETLOGS方式。
(2)、noresetlogs版本
vi /tmp/noReset.sql
:94,$d; //在noresetlogs中将94行至最后一行删除 sed '/^--/d' /tmp/noReset.sql >/tmp/noReset1.sql; //删除注释行 sed '/^$/d' /tmp/noReset1.sql >/tmp/noReset.sql; //删除空行 //得到以下的控制文件内容 STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE 'CMH' NORESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/oracle/oradata/cmh/redo1.log' SIZE 50M BLOCKSIZE 512, GROUP 1 '/u01/oracle/oradata/cmh/redo2.log' SIZE 50M BLOCKSIZE 512, GROUP 1 '/u01/oracle/oradata/cmh/redo3.log' SIZE 50M BLOCKSIZE 512 DATAFILE '/u01/oracle/oradata/cmh/system01.dbf', '/u01/oracle/oradata/cmh/sysaux01.dbf', '/u01/oracle/oradata/cmh/undotbs01.dbf', '/u01/oracle/oradata/cmh/users01.dbf', '/u01/oracle/oradata/cmh/example01.dbf' CHARACTER SET AL32UTF8 ; RECOVER DATABASE ALTER SYSTEM ARCHIVE LOG ALL; ALTER DATABASE OPEN; ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/oradata/cmh/temp01.dbf' REUSE;
(3)、resetlogs版本
vi /tmp/Reset.sql :1,93d; //删除1至93行 sed '/^--/d' /tmp/Reset.sql >/tmp/Reset1.sql; //删除注释行 sed '/^$/d' /tmp/Reset1.sql >/tmp/Reset.sql; //删除空行 //得到以下的控制文件内容 STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE 'CMH' RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 '/u01/oracle/oradata/cmh/redo1.log' SIZE 50M BLOCKSIZE 512, GROUP 1 '/u01/oracle/oradata/cmh/redo2.log' SIZE 50M BLOCKSIZE 512, GROUP 1 '/u01/oracle/oradata/cmh/redo3.log' SIZE 50M BLOCKSIZE 512 DATAFILE '/u01/oracle/oradata/cmh/system01.dbf', '/u01/oracle/oradata/cmh/sysaux01.dbf', '/u01/oracle/oradata/cmh/undotbs01.dbf', '/u01/oracle/oradata/cmh/users01.dbf', '/u01/oracle/oradata/cmh/example01.dbf' CHARACTER SET AL32UTF8 ; RECOVER DATABASE USING BACKUP CONTROLFILE ALTER DATABASE OPEN RESETLOGS; ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oracle/oradata/cmh/temp01.dbf' REUSE;
3、模拟控制文件丢失与恢复
(1)、部分丢失(其中一个文件被删除),只需复制备份的即可
ho rm /u01/oracle/oradata/cmh/control01.ctl; shutdown immediate; //控制文件删除之后这样关闭会出错,只能用abort shutdown abort; startup; //这样启动也会出错,会显示没有控制文件 ho cp /u01/oracle/fast_recovery_area/cmh/control3.ctl /u01/oracle/oradata/cmh/control01.ctl; //从恢复区复制控制文件 alter database mount; alter database open;
(2)、全部丢失,要先有备份才能恢复
//在操作系统层面打开RMAN,并进行备份 rman target / backup current controlfile; list backup of controlfile; //显示控制文件的备份位置 exit; //删除所有控制文件 rm /u01/oracle/oradata/cmh/control0*; rm /u01/oracle/fast_recovery_area/cmh/control0*; shutdown abort; ls /u01/oracle/fast_recovery_area/CMH/backupset/2022_05_16/ol_mf_ncnnf_TAG20110516T091516_k839f59j_.bkp //备份文件位置 rman target /; restore controlfile from '/u01/oracle/fast_recovery_area/WYZC/backupset/2022_05_16/ol_mf_ncnnf_TAG20110516T091516_k839f59j_.bkp'; //恢复成功后面会出现Finished ...,否则会出现RMAN-... alter databse mount; recover database; //恢复数据 alter database open resetlogs; //如果没有这一步alter database open会出现must use resetlogs or....
五、数据文件管理
1、数据文件信息
select tablespace_name,file_id,file_name,status from dba_data_files; //数据文件信息
2、undo文件丢失与恢复(系统关键数据文件undo、system)
undo数据是数据修改前的备份,保证回滚操作。system数据文件、undo_tablespace参数后的表空间恢复必须关闭数据库。
ho rm /u01/oracle/oradata/cmh/undotbs01.dbf; //这时候还可以执行DML操作,因为缓存存在 alter system flush shared_pool; //清理shared_pool里缓存的所有数据,生产系统谨慎使用 alter system flush buffer_cache; //清理buffer_cache alter system flush global context; //清理连接通信信息 conn scott/tiger; //连接用户,出现undo文件出错 //在rman执行 shutdown abort; startup mount; restore datafile 3; recover database; alter database open;
3、用户数据文件丢失与恢复(系统非关键数据文件)
非system、undo_tablespace参数后的表空间可以脱机恢复
ho rm /u01/oracle/oradata/cmh/users01.dbf; //删除用户数据文件 select * from salgrade; //查询表出现数据文件缺失错误 //在rman执行 run{ sql 'alter database datafile 5 offline'; restore datafile 5; recover datafile 5; sql 'alter database datafile 5 online'; }
如果关键数据文件和非关键数据文件同时丢失,按照关键数据文件恢复方法。
4、数据文件从一个路径迁移到新路径
//rman执行,必须处于归档模式 run{ sql 'alter tablespace users offline immediate'; set newname for datafile 4 to '/u01/oracle/fast_recovery_area/wyzc/users01.dbf'; restore datafile 4; switch datafile all; recover datafile 4; sql 'alter tablespace users online'; } alter database move datafile 4 to '/u01/oracle/oradata/wyzc/new.dbf'; //12c版本,路径一定要有权限
5、执行不完全恢复
select group#,member,a.status from v$log a join v$logfile using(group#); //查找正在使用的日志组 desc dbms_logmnr; //查看日志挖掘存储过程 exec dbms_logmnr.add_logfile('/u01/oracle/oradata/cmh/redo02.log'); exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); desc v$logmnr_contents; select scn,to_char(timestamp,'yyyy-mm-dd'),sql_redo from v$logmnr_contents where table_name='EMP' //使用这个语句之前必须要执行dbms_logmnr.start_logmnr() exec dbms_logmnr.end_logmnr; //查出scn号,在rman执行一下操作 shutdown immediate; startup mount; run{ set until scn 1343185; --set until time to_data('2022-05-25 10:17:49'); restore database; recover database; alter database open resetlogs; }
六、日志文件管理
1、日志文件丢失时不同状态的处理情况
(1)、unused或inactive
alter database clear logfile group <>,直接清理unused或inactive状态的日志组。
(2)active
alter system checkpoint,触发ckpt,使其状态从active变成inactive
alter database clear logfile group <>,清理日志组。
(3)current
alter system switch logfile,归档日志文件,使其从current状态变成active
alter system checkpoint,触发ckpt,使其从active状态变成inactive
alter database clear logfile group <>,清理日志组。
2、日志组增加成员并多路存放
select group#,members,a.status,member from v$log a join v$logfile using(group#); //查看日志组成员状态信息,current表示正在使用该组日志。如果状态是current或active不允许被删除。 alter database add logfile member '/u01/oracle/fast_recovery_area/cmh/redo1.log' to group 1,'/u01/oracle/fast_recovery_area/cmh/redo2.log' to group 2,'/u01/oracle/fast_recovery_area/cmh/redo3.log' to group 3 //向每个日志组添加成员且分开存放 alter system switch logfile; //切换日志组 alter system switch logfile current; //等归档完再切换,归档是对日志文件的备份 archive log list; //查看归档模式,Database log mode=Archive Mode说明是归档模式 alter database archivelog; //将数据库设置为归档模式,但是会出现database must be mounted in this instance and not open in any instance,说明数据库需要处于mount,但不是open状态 shutdown; //关闭数据库 startup mount; //启动到mount阶段 alter database archivelog; show parameter db_recovery; //查看数据库备用路径,方便恢复
3、日志文件的丢失与恢复
select group#,members,a.status,member from v$log a join v$logfile using(group#); //查看日志组信息 //inactive状态的日志丢失,如第一组 ho rm /u01/oracle/oradata/cmh/redo01.log; //模拟丢失 ho ls /u01/oracle/oradata/cmh/redo01.log; //查看文件是否存在 alter database clear logfile group 1; //inactive的日志组丢失直接clear alter system switch logfile; //切换日志组 //active状态的日志丢失,如第二组 ho rm /u01/oracle/oradata/cmh/redo02.log; //模拟丢失 alter system checkpoint; //只有inactive状态的日志才能clear,active状态的日志先触发ckpt变成inactive状态再clear alter database clear logfile group 2; //current状态的日志丢失 ho rm /u01/oracle/oradata/cmh/redo01.log; //模拟丢失 //查看unused、inactive日志是否丢失,如果没有则进行切换日志组 alter system switch logfile; alter system checkpoint; alter database clear logfile group 1; //如果切换日志不成功则在前面加上unarchived,alter database clear unarchived logfile group 1; alter system switch logfile; //循环切换日志组
七、归档日志文件管理
1、归档日志文件
恢复控制文件时"recover database"需要归档日志文件。
archive log list; //查看数据库是否处于归档模式,Database log mode=Archive Mode表示处于归档模式;Database log mode=No Archive Mode表示不处于归档模式 shutdown immediate; //关闭数据库,启动到mount阶段 startup mount; alter database archivelog; //打开归档模式 alter database noarchivelog; //关闭归档模式 alter database open; //打开数据库 show parameter log_archive_max_processes; //查看归档进程数
八、临时文件管理
select name from v$tempfile; //临时数据文件 select distinct temporary_tablespace from dba_users; //查看使用的临时表空间 select file_name from dba_temp_files where tablespace_name='TEMP' ; //查看使用的临时数据文件 //模拟临时数据文件丢失 ho rm /u01/oracle/oradata/cmh/temp01.dbf; alter tablespace temp rename to tempold; create temporary tablespace temp tempfile 'u01/oracle/oradata/cmh/temp01.dbf' size 100M autoextend on uniform size 1m; alter database default temporary tablespace temp; drop tablespace tempold;
九、索引文件管理
create tablespace ind datafile '/u01/oracle/oradata/cmh/dbf' size 10m; conn scott/tiger; create index emp_ename_i on emp(ename) tablespace ind; //建立索引,使用ind表空间 ho rm /u01/oracle/oradata/cmh/dbf; //删除表空间 conn / as sysdba; alter system switch logfile; //切换三次日志文件 conn / as sysdba; startup; //显示缺失数据文件 alter database datafile 6 offline drop; alter database open; conn scott/tiger; insert into emp(empno,ename) values(11,'A11'); //插入数据显示没有数据文件 select index_name,status from user_indexes where table_name='TMP'; select dbms_metadata,get_ddl('INDEX','EMP_ENAME_I') from dual; //查看创建索引的语句 drop index emp_ename_i; //删除索引 create index emp_ename_i on emp(ename) tablespace users; insert into emp(empno,ename) values(11,'A11'); //插入数据成功 conn / as sysdba; drop tablespace ind; //适合表空间只存放索引的情况
十、数据块管理
1、查看表的块信息
desc dba_segments; //数据库中所有段分配的存储 owner //段所有者的用户名 segment_name //段的名称 header_file //包含段标题的文件ID header_block //包含段标题的块ID blocks //段的大小,以oracle块为单位 select owner,segment_name,header_file,header_block,blocks from dba_segments where owner='SCOTT'; select distinct dbms_rowid.rowid_block_number(rowid) from scott.emp; //rowid在[header_block,header_block+blocks-1]范围里,在第151块
2、模拟破坏数据库块
backup database; //在破坏数据库时要先备份数据库 dd if=/dev/zero of=/u01/oracle/oradata/cmh/users01.dbf bs=8192 conv=notrunc seek=151 count=1; //模拟丢失
3、检查数据块是否损坏
//dbv方法 dbv file=/u01/oracle/oradata/cmh/users01.dbf blocksize=8192; //使用dbverify工具检测数据块的物理错误,这个命令在操作系统层面执行 //Page 151 is marked corrupt表示151数据块已损坏 //rman方法 rman target /; backup validate database; //验证所有文件,包括数据文件、参数文件、控制文件,RMAN生成一个trace信息,描述坏块信息 select * from v$database_block_corruption; //查看backup操作发现的损坏,执行上一语句才会有信息 recover corruption list; //恢复损坏的列表
参考文件:检测数据块损坏