程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> 幾種backup小結

幾種backup小結

編輯:SyBase教程

幾種backup小結


[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;

可以插入一條數據,然後看產生多少日志(大概估計)。
然後執行表空間熱備份下:
看下日志量
然後插入相同數據,查看日志量
感興趣可以自行模擬。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved