ORACLE的备份和迁移

作者: wqh8384 | 来源:发表于2019-05-26 23:56 被阅读0次

    脱机冷备

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

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

    相关文章

      网友评论

        本文标题:ORACLE的备份和迁移

        本文链接:https://www.haomeiwen.com/subject/zzmqtctx.html