数据蛙数据分析每周作业

ORACLE的备份和迁移

2019-05-26  本文已影响0人  wqh8384

脱机冷备

冷备份发生在数据库已经正常关闭的情况下

拷贝文件,假如数据库文件都在目录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用户一样

上一篇下一篇

猜你喜欢

热点阅读