脱机冷备
冷备份发生在数据库已经正常关闭的情况下
拷贝文件,假如数据库文件都在目录A,拷贝这些数据库文件到其他目录比如目录B,如果要恢复,则也是在数据库shutdown的状态下,把这些文件从目录B拷回目录A,再startup数据库
--找出所有的控制文件
SQL> select name from v$controlfile;
--找出所有的数据文件和临时文件
SQL> select file_name from dba_data_files;
SQL> select file_name from dba_temp_files;
--找出所有的redo log文件
SQL> select MEMBER from v$logfile;
用户管理的备份与恢复也称OS物理备份,是指通过数据库命令设置数据库为备份状态,然后用操作系统命令,拷贝需要备份或恢复的文件。生产环境中使用的场景并不多,主要见于archivelog模式下,在表空间或数据文件级的备份。如果是no archivelog,一旦日志被覆盖,有备份文件也恢复不了。因为恢复的时候,要用到备份时刻开始的日志。
控制文件的备份格式
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类似重建控制文件中的内容,文本文件,可以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表示自动使用数据库推荐的归档日志或在线日志
--输入了错误归档日志或在线日志会报错,但是不影响继续恢复,可以继续输入recover database using backup controlfile;继续选择正确的日志进行恢复
SQL> alter database open RESETLOGS;
因为,控制文件不是最新的,打开到mount状态后,这时可以查寻select * from v$log,但是v$log.status和v$log.SEQUENCE#不一定是准确的(控制文件中当前在线日志序列号还是陈旧的,是当初备份时的,而控制文件备份后online redo log可能进行了多次切换),若按常规方式打开,会报错,所以只要是控制文件是恢复或重建过来的,oracle一律采用RESETLOGS重设日志功能,日志序列号从1重新开。
3.修改数据库结构后丢失所有控制文件
--必须执行两次SQL> recover database using backup controlfile;
第一次:把新增的数据文件信息写入控制文件,虽然写入了控制文件,但是数据文件的名称是不对的
第二次:真正的恢复
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.修改数据库后脱机或者只读表空间,丢失所有控制文件
--此案例实验有误,需要重命名数据文件后再执行一次SQL> recover database using backup controlfile;
--使用alter database backup controlfile to trace as的重建控制文件
--不需要执行两次SQL> recover database using backup controlfile;
是因为重建控制文件里面已经有了一次recover database using backup controlfile,已经把新增的数据文件信息写入控制文件
(二)、丢失日志文件或日志文件组
--只有V$LOG.STATUS=INACTIVE和UNUSED的日志组才可以使用clear来恢复
--active和current的都不行,如果active和current的丢失,那么只能整个数据库执行恢复,并且是不完全恢复
V$LOG.STATUS=ACTIVE
最近一次的完全检查点SCN小于该日志中最后一条重做记录的SCN,说明完全检查点还没有越过这个在线日志
说明此redo log中的数据没有全部写入了数据文件和控制文件
V$LOG.STATUS=INACTIVE
最近一次的完全检查点SCN大于该日志中最后一条重做记录的SCN,说明完全检查点已经越过这个在线日志
说明此redo log中的数据全部写入了数据文件和控制文件
1.丢失系统表空间
--本实验中还是使用了备份文件,现实情况中,如果没有任何备份,丢失系统表空间,基本无望。
//关闭数据库备份system 表空间的数据文件
[oracle@oracle ~]cp ..
不能参考非系统表空间对数据文件脱机方式打开数据库,是因为系统表空间和对应数据文件不能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.丢失非系统表空间
非系统表空间的数据文件丢失,可以使用数据文件脱机的方式来打开数据库
EXP迁移表空间:快的原因是因为,只是导出了元数据,实际数据文件是从源库拷贝到了目标库
目标端:DBCA建立一个orcl的数据库
源表空间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步操作在源数据库中操作,5、6、7步在目的数据库操作。
1. 用as sysdba的权限登录ORACLE。检查源表空间test是否自包含,并设置源表空间置为READ ONLY,使得表空间下的数据文件置为READ ONLY状态,可以进行操作系统级的拷贝。--如果是生产系统请注意选择好进行此操作的时间。
SQL> exec sys.dbms_tts.transport_set_check('TEST',true);
SQL> select * from sys.transport_set_violations;--没有结果表示自包含
SQL>ALTER TABLESPACE test READ ONLY;
2. 利用EXP工具进行数据库表空间的迁移,需要as sysdba权限
exp \'system/oracle as sysdba\' file=/home/oracle/test2018.dmp transport_tablespace=y tablespaces=test
3. 将待迁移的表空间下的所有数据文件进行操作系统级的拷贝,复制到目的数据库orcl1的目录下,比如拷贝后名称为/u01/app/oracle/oradata/orcl/test999.dbf。
4. 将源tablsspace_name表空间置为READ WRITE,使得表空间下的数据文件置为READ WRITE状态
SQL> select tablespace_name,status from dba_tablespaces;
SQL>ALTER TABLESPACE test READ WRITE;
SQL> select tablespace_name,status from dba_tablespaces;
5. 在目的数据库上建立相应的用户user_name并赋权限,不要建立要传输的表空间
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. 在目的数据库上利用IMP工具进行数据库表空间的迁移
imp \'system/oracle as sysdba\' FILE=/home/oracle/test2018.dmp TRANSPORT_TABLESPACE=Y TABLESPACES=test DATAFILES=/u01/app/oracle/oradata/orcl/test999.dbf
7. 在目的数据库上将目的tablsspace_name表空间置为READ WRITE,使得表空间下的数据文件置为READ WRITE状态
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的导出文件/home/oracle/test2018.dmp和test表空间下所有数据文件都要拷贝到异机
EXPDP
SQL文件:描述指定作业所包含对象的若干DDL语句,对应impdp中参数sqlfile,加上sqlfile参数后,就不是真正的导入,而是生成导入对象的ddl语句
转储文件:即包含数据和元数据的文件,对应expdp中参数dumpfile
日志文件:用于记录导出时的相关信息,对应expdp、impdp中参数logfile
expdp迁移表空间的官方文档
https://docs.oracle.com/cd/E11882_01/server.112/e25494/tspaces.htm#ADMIN11394
EXP可以在read only模式下操作
EXPDP不可以在read only模式下操作
EXPDP导出过程中会建立一个JOB且会产生一张表SYS_EXPORT_SCHEMA_01,导完后又会自动删除,所以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;--查询目录名称和对应的路径
导出导入表
expdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdptable.dat logfile=expdptable.log tables=hr.employees,hr.JOBS
--使用system用户导出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参数,表示导入dumpfile中的一张表hr.employees,如果不加tables参数,表示导入dumpfile中的所有表
--上面remap_schema表示从hr用户导入到test1用户,remap_tablespace参数表示原表的表空间从example改为users
--上面TABLE_EXISTS_ACTION=replace表示,如果test1已经存在了表名一样的表,则drop存在的表再导入
导出导入整个schema
expdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=expdpschema.log schemas=hr version=10.2.0.1
--使用system用户进行导出,导出hr整个schema,并且使导出的文件可以导入到更低版本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用户进行导入,除了表EMPLOYEES外都导入到test1这个schema,并且并行度为2
impdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=impdpschema.log remap_schema=hr:test2 sqlfile=impdpschema.sql
--使用system用户进行导入,导入test2用户,但是只生成导入的sql
impdp system/oracle directory=DATA_PUMP_DIR dumpfile=expdpschema.dat logfile=impdpschema.log remap_schema=hr:test3
--使用system用户进行导入,导入test3用户,就算test3不存在,也会自动建立,密码和导出的hr用户一样