Oracle教程:用户可管理的备份


SQL>host 操作系统命令;在sql*plus执行操作系统命令。
用户管理的备份
全备:
数据文件、控制文件、redo log或归档文件(可选)、参数文件、口令文件

得到数据库文件信息以待备份
v$datafile
select name,status from v$datafile;
v$controlfile
select name from v$controlfile;
v$logfile
select member from v$logfile;
DBA_DATA_FILES
select file_name,tablespace_name from dba_data_files;

查询数据文件对应的表空间
select t.name tablespace, f.name datafile
from v$tablespace t,v$datafile f
where t.ts# = f.ts#
order by t.name;

非归档模式只能冷备(关闭数据库备份),归档模式可冷备和热备。

冷备脚本(linux下)
set feedback off heading off verify off trimspool off
set pagesize 0 linesize 200
define dir='/tmp/wb'
define ws='/tmp/ws.sql'
spool &ws
select '! cp' || name || '&dir' from v$datafile order by 1;//order by 1:按第一个列排序
select '! cp' || member || '&dir' from v$logfile order by 1;
select '! cp' || name || '&dir' from v$controlfile order by 1;
select '! cp' || name || '&dir' from v$tempfile order by 1;
spool off
shutdown immediate
@&ws
startup

热备:
数据文件、控制文件、归档文件、参数文件、口令文件

热备表空间三部曲
一、alter tablespace xxwz begin backup;
二、备份表空间对应的数据文件
三、alter tablespace xxwz end backup;
最好还备份归档文件和控制文件。

alter tablespace xxwz begin backup语句做了3件事
1.表空间被checkpoint
2.这个表空间对应的数据文件的头的SCN停止增长
3.改变的数据块整个都会被写入redo log

SQL>select dbms_rowid.rowid_block_number(rowid) blk,name from bbk;使用PL/SQL查看记录的块位置;
$ dd if=example.dbf ibs=8192 skip=1011 count=2 | string;用指定大小的块拷贝一个文件。

v$backup查询备份状态

热备表空间时突然断电,数据库只能启动到mount状态,用v$backup查询备份状态,end正在备份的表空间。alter database datafile 'xxx.dbf' end backup或者alter database end backup。

只读表空间的备份
alter tablespace xxx read only;设为只读,此时控制文件被改变
备份数据文件和控制文件;

热备控制文件的备份(控制文件改变时)
alter database backup controlfile to 'D:/xxxx.ctl';

alter database backup controlfile to trace as 'd:/xxx.sql';会丢失一些信息

使用DBVERIFY检查备份文件是否损坏
dbv file=xxwz_data.dbf feedback=100 //检测数据文件
检测表的损坏
先用select segment_name,tablespace_id,header_file,header_block from sys_dba_segs where segment_name like '%FRUIT%'; FRUIT为表名,要大写
再用dbv userid=sys/sys segment_id=4.3.395 //4为tablespace_id,3为,header_file,395为header_block。

相关内容