脫機冷備
冷備份發(fā)生在數(shù)據(jù)庫已經(jīng)正常關(guān)閉的情況下
拷貝文件,假如數(shù)據(jù)庫文件都在目錄A城榛,拷貝這些數(shù)據(jù)庫文件到其他目錄比如目錄B揪利,如果要恢復(fù),則也是在數(shù)據(jù)庫shutdown的狀態(tài)下狠持,把這些文件從目錄B拷回目錄A疟位,再startup數(shù)據(jù)庫
--找出所有的控制文件
SQL> select name from v$controlfile;
--找出所有的數(shù)據(jù)文件和臨時文件
SQL> select file_name from dba_data_files;
SQL> select file_name from dba_temp_files;
--找出所有的redo log文件
SQL> select MEMBER from v$logfile;
用戶管理的備份與恢復(fù)也稱OS物理備份,是指通過數(shù)據(jù)庫命令設(shè)置數(shù)據(jù)庫為備份狀態(tài)喘垂,然后用操作系統(tǒng)命令甜刻,拷貝需要備份或恢復(fù)的文件绍撞。生產(chǎn)環(huán)境中使用的場景并不多,主要見于archivelog模式下,在表空間或數(shù)據(jù)文件級的備份得院。如果是no archivelog傻铣,一旦日志被覆蓋,有備份文件也恢復(fù)不了祥绞。因為恢復(fù)的時候矾柜,要用到備份時刻開始的日志。
控制文件的備份格式
SQL> alter database backup controlfile to '/home/oracle/notrace.ctl';
SQL> alter database backup controlfile to trace as '/home/oracle/trace.ctl';
[oracle@ocp]$ ll /home/oracle |grep ctl
-rw-r-----. 1 oracle dba 9748480 8月? 9 14:14 notrace.ctl
-rw-r--r--. 1 oracle dba? ? 5886 8月? 9 14:14 trace.ctl
backup controlfile to 'XX'? ? ? ? ? 此XX和實際的控制文件格式一樣就谜,二進制文件怪蔑,vi打開亂碼
backup controlfile to trace as 'XX'? 此XX類似重建控制文件中的內(nèi)容,文本文件丧荐,可以vi打開
重建控制文件的官方文檔
https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5003.htm#SQLRF01203
SQL> shutdown immediate;
SQL> ! rm -f /u01/app/oracle/oradata/ocp/control0*.ctl
SQL> ! ls /u01/app/oracle/oradata/ocp/ |grep control
SQL>startup
CREATE CONTROLFILE REUSE DATABASE "ocp" NORESETLOGS NOARCHIVELOG
? ? MAXLOGFILES 32
? ? MAXLOGMEMBERS 2
? ? MAXDATAFILES 32
? ? MAXINSTANCES 1
? ? MAXLOGHISTORY 449
LOGFILE
? GROUP 1 '/u01/app/oracle/oradata/ocp/redo01.log',
? GROUP 2 '/u01/app/oracle/oradata/ocp/redo02.log',
? GROUP 3 '/u01/app/oracle/oradata/ocp/redo03.log'
DATAFILE
? '/u01/app/oracle/oradata/ocp/users01.dbf',
? '/u01/app/oracle/oradata/ocp/undotbs01.dbf',
? '/u01/app/oracle/oradata/ocp/sysaux01.dbf',
? '/u01/app/oracle/oradata/ocp/system01.dbf',
? '/u01/app/oracle/oradata/ocp/example01.dbf'
CHARACTER SET AL32UTF8;
SQL> ! ls /u01/app/oracle/oradata/ocp/ |grep control
control01.ctl
control02.ctl
control03.ctl
SQL> alter database open;
SQL> alter tablespace TEMP add tempfile '/u01/app/oracle/oradata/ocp/temp01.dbf' size 100M reuse;
2.所有控制文件丟失
SQL>recover database using backup controlfile;
會自動帶出Specify log: {=suggested | filename | AUTO | CANCEL}信息
--filename表示recover需要使用到的歸檔日志或在線日志
--AUTO表示自動使用數(shù)據(jù)庫推薦的歸檔日志或在線日志
--輸入了錯誤歸檔日志或在線日志會報錯缆瓣,但是不影響繼續(xù)恢復(fù),可以繼續(xù)輸入recover database using backup controlfile;繼續(xù)選擇正確的日志進行恢復(fù)
SQL> alter database open RESETLOGS;
因為虹统,控制文件不是最新的弓坞,打開到mount狀態(tài)后,這時可以查尋select * from v$log车荔,但是v$log.status和v$log.SEQUENCE#不一定是準確的(控制文件中當前在線日志序列號還是陳舊的,是當初備份時的渡冻,而控制文件備份后online redo log可能進行了多次切換),若按常規(guī)方式打開忧便,會報錯族吻,所以只要是控制文件是恢復(fù)或重建過來的,oracle一律采用RESETLOGS重設(shè)日志功能珠增,日志序列號從1重新開超歌。
3.修改數(shù)據(jù)庫結(jié)構(gòu)后丟失所有控制文件
--必須執(zhí)行兩次SQL> recover database using backup controlfile;
第一次:把新增的數(shù)據(jù)文件信息寫入控制文件,雖然寫入了控制文件蒂教,但是數(shù)據(jù)文件的名稱是不對的?
第二次:真正的恢復(fù)
alter database create datafile '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00008' as '/u01/app/oracle/oradata/orcl/t1.dbf';
可以寫成下面的
alter database rename file '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00008' to '/u01/app/oracle/oradata/orcl/t1.dbf';
4.修改數(shù)據(jù)庫后脫機或者只讀表空間巍举,丟失所有控制文件
--此案例實驗有誤,需要重命名數(shù)據(jù)文件后再執(zhí)行一次SQL> recover database using backup controlfile;
--使用alter database backup controlfile to trace as的重建控制文件
--不需要執(zhí)行兩次SQL> recover database using backup controlfile;
是因為重建控制文件里面已經(jīng)有了一次recover database using backup controlfile凝垛,已經(jīng)把新增的數(shù)據(jù)文件信息寫入控制文件
(二)懊悯、丟失日志文件或日志文件組
--只有V$LOG.STATUS=INACTIVE和UNUSED的日志組才可以使用clear來恢復(fù)
--active和current的都不行,如果active和current的丟失梦皮,那么只能整個數(shù)據(jù)庫執(zhí)行恢復(fù)炭分,并且是不完全恢復(fù)
V$LOG.STATUS=ACTIVE
最近一次的完全檢查點SCN小于該日志中最后一條重做記錄的SCN,說明完全檢查點還沒有越過這個在線日志
說明此redo log中的數(shù)據(jù)沒有全部寫入了數(shù)據(jù)文件和控制文件
V$LOG.STATUS=INACTIVE
最近一次的完全檢查點SCN大于該日志中最后一條重做記錄的SCN,說明完全檢查點已經(jīng)越過這個在線日志
說明此redo log中的數(shù)據(jù)全部寫入了數(shù)據(jù)文件和控制文件
1.丟失系統(tǒng)表空間
--本實驗中還是使用了備份文件,現(xiàn)實情況中届氢,如果沒有任何備份欠窒,丟失系統(tǒng)表空間,基本無望。
//關(guān)閉數(shù)據(jù)庫備份system 表空間的數(shù)據(jù)文件
[oracle@oracle ~]cp ..
不能參考非系統(tǒng)表空間對數(shù)據(jù)文件脫機方式打開數(shù)據(jù)庫岖妄,是因為系統(tǒng)表空間和對應(yīng)數(shù)據(jù)文件不能offline
SQL> alter tablespace system offline;
alter tablespace system offline
ERROR at line 1:
ORA-01541: system tablespace cannot be brought offline; shut down if necessary
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' OFFLINE DROP;
alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' OFFLINE DROP
ERROR at line 1:
ORA-01541: system tablespace cannot be brought offline; shut down if necessary
2.丟失非系統(tǒng)表空間
非系統(tǒng)表空間的數(shù)據(jù)文件丟失型将,可以使用數(shù)據(jù)文件脫機的方式來打開數(shù)據(jù)庫
EXP遷移表空間:快的原因是因為,只是導(dǎo)出了元數(shù)據(jù)荐虐,實際數(shù)據(jù)文件是從源庫拷貝到了目標庫
目標端:DBCA建立一個orcl的數(shù)據(jù)庫
源表空間test的信息
SQL>create tablespace test datafile '/u01/app/oracle/oradata/ocp/test.dbf' size 10M;
SQL>create user test identified by oracle default tablespace test;
SQL>grant dba to test;
SQL>conn test/oracle
SQL>create table test1 as select * from dba_users;
SQL>create table test2 as select * from dba_data_files;
以下是表空間遷移的操作步驟七兜,1-4步操作在源數(shù)據(jù)庫中操作,5福扬、6腕铸、7步在目的數(shù)據(jù)庫操作。
1. 用as sysdba的權(quán)限登錄ORACLE铛碑。檢查源表空間test是否自包含狠裹,并設(shè)置源表空間置為READ ONLY,使得表空間下的數(shù)據(jù)文件置為READ ONLY狀態(tài)汽烦,可以進行操作系統(tǒng)級的拷貝涛菠。--如果是生產(chǎn)系統(tǒng)請注意選擇好進行此操作的時間。
SQL> exec sys.dbms_tts.transport_set_check('TEST',true);
SQL> select * from sys.transport_set_violations;--沒有結(jié)果表示自包含
SQL>ALTER TABLESPACE test READ ONLY;
2. 利用EXP工具進行數(shù)據(jù)庫表空間的遷移撇吞,需要as sysdba權(quán)限
exp \'system/oracle as sysdba\' file=/home/oracle/test2018.dmp transport_tablespace=y tablespaces=test
3. 將待遷移的表空間下的所有數(shù)據(jù)文件進行操作系統(tǒng)級的拷貝俗冻,復(fù)制到目的數(shù)據(jù)庫orcl1的目錄下,比如拷貝后名稱為/u01/app/oracle/oradata/orcl/test999.dbf。
4. 將源tablsspace_name表空間置為READ WRITE牍颈,使得表空間下的數(shù)據(jù)文件置為READ WRITE狀態(tài)
SQL> select tablespace_name,status from dba_tablespaces;
SQL>ALTER TABLESPACE test READ WRITE;
SQL> select tablespace_name,status from dba_tablespaces;
5.? 在目的數(shù)據(jù)庫上建立相應(yīng)的用戶user_name并賦權(quán)限,不要建立要傳輸?shù)谋砜臻g
ORACLE_SID=orcl
sqlplus / as sysdba
SQL> select tablespace_name,status from dba_tablespaces;--沒有test表空間
SQL>create user test identified by oracle;
SQL>grant dba to test;
SQL>select count(*) from test.test1 union all select count(*) from test.test2;--沒有這兩張表
6.? 在目的數(shù)據(jù)庫上利用IMP工具進行數(shù)據(jù)庫表空間的遷移
imp \'system/oracle as sysdba\' FILE=/home/oracle/test2018.dmp TRANSPORT_TABLESPACE=Y TABLESPACES=test DATAFILES=/u01/app/oracle/oradata/orcl/test999.dbf
7.? 在目的數(shù)據(jù)庫上將目的tablsspace_name表空間置為READ WRITE迄薄,使得表空間下的數(shù)據(jù)文件置為READ WRITE狀態(tài)
SQL> select tablespace_name,status from dba_tablespaces;--有了test表空間
SQL>ALTER TABLESPACE test READ WRITE;
SQL>select count(*) from test.test1 union all select count(*) from test.test2;--有了這兩張表
--以上如果是異機操作,則把exp的導(dǎo)出文件/home/oracle/test2018.dmp和test表空間下所有數(shù)據(jù)文件都要拷貝到異機
EXPDP
SQL文件:描述指定作業(yè)所包含對象的若干DDL語句,對應(yīng)impdp中參數(shù)sqlfile煮岁,加上sqlfile參數(shù)后讥蔽,就不是真正的導(dǎo)入,而是生成導(dǎo)入對象的ddl語句
轉(zhuǎn)儲文件:即包含數(shù)據(jù)和元數(shù)據(jù)的文件,對應(yīng)expdp中參數(shù)dumpfile
日志文件:用于記錄導(dǎo)出時的相關(guān)信息,對應(yīng)expdp人乓、impdp中參數(shù)logfile
expdp遷移表空間的官方文檔
https://docs.oracle.com/cd/E11882_01/server.112/e25494/tspaces.htm#ADMIN11394
EXP可以在read only模式下操作
EXPDP不可以在read only模式下操作
EXPDP導(dǎo)出過程中會建立一個JOB且會產(chǎn)生一張表SYS_EXPORT_SCHEMA_01勤篮,導(dǎo)完后又會自動刪除,所以EXPDP無法在read only模式下操作
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size? ? ? ? ? ? ? ? ? 1344680 bytes
Variable Size? ? ? ? ? ? 838863704 bytes
Database Buffers? ? ? ? ? 419430400 bytes
Redo Buffers? ? ? ? ? ? ? 12574720 bytes
Database mounted.
SQL> alter database open read only;
Database altered.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@ocp oradata]$exp system/oracle file=/home/oracle/exptable.dat log=/home/oracle/exptable21.log tables=hr.employees
About to export specified tables via Conventional Path ...
Current user changed to HR
. . exporting table? ? ? ? ? ? ? ? ? ? ? EMPLOYEES? ? ? ? 107 rows exported
[oracle@ocp oradata]$expdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdptable.dat logfile=expdptable21.log tables=hr.employees
ORA-31626: job does not exist
ORA-31633: unable to create master table "SYSTEM.SYS_EXPORT_TABLE_05"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPV$FT", line 1020
ORA-16000: database open for read-only access
EXPDP的一些實驗案例
SQL>create user test1 identified by oracle;
SQL>grant dba to test1;
SQL>select * from dba_directories;--查詢目錄名稱和對應(yīng)的路徑
導(dǎo)出導(dǎo)入表
expdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdptable.dat logfile=expdptable.log tables=hr.employees,hr.JOBS
--使用system用戶導(dǎo)出hr用戶的兩張表
impdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdptable.dat logfile=impdptable.log tables=hr.employees remap_schema=hr:test1 remap_tablespace=example:users TABLE_EXISTS_ACTION=REPLACE
--上面tables參數(shù)色罚,表示導(dǎo)入dumpfile中的一張表hr.employees,如果不加tables參數(shù)账劲,表示導(dǎo)入dumpfile中的所有表
--上面remap_schema表示從hr用戶導(dǎo)入到test1用戶戳护,remap_tablespace參數(shù)表示原表的表空間從example改為users
--上面TABLE_EXISTS_ACTION=replace表示,如果test1已經(jīng)存在了表名一樣的表瀑焦,則drop存在的表再導(dǎo)入
導(dǎo)出導(dǎo)入整個schema
expdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=expdpschema.log schemas=hr version=10.2.0.1
--使用system用戶進行導(dǎo)出腌且,導(dǎo)出hr整個schema,并且使導(dǎo)出的文件可以導(dǎo)入到更低版本10.2.0.1中
impdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=impdpschema.log remap_schema=hr:test1 EXCLUDE=TABLE:"in('EMPLOYEES')" PARALLEL=2
--使用system用戶進行導(dǎo)入榛瓮,除了表EMPLOYEES外都導(dǎo)入到test1這個schema铺董,并且并行度為2
impdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=impdpschema.log remap_schema=hr:test2 sqlfile=impdpschema.sql
--使用system用戶進行導(dǎo)入,導(dǎo)入test2用戶,但是只生成導(dǎo)入的sql
impdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=impdpschema.log remap_schema=hr:test3
--使用system用戶進行導(dǎo)入精续,導(dǎo)入test3用戶,就算test3不存在坝锰,也會自動建立,密碼和導(dǎo)出的hr用戶一樣