【云计算】大数据培训之Oracle强化训练
小标 2019-02-25 来源 : 阅读 670 评论 0

摘要:本文主要向大家介绍了【云计算】大数据培训之Oracle强化训练,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】大数据培训之Oracle强化训练,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

【云计算】大数据培训之Oracle强化训练


很久很久以前,Oracle就开始提供用来摄取表、模式或整个数据库的定义,

然后导入到其他模式或数据的小工具:那就是exp/imp

那个时候数据库规模都很小(几百M就算超大数据库了),而且对于数据库的要求也没有那么高,不像现如今,

动不动就是7*24小时高并发、高可用,以至在某些领域,exp/imp也被看作备份恢复的工具使用并延续至今。

如果你使用exp备份几十G、数百G甚至更大规模数据库,并且将这种方式作为生产数据库的备份策略,这就太不合理了。

【9i及9i之前特别流行,10G以后就没人用了】


1、导出某用户下所有数据【表,视图,权限,触发器等所有数据】

exp scott/test file=scott_all_data.dmp log=scott_all_data.log


【改密码】alter user scott identified by test;




2、导出scott用户下的部分表

(1)exp scott/test tables=\(emp,salgrade\) file=scott_emp_salgrade.dmp log=scott_emp_salgrade.log

(2)exp scott/test tables=emp file=scott_emp.dmp log=scott_emp.log


3、参数文件

vi /home/oracle/dept.txt 文件内容如下:

userid=scott/test

log=/home/oracle/scott_dept.log

file=/home/oracle/scott_dept.dmp

tables=dept


exp parfile=/home/oracle/dept.txt


4、按条件导出

(1)

exp parfile=/home/oracle/emp.txt


vi /home/oracle/emp.txt 内容如下:

userid=scott/test

log=/home/oracle/emp.log

file=/home/oracle/emp.dmp

tables=emp

query='where sal>1000'




【验证】 select count(*) from emp where sal >1000;


(2)条件中是数字

【删除】 rm -rf /home/oracle/emp.dmp

rm -rf /home/oracle/emp.log


exp scott/test tables=emp query="'where sal >1000'" file=/home/oracle/emp.dmp log=/home/oracle/emp.log


(3)条件中带有字符串

exp scott/test tables=emp query="'where sal >1000 and job=''CLERK'''" file=/home/oracle/emp.dmp log=/home/oracle/emp.log


【注意这是字符串表示:】'abcd'


(4)参数文件,处理条件中带有字符串

exp parfile=/home/oracle/emp2.txt


vi /home/oracle/emp2.txt 内容如下:

userid=scott/test

log=/home/oracle/emp.log

file=/home/oracle/emp.dmp

tables=emp

query='where sal>1000 and job=''CLERK'''




5、导出某几个用户的所有数据


create tablespace wang datafile '/oracle/app/oradata/ecom/wang.dbf' size 5M AUTOEXTEND OFF;

create user wang identified by wang default tablespace wang;

alter user wang account unlock;

grant connect,resource to wang;


create tablespace gui datafile '/oracle/app/oradata/ecom/gui.dbf' size 5M AUTOEXTEND OFF;

create user gui identified by gui default tablespace gui;

alter user gui account unlock;

grant connect,resource to gui;


create tablespace xin datafile '/oracle/app/oradata/ecom/xin.dbf' size 5M AUTOEXTEND OFF;

create user xin identified by xin default tablespace xin;

alter user xin account unlock;

grant connect,resource to xin;




conn wang/wang

create table haha(id int);

insert into haha values(1);

commit;


conn gui/gui

create table hehe(id int);

insert into hehe values(1);

commit;


conn xin/xin

create table hihi(id int);

insert into hihi values(1);

commit;


exp \'sys/test as sysdba\' file=/home/oracle/wang_gui_xin.dmp log=/home/oracle/wang_gui_xin.log owner=\(wang,gui,xin\)




6、不想导出索引、不想导出约束、不想导出授权、不想导出与表相关的触发器等


exp scott/test file=scott_all_tables.dmp log=scott_all_tables.log indexes=N constraints=N grants=N triggers=N




7、导出的文件太大了,超出文件系统限制【fat32单个文件不能超过4G,ntfs单个文件不能超过2T,ext3理想情况下单个文件不能超过2T】


exp scott/test filesize=500M file=scott_all_tables1.dmp scott_all_tables2.dmp log=scott_all_tables.log


如果指定filesize参数,那么file参数也要跟着修改。exp在导出的时候有可能会生成多个dmp文件,

因此必须在file参数中为每一个文件分别命名(多个名称间以逗号分隔)

如果file参数指定的文件名多于实际生成的文件,多出指定的文件不会被生成。

如果file参数指定的文件名少于实际生成的文件,exp执行过程中,

在用完用户所指定的文件后,就会提示输入新的文件名。

如果没有人在旁边操作,那么整个导出任务就会停在这里了。




接着你可能就要问,怎么知道要导出的数据一共占用多大空间?

select sum(bytes)/1024/1024 "total(M)" from user_segments;




SQL> create table nimei as select * from all_objects;

SQL> create index i_nimei on nimei(object_id);

select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from user_segments where SEGMENT_NAME in ('NIMEI','I_NIMEI'); 【验证索引默认和表在同一表空间中】


--------------------------------------------------------------

1、导入数据

exp wang/wang file=wang_all_tables.dmp log=wang_all_tables.log


sqlplus wang/wang

SQL> drop table haha;


imp wang/wang file=wang_all_tables.dmp log=wang_all_tables.log


2、导入指定表到其他用户


imp gui/gui fromuser=wang touser=gui file=wang_all_tables.dmp log=wang_to_gui_all_tables.log


sqlplus gui/gui


SQL> select tname from tab;


上面的操作看起来成功?其它并没有,数据虽然成功导入了,但不是严谨的方式,可能无意中给数据库埋了一颗雷。

SQL> show user

SQL> select username,default_tablespace from user_users;

SQL> select table_name,tablespace_name from user_tables;


奇怪吗?虽然gui用户默认的表空间是gui,但是新导入的haha表被存储到wang表空间中。如下方式解决


sqlplus / as sysdba


alter user gui quota unlimited on gui; 【修改gui这个用户,可以无限使用gui这个表空间】

revoke unlimited tablespace from gui;【回收gui可以无限使用其它表空间的权限】


sqlplus gui/gui




imp gui/gui fromuser=wang touser=gui file=wang_all_tables.dmp log=wang_to_gui_all_tables.log 【报同名对象已经存在】


select * from haha;

delete from haha;

commit;


imp gui/gui fromuser=wang touser=gui file=wang_all_tables.dmp log=wang_to_gui_all_tables.log ignore=y


sqlplus gui/gui


SQL> select table_name,tablespace_name from user_tables;


1.判断是否有同名存在?

2.有,加入ignore=y,追加数据,没有,创建表,然后插入数据;




如果要导入的对象已经存在,默认情况导入就会报错。

ignore=N 【默认】,出错对象会被跳过,imp继续后续操作。

ignore=Y,自动忽略对象已存在的事实,继续导入数据,也就会出现重复数据,可能通过手工去重。


3、导入表结构到指定用户


sqlplus gui/gui

SQL> drop table haha;


imp gui/gui fromuser=wang touser=gui file=wang_all_tables.dmp log=wang_to_gui_all_tables.log ignore=y rows=N


sqlplus peng/peng

SQL> select tname from tab;

SQL> select * from haha;


现在是一个信息时代,数据规模和数据量的增长以爆炸式的速度扩张。之前几百M或数G规模的数据量都堪称庞大。

现如今测试系统所占空间都是这一数据的几十倍甚至百倍。原生imp/exp工就这两匹老马在处理这么大的数据量就力不从心了。

从10g开始,data pump横空出世,中文名叫数据泵。虽然oracle对自己产品的宣传一向有夸大的传统,

不过大家要理解,有了前面原生的exp/imp工具的铺垫,对比来看,数据泵的导入和导出,有了很大的提升。

关于 数据泵的好处,请大家自行百度一下。




data pump 导入导出工具是一个服务器端的工具,它是通过调用服务器端的data pump api的方式实现数据加载或卸载,

也就是说该工具一般都是在目标服务器上执行,导出或导入本地的对旬

(唯一的例外是通过netwkr_link参数,能够处理远端数据,需要结合本地的dblink使用,自己百度)


要使用data pump工具,要指定一个directory对象。

什么是directory?

字面意思就是目录,这个上当不是实体,只是一个指向,指向操作系统中的一个具体路径。

每个directory对象都有read、write两个权限,通过grant授权给指定用户。

拥有directory对象的read/write权限的用户就可以读/写该directory对象实际指定的操作系统路径下的文件。




即使dba在客户端执行data pump,文件最终也是生成服务器端,指定directory对象对应操作系统路径下,

而不是像imp/exp工具那样,将文件保存于执行imp/exp的机器上。




创建目录【操作系统层面要有此路径】

mkdir /home/oracle/expdp


sqlplus / as sysdba

SQL> create directory expdp as '/home/oracle/expdp';

SQL> grant read,write on directory expdp to scott;

select OWNER||','||DIRECTORY_NAME||','||DIRECTORY_PATH from dba_directories; 【查看所有目录】

【默认装完oracle带三个目录,另一个就是我们加的目录】


1、导出某用户下所有对象

cd /tmp 【下面导出文件是相对路径,但是在tmp下没有】

expdp scott/test directory=expdp dumpfile=scott_all.dmp SCHEMAS=SCOTT logfile=scott_all.log


2、导出部分表

expdp scott/test directory=expdp dumpfile=scott_emp.dmp tables=\(emp,dept\) logfile=scott_emp.log


create table e1 as select * from emp;

create table e2 as select * from emp;

create table d1 as select * from dept;

create table d2 as select * from dept;


expdp scott/test directory=expdp dumpfile=scott_E_D.dmp tables=\(scott.E%\);

expdp scott/test directory=expdp dumpfile=scott_E_D2.dmp tables=\(scott.D%\);

expdp scott/test directory=expdp dumpfile=scott_E_D3.dmp tables=\(scott.E%,scott.D%\); 【10g不支持,请在11g中操作】


3、指定条件导出

expdp scott/test directory=expdp dumpfile=scott_emp2.dmp logfile=scott_emp2.log tables=emp query=\"where sal \>1000\"


4、导出时除某对象【静态收集信息,序列,视图,表】

expdp scott/test exclude=STATISTICS,SEQUENCE,VIEW,TABLE:\" IN \(\'EMP\',\'DEPT\'\)\" directory=expdp dumpfile=scott_2015_06_02.dmp logfile=scott_2015_06_02.log


include【指定包含什么,自己百度查询】


5、导出同时压缩dmp文件(compression=ALL 11g中才有)

create table wang nologging as select * from all_objects;

insert into wang select * from wang;

/

/

/

commit;

【3600000】


select segment_name,bytes/1024/1024 from user_segments where segment_name='WANG';


【正常导出】

expdp scott/test directory=EXPDP dumpfile=scott_all.dmp SCHEMAS=SCOTT logfile=scott_all.log

【压缩参数导出】

expdp scott/test directory=EXPDP dumpfile=scott_all_compression.dmp SCHEMAS=SCOTT logfile=scott_all_compression.log compression=ALL


ls -lh *.dmp 【官方说,理想状态压缩比率最高可以达到90%】


zip scott_all_compression.zip scott_all_compression.dmp 【第二次压缩】




6、content为all 时,将导出对象定义及其所有数据.为data_only时,只导出对象数据【表中数据】,为metadata_only时,只导出对象定义【空表表结构 】


expdp scott/test directory=EXPDP dumpfile=scott_metadata_only.dmp content=metadata_only logfile=scott_metadata_only.log

expdp scott/test directory=EXPDP dumpfile=scott_all.dmp content=all logfile=scott_metadata_only.log


ls -ctlhr *

---------------------------------------

实验


1、导入某用户所有对象 【在10和11g都能操作,我选择11g是为了下面的跨版本迁移】

sqlplus / as sysdba

create tablespace test datafile '/home/oracle/app/oracle/oradata/ecom/test.dbf' size 10M AUTOEXTEND OFF;

create user test identified by test default tablespace test;

alter user test account unlock;

grant connect,resource to test;

grant create table to test;

grant create view to test;

grant read, write on directory EXPDP to test;


sqlplus test/test


create table hehe(a int,b varchar2(10));

insert into hehe values(2,'d');

insert into hehe values(4,'e');

insert into hehe values(6,'f');

commit;

create view nimei as select a from hehe;




create table haha(id int);

insert into haha values(1);

commit;

expdp test/test directory=expdp dumpfile=test_all.dmp SCHEMAS=test logfile=test_all.log

【模拟数据加载失败】

sqlplus test/test

drop view nimei;

drop table hehe;

drop table haha;

impdp test/test directory=expdp dumpfile=test_all.dmp logfile=test_all.log


2、导入的对象已存在

当使用IMPDP完成数据库导入时,如遇到表已存在时,Oracle提供给我们如下四种处理方式:【dump两个操作:创建表,插入数据】

a.忽略(SKIP,默认行为);【跳过,不导数据】

b.在原有数据基础上继续增加(APPEND);【表不创建,同名表数据追加进去,有重复数据】

c.先DROP表,然后创建表,最后完成数据插入(REPLACE);【删除原有的,重新创建】

d.先TRUNCATE,再完成数据插入(TRUNCATE)。【清空数据,在插入】


sqlplus test/test

delete haha;

insert into haha values(6);

insert into haha values(66);

commit;

select * from haha;


impdp test/test directory=expdp dumpfile=test_all.dmp TABLE_EXISTS_ACTION=TRUNCATE logfile=test_all.log




3、test用户数据 导入 lisi用户

sqlplus / as sysdba

create tablespace lisi datafile '/home/oracle/app/oracle/oradata/ecom/lisi.dbf' size 10M AUTOEXTEND OFF;

create user lisi identified by lisi default tablespace lisi;

alter user lisi account unlock;

grant connect,resource to lisi;

grant create table to lisi;

grant create view to lisi;

grant read, write on directory EXPDP to lisi ;


conn lisi/lisi

select tname from tab;


impdp lisi/lisi directory=expdp remap_schema=test:lisi remap_tablespace=test:lisi dumpfile=test_all.dmp logfile=test_lisi.log;




4、只导入部分表


sqlplus test/test

drop view nimei;

drop table hehe;

drop table haha;


impdp test/test directory=expdp tables=haha dumpfile=test_all.dmp logfile=test_only_haha.log


sqlplus test/test

select * from hehe;

select * from haha;


5、高版本导入低版本

11g导出


sqlplus lisi/lisi

SQL> select tname from tab;


expdp lisi/lisi directory=expdp dumpfile=lisi_11g_all.dmp SCHEMAS=lisi logfile=lisi_11g_all.log version=10.2.0.1.0


lcd d:\

get /home/oracle/expdp/lisi_11g_all.dmp


10g导入

create tablespace lisi datafile '/oracle/app/oradata/ecom/lisi.dbf' size 10M AUTOEXTEND OFF;

create user lisi identified by lisi default tablespace lisi;

alter user lisi account unlock;

grant connect,resource to lisi;

grant create table to lisi;

grant create view to lisi,scott;

grant read, write on directory EXPDP to lisi ;

SQL> drop view scott.nimei;


[oracle@DB ~]$ mkdir /home/oracle/expdp


SQL> create or replace directory EXPDP as '/home/oracle/expdp';

SQL> grant read, write on directory EXPDP to lisi ;

SQL> grant create view to scott;


lcd d:\

cd /home/oracle/expdp

put lisi_11g_all.dmp


impdp lisi/lisi directory=expdp dumpfile=lisi_11g_all.dmp logfile=lisi_11g_all.log


impdp scott/test directory=expdp remap_schema=lisi:scott remap_tablespace=lisi:users dumpfile=lisi_11g_all.dmp logfile=lisi_11g_all.log




【什么是rman】

恢复管理器(recovery manager,rman)是一款与操作系统无关的数据库备份恢复工具,可以跨越不同操作系统进行数据库的备份与恢复。


【rman具有的优势】

1、rman操作简单,自动化功能强

2、rman可以忽略备份后未发生改变的block【增量备份,节省资源】

3、使用rman可以轻松的创建备份数据库或standby数据库

4、自动执行并行的备份和还原操作

5、可以不实际执行的情况下检查文件是否被正确的备份或还原


【rman备份】

1、rman将数据库文件备份到备份集中

2、备份集为备份片文件组成的集合

3、通常一个备份集对应一个备份片

4、一个备份片中包含一个或几个数据文件和控制文件,还有系统参数文件【全库备份】


备份片示例:piece handle=/oracle/app/flash_recovery_area/ECOM/backupset/2015_09_03/o1_mf_nnndf_TAG20150903T184336_byj92s59_.bkp

【闪回区下面】




【利用控制文件存储】

元数据存储在本地数据库的控制文件中,一定要确保本地控制文件可用,否则rman无法使用

元数据:用数据描述数据

------------------------------------------------------------------------------------

无论“备份”或“恢复” 数据库第一步就是开归档


archive log list;-----------查看归档启动否


shutdown immediate;---------开启归档前要正常关库


startup mount;-------------启动Mount状态


alter database archivelog;-------开启归档模式 【关闭就是noarchivelog;】


alter database open;--------开启数据库


alter system switch logfile;---------随便产生一个归档日志




oracle@localhost ~]$ rman


RMAN> connect target / -------连接到本地(所以没有加用户和密码)

connected to target database: ECOM (DBID=3581177719)


RMAN> exit-----------退出


rman target / -----启动并连接到本地


【联机全库备份时,会自动备份控制文件和spfile】

RMAN>backup database;




SQL>create table aaa as select * from dba_objects;


【查看文件】

cd $ORACLE_BASE/oradata/$ORACLE_SID/


du -m sysaux01.dbf system01.dbf users01.dbf undotbs01.dbf 【没有备份空块】


cd $ORACLE_BASE/flash_recovery_area/ECOM/backupset/


ls -ctlhr *


【查看备份文件大小、原文件大小、备份时会忽略空块,只备份有数据的块,原文件大小>备份文件大小】


echo "asdasd" > $ORACLE_BASE/oradata/$ORACLE_SID/system01.dbf 【人为破坏数据文件】


startup force; 【强制重启】


ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: '/oracle/app/oradata/ecom/system01.dbf'


rman target /


RMAN> restore database; 【恢复备份时间点,它会自己找备份片】


RMAN> recover database; 【查看日志,恢复到当前】


RMAN> alter database open;


select count(*) from aaa;【查看测试表,已经恢复】




rman备份或还原的时候,比较智能,直接就知道找哪些文件,这些备份信息保留在控制文件中。

这就是rman备份全库时,为什么会自动备份控制文件了。




-------------------------------------------------------------------

【联机部分数据备份 --- 表空间】

rman target /


RMAN>backup tablespace users;

RMAN>exit


SQL>sqlplus / as sysdba

create table fuckyou tablespace users as select * from scott.dept;

exit;


cd /oracle/app/oradata/ecom/

echo "asdasdsda" > users01.dbf


SQL>sqlplus / as sysdba

SQL>select * from fuckyou;【报错】


ORA-01115: IO error reading block from file 4 (block # 61)

ORA-01110: data file 4: '/oracle/app/oradata/ecom/users01.dbf'




RMAN>restore tablespace users;【报错,上面咱们全库恢复时处于mount状态,当前是Open状态】


SQL>alter database datafile 4 offline; 【将数据文件离线】


RMAN>restore tablespace users;

RMAN>recover tablespace users;


SQL>alter database datafile 4 online;【将数据文件上线】

SQL>select count(*) from fuckyou; 【表正常恢复了】




部分数据恢复时,不用把整个库重启。全部数据恢复时,要把库重启到mount状态。

-------------------------------------------------------------

【删除控制文件】


SQL>sqlplus / as sysdba

create table fuckyou2 tablespace users as select * from all_objects;

exit


rman target /


backup database;


exit


cd /oracle/app/oradata/ecom

echo "asdasdsda" >users01.dbf

echo "asdasdsda" >sysaux01.dbf

echo "asdasdsda" >system01.dbf


rm -rf *.ctl 【删除所有控制文件】




SQL>startup force; 【无法启动到mount状态, 因为没有ctl文件】

ORA-00205: error in identifying control file, check alert log for more info




rman target /


RMAN> restore database; -----恢复,报错(所有备份信息都在控制文件中)

RMAN> restore controlfile;【报错】

RMAN> restore controlfile from autoback;【找不到备份片】

RMAN> restore controlfile from '/oracle/app/flash_recovery_area/ECOM/backupset/2015_09_04/o1_mf_ncsnf_TAG20150904T214659_bym88gk6_.bkp'; 【指定备份片恢复控制文件】

RMAN> exit


SQL>alter database mount;




ls /oracle/app/oradata/ecom 【查看控制文件全恢复了】




rman target / 【重新登录加载控制文件】


RMAN> restore database;

RMAN>recover database;


SQL>alter database open;【报错】


SQL>alter database open resetlogs;【重置日志,控制文件的SCN号和数据文件的SCN不一致了】


SQL>sqlplus / as sysdba


SQL>select count(*) from fuckyou2; 【表正常恢复,没有丢失数据】


-----------------------------------------------------------------------

【模拟日志损坏】


rman target /

list backup; 【查看所有的备份信息】


backup database; 【全库备份,如果有恢复操作,rman会找与当前时间最近的全库备份集,我来恢复】


SQL> set lines 300

SQL>select * from v$log;

SQL>create table fuckyou3 tablespace users as select * from all_objects;

SQL>insert into fuckyou3 select * from all_objects;

SQL>commit;

SQL>alter system switch logfile;

SQL>insert into fuckyou3 select * from all_objects;

SQL>commit;

SQL>select * from v$log;

SQL>alter system switch logfile;

SQL>select * from v$log;

SQL>select count(*) from fuckyou3;

SQL>insert into fuckyou3 select * from all_objects;

SQL>commit;

SQL>select count(*) from fuckyou3; 【19W多】

SQL>select * from v$log;




cd /oracle/app/oradata/ecom


rm -rf *.log 【当前日志组、非当前日志组】


SQL> startup force;【报错日志丢失】




rman target /

RMAN> restore database;


【数据文件没有坏,这么做是为了把SCN号回滚变小,在后面查日志把它恢复。

主流的关系数据库都是先写日志,再执行。它认为你的日志写健全了,你操作就是完整的。

写100M数据,先往内存中写,然后往磁盘中写,首先写的是产生的日志,假设写20M日志,lgwr工作了,往写磁盘中写日志。

lgwr工作同时,dbwr也开始工作了,日志内容比较小,会先写完,dbwr继续写数据。只要日志写到磁盘操作完毕。

假设我现在掉电了,数据还没有写完呢,没关系。因为日志写完,可以通过日志来恢复。




RMAN>recover database; 【报错,找不到日志】


SQL>recover database until cancel;

AUTO 【报错,找不到归档日志】


SQL>recover database until cancel;【当前日志被删除了,如果还存在就可以指定具体路径了】

cancel 【忽略】


SQL>alter database open resetlogs;【重置日志,当前日志组没有了,肯定丢数据】


SQL>select count(*) from fuckyou3;【14W多条,丢失了部分数据,因为刚才把当前日志组干掉了】


在生产中,遇到这种情况,咱们就恢复不了了,因为是物理文件都没了,做磁盘恢复。

把磁盘拿到 专业恢复数据的地方,做文件恢复。


-----------------------------------------------------------------------

0级 全库备份

1级 增量备份 【至少有一次0级的备份】

1.1 差异增量 认同 同级备份,备份过程中没有冗余,好处备份小,坏处还原慢(用到的备份片多)。

1.2 累积增量 不认同 同级备份,有冗余,永远按0级全库备份为标准来备份,坏处备份大,好处还原速度快(用到的备份片少)。


1号做0级全库备份,一直备份到30号,突然30号这天库坏了,如何还原?

差异方式:1号0级全库备份+2号差异+......30号差异备份片

累积方式:1号全库备份+30累积备份片


那么在公司用哪种方式?

1、如果公司库变化数据量不多,累积比较好

2、如果公司库变化数据量比较多,用差异比较好一些。


还原不能以天为周期,如果以天为单位就完蛋了(每天都备份,每天都还原)


【rman增量备份】


archive log list;-----------查看归档启动否


shutdown immediate;---------开启归档前要正常关库


startup mount;-------------启动Mount状态


alter database archivelog;-------开启归档模式


alter database open;--------开启数据库


mkdir -p /home/oracle/db_bak/


1。

rman target /


RMAN> backup incremental level 0 database format='/home/oracle/db_bak/%u';

(level=0 0级别为全库备份 %u生成唯一一个文件名)

(增量备份第一备份要为全库备份)


cd /home/oracle/db_bak

ls -ctlhr *




2.1

SQL> create table c1 as select * from dba_objects;

(产生4w多行记录 占用的块较多)

SQL> select segment_name,segment_type,bytes/1024/1024 from user_segments where segment_name='C1';

(查看表占多大空间)




(一级增量备份)

(增量备份级别:

1.differential 差异备份 认同同级备份.

2.cumulative 累积增量备份 不认同同级备份 优点:恢复时不需要读取过多的备份集)




2.2 差异备份

RMAN> backup INCREMENTAL LEVEL 1 DATABASE format='/home/oracle/db_bak/%u';


cd /home/oracle/db_bak

ls -ctlhr *




SQL> create table c2 as select * from dba_objects;


RMAN> backup INCREMENTAL LEVEL 1 DATABASE format='/home/oracle/db_bak/%u';


cd /home/oracle/db_bak

ls -ctlhr *




SQL> create table c3 as select * from dba_objects;


3.2 累积增量备份

RMAN> backup INCREMENTAL LEVEL 1 CUMULATIVE DATABASE format='/home/oracle/db_bak/%u';


cd /home/oracle/db_bak

ls -ctlhr *




SQL> create table c4 as select * from dba_objects;


差异备份

RMAN> backup INCREMENTAL LEVEL 1 DATABASE format='/home/oracle/db_bak/%u';


cd /home/oracle/db_bak

ls -ctlhr *


SQL> alter system switch logfile;

SQL> create table c5 as select * from dba_objects;

SQL> insert into c5 select * from c5;

SQL> commit;


cd /oracle/app/oradata/ecom

echo "asasdasd" >system01.dbf 【不做备份,直接破坏数据文件】


SQL> startup force;【报错】


rman target /


RMAN> restore database; 【看看找的是哪个备份片】


RMAN>recover database; 【看看找的是哪个备份片,c5是靠日志恢复的】


RMAN>alter database open;




【查看测试表恢复没】

select count(*) from c1;

select count(*) from c2;

select count(*) from c3;

select count(*) from c4;

select count(*) from c5;


-----------------------------------------------------------------------

脚本备份

[oracle@sq123 ~]$ vi fullbackup.sh

#!/bin/bash

source ~/.bash_profile

$ORACLE_HOME/bin/rman target / <<eof
 run {

allocate channel C1 type disk FORMAT '/home/oracle/db_bak/%u';

allocate channel C2 type disk FORMAT '/home/oracle/db_bak/%u';

backup incremental level=0 database format='/home/oracle/db_bak/%u';

}

exit;

EOF




[oracle@sq123 ~]$ mkdir -p /home/oracle/db_bak

[oracle@sq123 ~]$ chmod 777 fullbackup.sh

[oracle@sq123 ~]$ ./fullbackup.sh 执行 【备份数据通常在业务低峰,通过使用计划任务来做 crontab -e 】


上面利用 channel关键字,分配了通道1和通道2,2个通道同时工作,加快速度


source ~/.bash_profile 在脚本中加载.bash_profile,加载环境变量


-----------------------------------------------------

【管理备份操作】




RMAN> list backup;【查看有哪些备份片】


RMAN> delete backupset 1; 【删除1号备份片】

YES


RMAN> delete backup; 【删除全部备份,包括操作系统物理层面的文件】


在操作系统层面破坏备份片 echo "adssdasd" >备份片 【人工搞破坏】

RMAN> list backup; 【查看,状态还是有效的】

RMAN> CROSSCHECK backup; 【检测所有备份】

RMAN> list backup; 【查看,状态变成过期了】


如果你第2天早上巡检时,发现昨天晚上的备份不成功,你就要看看alert日志有没有报错、AWR报告等。




假设当前18号

你还要检查上一次17号备份到现在,所有归档健全不健全,首先看归档连续不连续。

归档命名: 1_ 2_ 3_ 4_ 那就没有问题了

即使18号备份没有成功,恢复时没有影响,我不走18号备份片,我从17号开始查询日志也可以。

如果17号到18号的日志没有了,18再没备份成功,那就有问题,马上报告给你的上级领导。

你的库可以正常用,但只要断电或重启之后如果出问题,你就不能恢复了。

如果领导批准了,即使占用点I/O,再重新手动备份一下,看看哪出现问题了。

很多时候库不重启没问题,库一重启就启不来了,很多缓存机制,可能报了哪个数据文件出错,你当时没有留意,你写数据不受影响。




SQL> create table c6 as select * from scott.dept;

SQL> select count(*) from c6;

SQL> select tablespace_name from user_tables where table_name='C6'; 【查看表所在表空间】

SQL> select file_name from dba_data_files where tablespace_name='SYSTEM'; 【查看表空间对应的数据文件】


cd /oracle/app/oradata/ecom

rm -rf system01.dbf


SQL> select * from c6;【还是可以正常查询的,这是在data buffer中缓存的数据】


重新开启个会话

sqlplus / as sysdba

SQL> select * from c6;【还是可以正常查询的,这是在data buffer中缓存的数据】


SQL> insert into c6 select * from c6;【报错了】


SQL> create table c7 as select * from scott.dept;【报错了】


SQL> drop table c7;【报错了】


SQL> update c6 set deptno=30;【可以操作,修改的是data buffer中缓存的数据,dbwr会定期把data buffer中的缓存写入数据文件中,那时就会报错了】

SQL> select * from c6;【跟着更新了,在data buffer中缓存的数据】

SQL> commit;


检查备份文件是否有效

RMAN> validate backupset 1;【检查1号备份是否有效】


在操作系统层面破坏备份片 echo "adssdasd">>备份片 【人工搞破坏】


RMAN> list backup;


RMAN> validate backupset 1;【报错了】




RMAN>show all; 【查看当前rman默认配置】

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default 【rman默认没有设置保留策略】


SQL> show parameter control_file_record_keep_time; 【control文件默认保留7天】


NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time integer 7




我们知道默认ramn的备份信息都保留在控制文件中。

RMAN备份集的信息在控制文件中的保留天数,

取决于初始化参数control_file_record_keep_time。

如果超过了control_file_record_keep_time配置的天数,

控制文件可能会覆盖掉保留天数之前的记录。

所以,一般control_file_record_keep_time的值应该大于RAMN中配置的备份集保留时间。




基于以上原则,调整了RMAN中备份集的保留时间为6天。

RMAN> configure retention policy to recovery window of 6 days;




删除的是那些本来RMAN以为存在但是实际上在磁盘或者磁带上已经被删除了的信息【更新RMAN资料库中的记录】

delete expired backup;


删除陈旧的备份(超出冗余保留时间,同时也更新RMAN资料库以及控制文件)

delete obsolete;

报告陈旧的备份文件【超过了这个保留策略的备份,会被标记为obsolete,但其状态依旧为AVAILABLE】

report obsolete;

报告需要备份的文件

report need backup;


******************************************************************************************************************************

--------------------------------------------------------

【rman catalog】

一个公司可能会有很多库,按业务类型、按功能等分库,一些比较大的公司:国家电网、银行、银行一个省级库,都会有几十个、甚至上百个库。

每个库都需要备份,我们要统一备份、统一管理这些备份文件,为了避免出现控制文件出现错误,咱们引入了catalog方式。

公司只有一两个库,就不用这种方式了。


目录数据库(备份):8.66

目标数据库:8.8

环境准备:


sqlplus / as sysdba


两端开启归档模式

archive log list;-----------查看归档启动否


shutdown immediate;---------开启归档前要正常关库


startup mount;-------------启动Mount状态


alter database archivelog;-------开启归档模式


alter database open;--------开启数据库


/oracle/app/oracle/product/10.2.0/db_1/network/admin --------监听文件、传输文件目录




scp /oracle/app/oracle/product/10.2.0/db_1/network/admin/listener.ora oracle@192.168.8.66:/oracle/app/oracle/product/10.2.0/db_1/network/admin/


scp /oracle/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora oracle@192.168.8.66:/oracle/app/oracle/product/10.2.0/db_1/network/admin/


两端开启监听


vi $ORACLE_HOME/network/admin/listener.ora


SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = ecom)

(ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)

(SID_NAME = ecom)

)

)


LISTENER =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))

)


vi $ORACLE_HOME/network/admin/listener.ora


SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = ecom)

(ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)

(SID_NAME = ecom)

)

)


LISTENER =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.66)(PORT = 1521))

)


两端开传输文件


DB8 =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = ecom)

)

)


DB66 =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.66)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = ecom)

)

)


两边日期保持一致:date查看

如果不一致:date -s "20171212" 【换root设置】




1.在目录数据库中创建恢复目录所用表空间


sqlplus / as sysdba

SQL> create tablespace rmants datafile '/home/oracle/rmants.dbf' size 100m;


2.在目录数据库中创建RMAN 用户并授权

SQL> create user rman identified by rman default tablespace rmants quota unlimited on rmants;


SQL> grant recovery_catalog_owner to rman;

SQL> grant resource to rman;

SQL> grant connect to rman;




3.在目录数据库中创建恢复目录

[oracle@oracle18 ~]$ rman catalog rman/rman

RMAN> create catalog tablespace rmants;

RMAN>exit


4.在目录数据库中,注册目标数据库到恢复目录

[oracle@oracle18 ~]$ rman target sys/test@DB8 【登录目标数据库】

RMAN> connect catalog rman/rman@DB66 【登录目录数据库】

RMAN> register database;




5、在目标数据库

rman target /

RMAN> backup tablespace users;

RMAN> exit


查看备份文件存放到哪

cd /oracle/app/flash_recovery_area/ECOM/backupset/


sqlplus scott/test

create table nimei as select * from all_objects;


6、在目录数据库

[oracle@oracle18 ~]$ rman target sys/test@db8 【登录目标】

RMAN> connect catalog rman/rman@db66 【登录目录】

RMAN> list backup;

还能看到备份信息




rman target /

RMAN> list backup; 【本地登录,没有备份信息】




7、在目标数据库


模拟破坏


cd /oracle/app/oradata/ecom

echo "asdasdasd">users01.dbf 【手工破坏】

rm -rf *.ctl 【删除所有控制文件,本地的备份信息没有了】


sqlplus / as sysdba

SQL>startup force; 【报错】


rman target /

RMAN>restore tablespace users; 【报错不能Mount状态】


SQL> CREATE CONTROLFILE REUSE DATABASE "ECOM" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 '/oracle/app/oradata/ecom/redo01.log' SIZE 50M,

GROUP 2 '/oracle/app/oradata/ecom/redo02.log' SIZE 50M,

GROUP 3 '/oracle/app/oradata/ecom/redo03.log' SIZE 50M

-- STANDBY LOGFILE

DATAFILE

'/oracle/app/oradata/ecom/system01.dbf',

'/oracle/app/oradata/ecom/undotbs01.dbf',

'/oracle/app/oradata/ecom/sysaux01.dbf',

'/oracle/app/oradata/ecom/users01.dbf'

CHARACTER SET ZHS16GBK;


【报错,说users01.dbf有问题】


8、在目录数据库

[oracle@oracle18 ~]$ rman target sys/test@DB8 【登录目标】

RMAN> connect catalog rman/rman@DB66 【登录目录】

RMAN> list backup; 【还能看到备份信息】

RMAN> restore tablespace users;


9、在目标数据库

SQL>

CREATE CONTROLFILE REUSE DATABASE "ECOM" NORESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 '/oracle/app/oradata/ecom/redo01.log' SIZE 50M,

GROUP 2 '/oracle/app/oradata/ecom/redo02.log' SIZE 50M,

GROUP 3 '/oracle/app/oradata/ecom/redo03.log' SIZE 50M

-- STANDBY LOGFILE

DATAFILE

'/oracle/app/oradata/ecom/system01.dbf',

'/oracle/app/oradata/ecom/undotbs01.dbf',

'/oracle/app/oradata/ecom/sysaux01.dbf',

'/oracle/app/oradata/ecom/users01.dbf'

CHARACTER SET ZHS16GBK;




10、在目标数据库


SQL> recover database;

SQL> alter database open;


验证:

select count(*) from scott.nimei;

-----------------------------------------------------




做备份之前模拟点归档日志




多通道全库备份(提高效率,多个通道分开写数据,多个通道备份组成1个完整的备份片)


run{

allocate channel c1 type disk format '/home/oracle/backup1/%u';

allocate channel c2 type disk format '/home/oracle/backup2/%u';

sql 'alter system archive log current'; 归档当前日志,相当于切换日志

backup database plus archivelog delete all input; 把此次备份之前的归档日志,全部删除了

sql 'alter system archive log current';

}




run{

allocate channel c1 type disk format '/home/oracle/backup1/%u';

allocate channel c2 type disk format '/home/oracle/backup2/%u';

sql 'alter system archive log current';

backup database plus archivelog delete all input;

sql 'alter system archive log current';

}


备份完毕后,查看归档日志


----------------------RMAN不完全恢复-----------------------

【时间点恢复】

archive log list;-----------查看归档启动否


shutdown immediate;---------开启归档前要正常关库


startup mount;-------------启动Mount状态


alter database archivelog;-------开启归档模式


alter database open;--------开启数据库




mkdir /home/oracle/backup1

mkdir /home/oracle/backup2


run{

allocate channel c1 type disk format '/home/oracle/backup1/%u';

allocate channel c2 type disk format '/home/oracle/backup2/%u';

sql 'alter system archive log current';

backup database plus archivelog delete all input;

sql 'alter system archive log current';

}


SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;


TO_CHAR(SYSDATE,'YY

-------------------

2017-12-12 00:19:28


SQL> drop table scott.emp;

SQL> commit;




SQL> shutdown abort;

SQL> startup mount

SQL> !rman target /




RMAN> run {

set until time "to_date('2017-12-12 00:19:28','yyyy-mm-dd hh24:mi:ss')";

restore database;

recover database;

alter database open resetlogs;

}


数据库直接打开


scott用户查看emp表


select count(*) from scott.emp;


==========================================

免除表空间

RMAN>configure exclude for tablespace user03;

RMAN>backup database;


==========================================

块恢复

RMAN>blockrecover datafile 12 block 2718618 from backupset;




这里对不起大家了,Oracle算是糊弄过去了,但是这些操作肯定都是能用的,我也在学习的过程中敲过,下一篇开始正题:Hadoop


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程