摘要:本文主要向大家介绍了【云计算】大数据培训之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
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号