[oracle@localhost ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
下面介绍的是冷备份(完全脱机备份),部分脱机备份,部分联机备份,对于RMAN和逻辑备份(exp,imp|expdp,impdp)后面的篇幅会涉及。
完全脱机备份:(归档和非归档都适用,针对整个数据库备份)
这个不用多说了,http://blog.itpub.net/29876893/viewspace-1607155/这篇说的很清楚
但是这种备份很有很多缺点:
1.要shutdown之后才可以,生产库是绝对不允许的
2.需要通过操作系统命令拷贝,这个对于很大的文件,很影响数据库性能,有时候不是一般的慢!
3.如果数据库的存储采取ASM,不可以直接拷贝,我们看不到文件系统的分区。
部分脱机备份:(针对表空间)
我们可以改变表空间的offline,online(需要归档)
SQL> select username,default_tablespace from dba_users where username='HR';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
HR USERS
SQL> alter tablespace users offline;
表空间已更改。
此时拷贝走users下的数据文件就行了。
SQL> select file_id,tablespace_name,online_status from dba_data_files where tablespace_name='USERS';
FILE_ID TABLESPACE_NAME ONLINE_
---------- ------------------------------ -------
4 USERS OFFLINE
此时把users online:
SQL> alter tablespace users online;
表空间已更改。
当然你也可以直接把数据文件离线:
SQL> alter database datafile 4 offline;
数据库已更改。
SQL> truncate table tt;
表被截断。
SQL> insert into tt values(1,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into tt values(2,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into tt values(3,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ --------------
1 1 439 52428800 512 1 YES ACTIVE 7312260 28-4月 -15 7312279 28-4月 -15
2 1 440 52428800 512 1 NO CURRENT 7312279 28-4月 -15 2.8147E+14
3 1 438 52428800 512 1 YES ACTIVE 7312248 28-4月 -15 7312260 28-4月 -15
此时我们删除表空间user里的数据文件
此时只能启动到mount.
具体怎么恢复参考
http://blog.itpub.net/29876893/viewspace-1607155/
可以先不恢复,把表空间离线,打开数据库,后恢复。
该种备份比较好的是不用shutdown备份表空间,但是我们不能离线system,undo,redo,temp表空间,很大的遗憾:
SQL> alter tablespace system offline;
alter tablespace system offline
*
第 1 行出现错误:
ORA-01541: 系统表空间无法脱机; 如有必要请关闭
注意是不能离线当前undo表空间!
SQL> alter tablespace UNDOTBS1 offline;
alter tablespace UNDOTBS1 offline
*
第 1 行出现错误:
ORA-30042: 无法使还原表空间脱机
如果不是当前使用的undo表空间:
SQL> alter tablespace UNDO_W online;
表空间已更改。
这种方式的缺点还有:
2.需要通过操作系统命令拷贝,这个对于很大的文件,很影响数据库性能,有时候不是一般的慢!
3.如果数据库的存储采取ASM,不可以直接拷贝,我们看不到文件系统的分区。
部分联机备份:这种方式的备份适用于归档模式。
oracle做了很大的改进,在联机状态就可以备份:
如:
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------
1 NOT ACTIVE 0
2 NOT ACTIVE 0
3 NOT ACTIVE 0
5 NOT ACTIVE 0
6 NOT ACTIVE 0
7 NOT ACTIVE 0
8 NOT ACTIVE 0
9 NOT ACTIVE 0
11 NOT ACTIVE 0
12 NOT ACTIVE 0
已选择10行。
此时这些文件都不是活动状态
SQL> alter tablespace CHAO begin backup;
表空间已更改。
SQL> alter tablespace SYSTEM begin backup;
表空间已更改。
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------
1 ACTIVE 7420181 29-4月 -15
2 NOT ACTIVE 0
3 NOT ACTIVE 0
5 NOT ACTIVE 0
6 NOT ACTIVE 0
7 ACTIVE 7420021 29-4月 -15
8 NOT ACTIVE 0
9 NOT ACTIVE 0
11 NOT ACTIVE 0
12 NOT ACTIVE 0
已选择10行。
此时一号和七号文件处于活动的状态,并且记录此时SCN,作为下一次恢复的起点!
备份就是直接拷走备份的数据文件。
关闭数据文件7的活动状态:
SQL> alter tablespace CHAO end backup;
表空间已更改。
SQL> select * from v$backup where file#=7;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------
7 NOT ACTIVE 7420021 29-4月 -15
如果要完全备份,这样操作是不是能把人搞疯!
SQL> alter database begin backup;
alter database begin backup
*
第 1 行出现错误:
ORA-01146: 无法启动联机备份 - 文件 1 已在备份中 ORA-01110:
数据文件 1: '/u01/app/oracle/oradata/orcl3939/system01.dbf'
SQL> alter tablespace system end backup;
表空间已更改。
这个地方感觉不是太爽!需要关闭之前的热状态!
SQL> alter database begin backup;
数据库已更改。
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------
1 ACTIVE 7420464 29-4月 -15
2 ACTIVE 7420464 29-4月 -15
3 ACTIVE 7420464 29-4月 -15
5 ACTIVE 7420464 29-4月 -15
6 ACTIVE 7420464 29-4月 -15
7 ACTIVE 7420464 29-4月 -15
8 ACTIVE 7420464 29-4月 -15
9 ACTIVE 7420464 29-4月 -15
11 ACTIVE 7420464 29-4月 -15
12 ACTIVE 7420464 29-4月 -15
已选择10行。
结束备份的话直接alter database end backup;
这种备份的缺点:
1.会产生大量的redo log,是什么原因呢?
SQL> show parameter db_block_size
db_block_size integer 8192
[oracle@localhost ~]$ dumpe2fs /dev/sda1
bash: dumpe2fs: command not found
[oracle@localhost ~]$ su - root
口令:
[root@localhost ~]# dumpe2fs /dev/sda1
Block size: 1024
SQL> select 8*1024/1024 from dual;
8*1024/1024
-----------
8
8个操作系统块构成了一个数据块:
此时用os命令拷贝这个块,读取是按照os块读取,但是此时oracle一个事务正在修改这个块。最终 我们恢复时,oracle识别不了这个块
!
oracle为了解决这个问题,只要在热备份状态下的块,操作这个数据块
都会以日志方式记录下来,所以操作一个块会多8k日志量。
大概简述模拟这个过程:
select * from v$statname where name like '%redo%';
统计了很多关于redo的信息,里面有redo size.
SQL> select * from v$sesstat where sid=159;
SQL> select * from v$sesstat where statistic#=169 and sid=159;
可以插入一条数据,然后看产生多少日志(大概估计)。
然后执行表空间热备份下:
看下日志量
然后插入相同数据,查看日志量
感兴趣可以自行模拟。