第一篇:ORACLE讲稿
一.ORACLE管理器和目录介绍
二、如何配置一个连接和侦听(连接配置文件、侦听文件位置)
三、数据库安装需注意的参数
字符集 内存 会话数 PFILE,SPFILE 自己在客户端配置到数据库服务器的连接
四、PLD工具介绍
1、右键菜单
2、Copy to Excel
3、Select for Update
4、执行单条SQL语句
5、查看执行计划
6、调试存储过程
五、常用DBA视图 Dba_object, dba_data_file, dba_tables, v$sqltext, v$session V$lock, dba_tab_columns, dba_indexes
六、物化视图原理及数据分发常规处理 物化视图刷新时间 生产机和查询机
七、作业调度
八、DBLINK
CTAIS体系结构 表(Table)命名规则(1)表名
表名前缀根据表所操作的业务及功能进行分类,使用具体业务名称的汉语拼音,长度为两个字符。标题使用规范的汉语拼音缩写,标题内容以词组或短语为单位,长度不超过10个字符,词组与词组之间使用‘_’相连接。例如,申报征收模块中小规模纳税人申报增值税表名为:SB_ZZS_XGMNSR。(2)表名后缀
主表与子表是一对多的关系,子表名是在主表名后加后缀:_ZB 例:DJ_BG_ZB 申请表加后缀:_SQ 例:WS_HDZS_SQ 审批表加后缀:_SP 例:WS_HDZS_SP 扩展表加后缀:_KZ 例:DJ_NSRXX_KZ 附表加后缀:_FB 例:SB_ZZS_2003_FB SB_ZZS_2003_FB1 SB_ZZS_2003_FB2
表(Table)命名规则(3)列名
列名由长度不超过30个英文字符和数字的组合,使用规范的汉语拼音缩写。命名规则如下:
凡是参照代码表的列,列名一律加‘_DM’后缀;
例:NSR_SWJG_DM、HY_DM “XX标志”列,当其取值为“真/假”时,数据类型用Char(1),列名加‘BZ’或‘_BZ’后缀。例:NSR_SWJG_BZ CTAIS表的类型 BB_报表 CX_查询 DJ_登记 DM_代码 FP_发票 HD_核定 JC_稽查 KJ_会计 PI_批处理 PZ_票证 QX_权限 RD_认定 SB_申报
WF_维护、工作流 WS_文书 WZ_违章 XT_系统 ZD_字典 ZJ_证件 ZX_执行
ctais部分表
DJ_NSRXX,DJ_NSRXX_KZ,DJ_SZ,DJ_SZ_ZB,DJ_SZ_KZ,DJ_YZCWSBQC RD_NSRZG_LSXX,HD_DSQC_LS WS_DJXX,WS_JMS_SQ,WS_JMS_SP FP_KC,FP_YJ,FP_NSR_JC SB_SBXX,SB_ZZS_2003_YBNSR,SB_ZZS_2003_FB1 SB_ZSXX,SB_JKS,SB_WSZ JC_AJXX,JC_CLJDS,WZ_WFWZXX,WZ_CLCFXX, ZX_ZXXX QX_USER,QX_GNMK,QX_GNMB XT_XTCS,XT_DYCS
如何自己搭建本地的测试库
1. 安装ORACLE服务器版,并修改字符集 2. 创建CTAIS实例 3. 创建表空间 4. 创建CTAIS2用户 5. 执行数据库安装脚本 6. 停止触发器和外键
7. 倒入数据(因表已经存在,IMP时需要忽略创建错误IGNORE=Y)8. 编译失效对象
第二篇:oracle语法
第一篇 基本操作
--解锁用户 alter user 用户 account unlock;--锁定用户 alter user 用户 account lock;alter user scott account unlock;
--创建一个用户yc 密码为a create user 用户名 identified by 密码; create user yc identified by a;
--登录不成功,会缺少create session 权限,赋予权限的语法 grant 权限名 to 用户; grant create session to yc;
--修改密码 alter user 用户名 identified by 新密码; alter user yc identified by b;
--删除用户 drop user yc;
--查询表空间
select *from dba_tablespaces;--查询用户信息
select *from dba_users;--创建表空间
create tablespace ycspace datafile 'E:oracleappproduct11.2.0dbhome_1oradataycspace.dbf' size 2m autoextend on next 2m maxsize 5m offline;
--创建临时表空间
create temporary yctempspace tempfile 'E:oracleappproduct11.2.0dbhome_1oradataycspace.dbf' size 2m autoextend on next 2m maxsize 5m offline;
--查询数据文件
select *from dba_data_files;
--修改表空间
--
1、修改表空间的状态
--默认情况下是online,只有在非离线情况下才可以进行修改
alter tablespace ycspace offline;--离线状态,不允许任何对象对该表空间的使用,使用情况:应用需要更新或维护的时候;数据库备份的时候 alter tablespace ycspace read write;--读写状态 alter tablespace ycspace online;alter tablespace ycspace read only;--只读,可以查询信息,可以删除表空间的对象,但是不能创建对象和修改对象。使用情况:数据存档的时候
--
2、修改表空间的大小--增加文件的大小
alter database datafile 'E:oracleappproduct11.2.0dbhome_1oradataycspace.dbf' resize 10m;--增加数据文件
alter tablespace ycspace add datafile 'E:oracleappproduct11.2.0dbhome_1oradataadd.dbf' size 2m;
--删除表空间的数据文件
alter tablespace 表空间的名字 drop datafile 数据文件名;
--删除表空间
drop tablespace ycspace;
--删除表空间且表空间中的内容和数据文件
drop tablespace ycspace including contents and datafiles;
--指定表空间 的 创建用户的语法
create user yc1 identified by a default tablespace ycspace temporary tablespace temp;
--删除用户 drop user yc1;
--权限
--赋予创建会话的权限 grant create session to yc1;
--创建一个表
create table studentInfo(sid int, sname varchar2(10));
--赋予yc1用户创建表的权限 grant create table to yc1;--赋予yc1使用表空间的权限 grant unlimited tablespace to yc1;
--系统权限
--对象权限
--插入
insert into studentInfo values(2,'abcd');--查询
select *from studentInfo;--修改
update studentInfo set sid=1;--删除
delete studentInfo;drop table studentInfo;--系统权限删除表
--赋权的语法
--系统权限
grant 权限名(系统权限或对象权限,角色,all)to 用户(角色,public)with admin option;
--对象权限
grant 权限名(系统权限或对象权限,角色,all)on 用户(角色,public)with grant option;
--收权语法--系统权限
revoke 权限名(系统权限或对象权限,角色,all)from 用户(角色,public)with admin option;--对象权限
revoke 权限名(系统权限或对象权限,角色,all)from 用户(角色,public)with grant option;
--赋予创建用户的权限并且把这个权限传递下去,即yc1可以给别人赋权 grant create user to yc1 with admin option;
--收回权限,只能收回scottd ,不能收回由scott赋权的yc1的权限 revoke create user from scott;
--查看用户所具有的权限 select *from user_sys_privs;
--对象权限详解 select * from emp;--使用yc1来查询scott里面的emp表 select * from scott.emp;
--赋予yc1查询emp表和插入的权限 grant select on emp to yc1;grant insert on emp to yc1;grant update(empno,ename)on emp to yc1;
grant delete on emp to yc1;
--对scott的emp表添加数据
insert into scott.emp(empno,ename)value(111,'acv');update scott.emp set ename='yc'where empno=111;
--赋予查询、赋予删除、添加、修改 grant select on 表名 to 用户
--grant select,delete,update,insert on 表名 to 用户 grant select,delete,update,insert on emp to yc1;grant all on dept to yc1;--all代表所有的对象权限
select *from scott.emp;
select *from scott.dept;insert into scott.dept values(50,'企事业文化部','bumen');
--查看角色
--dba:数据库管理员,系统最高权限,可以创建数据结构(表空间等)--resource:可以创建实体(表、视图),不可以创建数据库的结构
--connect:连接的权限,可以登录数据库,但是不可以创建实体和不可以创建数据库结构
select *from role_sys_privs;
grant connect to yc1;
--将可以连接的角色赋予给yc1,则yc1就是应该可以连接数据库的人,类似于 create session。create table StuInfos(sid int);
select *from StuInfos;
create table stuInfo(sid int primary key ,--主键 primary key 非空且唯一(主键约束)sname varchar2(10)not null,--姓名不能为空,(非空约束)sex char(2)check(sex in('男','女')),--(检查约束),check, age number(3,1)constraint ck_stuInfo_age check(age>10 and age<100),--也可以用varchar ;age between 10 and 100 ,在10和100之间,是一个闭区间 tel number(15)unique not null,--唯一约束,address varchar2(200)default '什么鬼')
insert into stuInfo values(3,'大大','男',18,4321543,default);insert into stuInfo values(1,'张三','男',10);select *from stuInfo;
drop table stuInfo;
create table classInfo(cid int primary key,--班级id cname varchar2(20)not null unique--班级名)create table stuInfo(sid int primary key, sname varchar2(20), cid int constraint fofk_stuInfo_cid references classInfo(cid)on delete cascade)insert into classInfo values(1,'1班');insert into classInfo values(2,'2班');insert into classInfo values(3,'3班');insert into classInfo values(4,'4班');
select *from classInfo;select *from stuInfo;
insert into stuInfo values(1001,'张三',2);insert into stuInfo values(1002,'张四',4);
update classInfo set cid=1 where cid=8;
drop table stuInfo;--要先删除这个 drop table classInfo;--再删除这个
delete classInfo where cid=4;--同时删除这两个表中的4
--删除用户的时候
drop user yc1 [cascade]--删除用户的同时把它创建的对象都一起删除
--修改表
--
1、添加表中字段
--alter table 表名 add 字段名 类型
alter table classInfo add status varchar2(10)default '未毕业'
--
2、修改已有字段的数据类型
--alter table 表名 modify 字段名 类型 alter table classInfo modify status number(1)
--
3、修改字段名
--alter table 表名 rename column 旧字段名 to 新的字段名 alter table classInfo rename column cname to 班级名;
--
4、删除字段--alter table 表名 drop column 字段名 alter table classInfo drop column status;
--
5、修改表名
--rename 旧表名 to 新表名 rename classInfo to 班级信息;
--删除表
--
1、截断表效率高,每删除一次会产生一次日志
2、截断会释放空间,而delete不会释放空间
--删除表结构和数据 drop table 表名;--删除表中所有数据 truncate table classInfo;delete classInfo;
create table classInfo(cid int primary key,--班级id cname varchar2(20)not null unique ,--班级名 stasuts varchar2(100));select *from classInfo;
--数据的操作
--增加数据语法
--insert into 表名[(列名,....)] values(对应的数据的值);
insert into classInfo values(1,'一班','未毕业');--需要按照表结构的顺序插入 insert into classInfo values(4,'六班','未毕业');insert into classInfo(cname,cid)values('二班',2);--需要按照括号中的顺序插入,但是 not null primary key 必须插入的。
insert into classInfo(cname,cid)values('三班',3);
--删除的语法
--delete 表名 [where 条件] delete classInfo where cid>=2;
--修改记录的语法
--update 表名 set [字段='值' ] [where 条件] update classInfo set cname='三班';--会修改所有该字段 update classInfo set cname='四班' where cid=1;update classInfo set cname='五班', stasuts ='未毕业' where cid=3;
--alter table classInfo drop constraint SYS_C0011213;
--添加多个时可以使用序列--用序列来做自动增长
create sequence seq_classInfo_cid start with 1001 increment by 1;
insert into classInfo values(seq_classInfo_cid.Nextval,'七班','未毕业');insert into classInfo values(seq_classInfo_cid.Nextval,'八班','未毕业');insert into classInfo values(seq_classInfo_cid.Nextval,'九班','未毕业');insert into classInfo values(seq_classInfo_cid.Nextval,'十班','未毕业');
create table classInfo2(cid int primary key,--班级id cname varchar2(20)not null unique ,--班级名 stasuts varchar2(100));select *from classInfo2;drop table classInfo2;
insert into classInfo2 select *from classInfo;insert into classInfo(cname,cid)select cname,cid from classInfo;alter table classInfo2 drop constraint SYS_C0011213;
select seq_classInfo_cid.nextval from dual;select seq_classInfo_cid.Currval from dual;
--直接创建一个新表,并拿到另一个表其中的数据 create table newTable as select cname,cid from classInfo;create table newTable1 as select *from classInfo;
select *from newTable;select *from newTable1;insert into newTable1 values(1008,'dg','');
直接在使用scott登陆,进行查询操作
----------------------简单查询
select *from emp;
select empno as id,ename as name from emp;
select empno 编号,ename 姓名 from emp;
--去除重复
select job from emp;select distinct job from emp;select job,deptno from emp;select distinct job,deptno from emp;
--字符串的连接
select '员工编号是' ||empno || '姓名是' ||ename ||'工作是'||job from emp;
--乘法
select ename,sal *12 from emp;--加减乘除都类似
---------限定查询
--奖金大于1500的
select *from emp where sal>1500;--有奖金的
select *from emp where comm is not null;--没有奖金的
select *from emp where comm is null;--有奖金且大于1500的
select *from emp where sal>1500 and comm is not null;--工资大于1500或者有奖金的
select *from emp where sal>1500 or comm is not null;--工资不大于1500且没奖金的
select *from emp where sal<=1500 and comm is null;select *from emp where not(sal >1500 or comm is not null);--工资大于1500但是小于3000的
select *from emp where sal>1500 and sal<3000;select *from emp where sal between 1500 and 3000;--between是闭区间,是包含1500和3000的
--时间区间
select *from emp where hiredate between to_date('1981-01-01','yyyy-MM-dd')and to_date('1981-12-31','yyyy-MM-dd');--查询雇员名字
select *from emp where ename='SMITH';--查询员工编号
select *from emp where empno=7369 or empno=7499 or empno=7521;select *from emp where empno in(7369,7499,7521);select *from emp where empno not in(7369,7499,7521);--排除这3个,其他的都可以查
--模糊查询
select *from emp where ename like '_M%';--第2个字母为M的 select *from emp where ename like '%M%';select *from emp where ename like '%%';--全查询
--不等号的用法
select * from emp where empno!=7369;select *from emp where empno<> 7369;
--对结果集排序--查询工资从低到高
select *from emp order by sal asc;select *from emp order by sal desc,hiredate desc;--asc 当导游列相同时就按第二个来排序--字符函数
select *from dual;--伪表 select 2*3 from dual;select sysdate from dual;--变成大写
select upper('smith')from dual;--变成小写
select lower('SMITH')from dual;--首字母大写
select initcap('smith')from dual;--连接字符串
select concat('jr','smith')from dual;--只能在oracle中使用 select 'jr' ||'smith' from dual;--推荐使用--截取字符串
select substr('hello',1,3)from dual;--索引从1开始--获取字符串长度 select length('hello')from dual;--字符串替换
select replace('hello','l','x')from dual;--把l替换为x-------通用函数--数值函数--四舍五入
select round(12.234)from dual;--取整的四舍五入 12 select round(12.657,2)from dual;--保留2位小数 select trunc(12.48)from dual;--取整
select trunc(12.48675,2)from dual;--保留2位小数--取余
select mod(10,3)from dual;--10/3取余 =1
--日期函数
--日期-数字=日期 日期+数字=日期 日期-日期=数字
--查询员工进入公司的周数
select ename,round((sysdate-hiredate)/7)weeks from emp;--查询所有员工进入公司的月数
select ename,round(months_between(sysdate,hiredate))months from emp;--求三个月后的日期
select add_months(sysdate,6)from dual;select next_day(sysdate,'星期一')from dual;--下星期 select last_day(sysdate)from dual;--本月最后一天
select last_day(to_date('1997-1-23','yyyy-MM-dd'))from dual;
--转换函数 select ename , to_char(hiredate,'yyyy')年,to_char(hiredate,'mm')月,to_char(hiredate,'dd')日 from emp;
select to_char(10000000,'$999,999,999')from emp;
select to_number('20')+to_number('80')from dual;--数字相加
--查询员工年薪
select ename,(sal*12+nvl(comm,0))yearsal from emp;--空和任何数计算都是空
--Decode函数,类似if else if(常用)
select decode(1,1,'one',2,'two','no name')from dual;--查询所有职位的中文名 select ename, decode(job, 'CLERK', '业务员', 'SALESMAN', '销售', 'MANAGER', '经理', 'ANALYST', '分析员', 'PRESIDENT', '总裁', '无业')from emp;
select ename, case when job = 'CLERK' then '业务员' when job = 'SALESMAN' then '销售' when job = 'MANAGER' then '经理' when job = 'ANALYST' then '分析员' when job = 'PRESIDENT' then '总裁' else '无业' end from emp;
-----------------------------
--多表查询
select *from dept;select *from emp,dept order by emp.deptno;select *from emp e,dept d where e.deptno=d.deptno;select e.*,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;
--查询出雇员的编号,姓名,部门编号,和名称,地址
select e.empno,e.ename,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;
--查询出每个员工的上级领导
select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno;
select e.empno,e.ename,d.dname from emp e,dept d ,salgrade s, emp e1 where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.mgr=e1.empno;
select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno(+);
--外连接
select *from emp order by deptno;--查询出每个部门的员工 /* 分析:部门表是全量表,员工表示非全量表,在做连接条件时,全量表在非全量表的哪端,那么连接时全量表的连接条件就在等号哪断 */--左连接
select * from dept d,emp e where d.deptno=e.deptno(+)order by e.deptno;--右连接
select * from emp e,dept d where e.deptno(+)=d.deptno order by e.deptno;
-----------------------------作业
--查询与smith相同部门的员工姓名和雇佣日期 select *from emp t where t.deptno=(select e.deptno from emp e where e.ename='SMITH')and t.ename<> 'SMITH';
--查询工资比公司平均工资高的员工的员工号,姓名和工资 select t.empno,t.ename,t.sal from emp t where t.sal>(select avg(sal)from emp);
--查询各部门中工资比本部门平均工资高的员工号,姓名和工资 select t.empno,t.ename,t.sal from emp t,(select avg(e.sal)avgsal,e.deptno from emp e group by e.deptno)a where t.sal>a.avgsal and t.deptno=a.deptno;--查询姓名中包含字母u的员工在相同部门的员工的员工号和姓名 select t.empno,t.ename from emp t where t.deptno in(select e.deptno from emp e where e.ename like '%U%')and t.empno not in(select e.empno from emp e where e.ename like '%U%');
--查询管理者是king的员工姓名和工资 select t.ename,t.sal from emp t where t.mgr in(select e.empno from emp e where e.ename='KING');
--------------------------sql1999语法
select *from emp join dept using(deptno)where deptno=20;select *from emp natural join dept;select *from emp e join dept d on e.deptno=d.deptno;select *from dept;select *from dept d left join emp e on d.deptno=e.deptno;select *from dept d,emp e where d.deptno=e.deptno(+);
---分组
select count(empno)from emp group by deptno;select deptno,job,count(*)from emp group by deptno,job order by deptno;select *from EMP for UPDATE;
--group by 后面有的字段,select后才可以有,group by后面没有的字段,select后面绝对不能有
select d.dname, d.loc, count(e.empno)from emp e, dept d where e.deptno = d.deptno group by d.dname, d.loc;
---------子查询
select *from emp t where t.sal>(select *from emp e where e.empno=7654);
select rownum ,t.* from emp t where rownum <6;
--pagesize 5 select *from(select rownum rw,a.* from(select *from emp)a where rownum <16)b where b.rw>10;select *from(select *from emp)where rownum>0;--索引
create index person_index on person(p_name);
--视图
create view view2 as select *from emp t where t.deptno=20;select *from view2;
-------------pl/sql--plsql是对sql语言的过程化扩展-----declare begin dbms_output.put_line('hello world');end;-------declare age number(3);marry boolean := true;--boolean不能直接输出 pname varchar2(10):= 're jeknc';begin age := 20;dbms_output.put_line(age);if marry then dbms_output.put_line('true');else dbms_output.put_line('false');end if;dbms_output.put_line(pname);end;
--常量和变量
--引用变量,引用表中的字段的类型
Myname emp.ename%type;--使用into来赋值
declare pname emp.ename%type;begin select t.ename into pname from emp t where t.empno=7369;dbms_output.put_line(pname);end;
--记录型变量
Emprec emp%rowtype;--使用into来赋值
declare Emprec emp%rowtype;begin select t.* into Emprec from emp t where t.empno=7369;dbms_output.put_line(Emprec.empno || ' '||Emprec.ename||' '||Emprec.job);end;
--if分支
语法1:
IF 条件 THEN 语句1;语句2;END IF;语法2:
IF 条件 THEN 语句序列1; ELSE 语句序列 2; END IF; 语法3:
IF 条件 THEN 语句;ELSIF 条件 THEN 语句;ELSE 语句;END IF;--1 declare pname number:=# begin if pname = 1 then dbms_output.put_line('我是1');else dbms_output.put_line('我不是1');end if;end;--2 declare pname number := # begin if pname = 1 then dbms_output.put_line('我是1');elsif pname = 2 then dbms_output.put_line('我是2');else dbms_output.put_line('我不是12');end if;end;
--loop循环语句 语法2: Loop EXIT [when 条件];…… End loop
--1 declare pnum number(4):=0;
begin while pnum < 10 loop dbms_output.put_line(pnum);pnum := pnum + 1;end loop;end;
--2(最常用的循环)declare pnum number(4):=0;begin loop exit when pnum=10;pnum:=pnum+1;dbms_output.put_line(pnum);end loop;end;--3 declare pnum number(4);begin for pnum in 1..10 loop dbms_output.put_line(pnum);end loop;end;
-----游标 语法:
CURSOR 游标名 [(参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句;例如:cursor c1 is select ename from emp;
declare cursor c1 is select * from emp;emprec emp%rowtype;begin open c1;loop fetch c1 into emprec;exit when c1%notfound;dbms_output.put_line(emprec.empno || ' ' || emprec.ename);end loop;close c1;--要记得关闭游标 end;
--------例外
--异常,用来增强程序的健壮性和容错性--no_data_found(没有找到数据)--too_many_rows(select …into语句匹配多个行)--zero_pide(被零除)--value_error(算术或转换错误)--timeout_on_resource(在等待资源时发生超时)
--写出被0除的例外程序 declare pnum number(4):= 10;begin pnum := pnum / 0;exception when zero_pide then dbms_output.put_line('被0除了');when value_error then dbms_output.put_line('算术或转换错误');when others then dbms_output.put_line('其他异常');end;
--自定义异常
--No_data exception;--要抛出raise no_data;
declare cursor c1 is select * from emp t where t.deptno = 20;no_data exception;emprec emp%rowtype;begin open c1;loop fetch c1 into emprec;if c1%notfound then raise no_data;else dbms_output.put_line(emprec.empno || ' ' || emprec.ename);end if;end loop;close c1;
exception when no_data then dbms_output.put_line('无员工');when others then dbms_output.put_line('其他异常');end;
--存储过程 语法:
create [or replace] PROCEDURE 过程名[(参数名 in/out 数据类型)] AS begin PLSQL子程序体; End;
或者
create [or replace] PROCEDURE 过程名[(参数名 in/out 数据类型)] is begin PLSQL子程序体; End 过程名;
-----创建一个存储过程helloworld create or replace procedure helloworld is begin dbms_output.put_line('hello world');end helloworld;
------创建一个涨工资的
create or replace procedure addsal(eno in emp.empno%type)is emprec emp%rowtype;begin select * into emprec from emp t where t.empno = eno;
update emp t set t.sal = t.sal + 100 where t.empno = eno;dbms_output.put_line('涨工资前是' || emprec.sal || ',涨工资后是' ||(emprec.sal + 100));end addsal;
-----------------java代码调用存储过程和函数--存储过程--create or replace procedure acc_yealsal(eno in emp.empno%type,yearsal out number)is pcomm emp.comm%type;psal emp.sal%type;begin select t.sal,t.comm into psal,pcomm from emp t where t.empno=eno;yearsal :=psal*12 +nvl(pcomm,0);end;----存储函数
create or replace function 函数名(Name in type, Name in type,...)return 数据类型 is 结果变量 数据类型;begin
return(结果变量);end函数名;--存储函数计算年薪
create or replace function accf_yearsal(eno in emp.empno%type)return number is Result number;psal emp.sal%type;pcomm emp.comm%type;begin select t.sal, t.comm into psal, pcomm from emp t where t.empno = eno;Result := psal * 12 + nvl(pcomm, 0);return(Result);end accf_yearsal;
-------触发器
--触发语句:增删改: 语法:
CREATE [or REPLACE] TRIGGER 触发器名 {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF 列名]} ON 表名
[FOR EACH ROW [WHEN(条件)] ] begin PLSQL 块 End 触发器名
---插入一个新员工则触发
create or replace trigger insert_person after insert on emp begin dbms_output.put_line('插入新员工');end;select *from emp;insert into emp values(1001,'李四','管理',7902,sysdate,100,100,20);
--raise_application_error(-20001, '不能在非法时间插入员工')
--================================ SQL> @ E:powerDesignerA_脚本user.sql--导入脚本文件
select *from H_USER;
insert into h_user valuer(sequserid.nextval,'a','a',sysdate,'北京',1);
--数据库建模
--一对多:多的一端是2,箭头指向的是表1,即少的一端
--在实体类中一的一端的实体类有多的一端的实体类的集合属性
--使用powerDesiger进行数据库建模,然后将数据导入,导入到plsql中进行使用
--------------------连接远程数据库--方法1,修改localhost的地址 ORCL =(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl.lan)))--方法2--或者直接在登陆界面在database中输入远程数据库的ip地址和端口号进行远程登陆 1.create user username identified by password;//建用户名和密码oracle ,oracle
2.grant connect,resource,dba to username;//授权 grant connect,resource,dba,sysdba to username;
3.connect username/password//进入。
4.select table_name,column_name from user_tab_columns where table_name='TABLE_NAME';//查询表中的表名,字段名等等。最后的table_name要大写。
5.如何执行脚本SQL文件? SQL>@PATH/filename.sql;
7.查询用户下的所有表 select distinct table_name from user_tab_columns;===仅显示一列表名。
8.如何搜索出前N条记录?
select * from tablename where rownum 9.查找用户下的所有表:select * from tab;--查询该用户下的所有表及视图(显示表名tname,类型tabname和clusterid) 2、显示当前连接用户 SQL> show user –不能用在sql窗口 只能用在command命令窗口。 3、查看系统拥有哪些用户 SQL> select * from all_users; 4、新建用户并授权 SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; 5、连接到新用户 SQL> conn a/a –或者是connect a/a 6、查询当前用户下所有对象 SQL> select * from tab;--table或是view 7、建立第一个表 SQL> create table a(a number); 8、查询表结构 SQL> desc a 9、插入新记录 SQL> insert into a values(1); 10、查询记录 SQL> select * from a; 11、更改记录 SQL> update a set a=2; 12、删除记录 SQL> delete from a; 13、回滚 SQL> roll; SQL> rollback; 14、提交 SQL> commit; select * from (select t.*,dense_rank()over(order by cardkind)rank from cardkind t) where rank = 2; 46.如何在字符串里加回车? select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual;--‘||chr(10)||’作为换行符 53.如何使select语句使查询结果自动生成序号? select rownum COL from table;--主要就是oracle中引入了rownum 54.如何知道数据裤中某个表所在的tablespace? select tablespace_name from user_tables where table_name='TEST';--table_name名称要大写。 select * from user_tables中有个字段TABLESPACE_NAME,(oracle); select * from dba_segments where …; 55.怎么可以快速做一个和原表一样的备份表? create table new_table as(select * from old_table); 59.请问如何修改一张表的主键? alter table aaa drop constraint aaa_key; alter table aaa add constraint aaa_key primary key(a1,b1); 60.改变数据文件的大小? 用 ALTER DATABASE....DATAFILE....; 手工改变数据文件的大小,对于原来的 数据文件有没有损害。 61.怎样查看ORACLE中有哪些程序在运行之中? 查看v$session表 62.怎么可以看到数据库有多少个tablespace? select * from dba_tablespaces; 72.怎样查看哪些用户拥有SYSDBA、SYSOPER权限? SQL>conn sys/change_on_install –登不上去 SQL>select * from V_$PWFILE_USERS;76.如何显示当前连接用户? SHOW USER 77.如何查看数据文件放置的路径 ? col file_name format a50 SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id; 79.如何改变一个字段初始定义的Check范围? SQL> alter table xxx drop constraint constraint_name; 之后再创建新约束: SQL> alter table xxx add constraint constraint_name check(); 83.如何执行脚本SQL文件? SQL>@所在的文件路径 /filename.sql;例如放在E盘的根目录下则应该是 @E:a.sql;回车就OK了。 84.如何快速清空一个大表? SQL>truncate table table_name; 85.如何查有多少个数据库实例? SQL>SELECT * FROM V$INSTANCE; 86.如何查询数据库有多少表? SQL>select * from all_tables; 87.如何测试SQL语句执行所用的时间? SQL>set timing on; SQL>select * from tablename; 89.字符串的连接 SELECT CONCAT(COL1,COL2)FROM TABLE; SELECT COL1||COL2 FROM TABLE; 90.怎么把select出来的结果导到一个文本文件中? SQL>SPOOL C:ABCD.TXT; SQL>select * from table; SQL >spool off; 91.怎样估算SQL执行的I/O数 ? SQL>SET AUTOTRACE ON; SQL>SELECT * FROM TABLE; OR SQL>SELECT * FROM v$filestat; 可以查看IO数 92.如何在sqlplus下改变字段大小? alter table table_name modify(field_name varchar2(100)); 改大行,改小不行(除非都是空的) 93.如何查询某天的数据? select * from a where trunc(日期字段)=to_date('2003-05-02','yyyy-mm-dd');若是date型数据 insert into bsyear values(to_date('20130427','yyyymmdd'));或者是insert into bsyear values('27-4月-2013'); 94.sql 语句如何插入全年日期? create table BSYEAR(d date);insert into BSYEAR select to_date('20030101','yyyymmdd')+rownum-1 from all_objects where rownum <= to_char(to_date('20031231','yyyymmdd'),'ddd');--在表后直接插入365行数据日期。 紧急插入几条重要的: 如何在Oracle中复制表结构和表数据 1.复制表结构及其数据: create table table_name_new as select * from table_name_old 2.只复制表结构: create table table_name_new as select * from table_name_old where 1=2;或者: create table table_name_new like table_name_old 3.只复制表数据: 如果两个表结构一样: insert into table_name_new select * from table_name_old 如果两个表结构不一样: insert into table_name_new(column1,column2...)select column1,column2...from table_name_old 创建带主键的表: create table stuInfo(stuID int primary key,stuName varchar2(20),age int);或是不直接增加主键 alter table stuInfo add constraint stuInfo _PK primary key(stuID) 95.如果修改表名? alter table old_table_name rename to new_table_name; 97.如何知道用户拥有的权限? SELECT * FROM dba_sys_privs;--一个权限对应一条数据,这样对于同一个用户就有多条数据了。 98.从网上下载的ORACLE9I与市场上卖的标准版有什么区别? 从功能上说没有区别,只不过oracle公司有明文规定;从网站上下载的oracle产品不得用于商业用途,否则侵权。 101.如何搜索出前N条记录? SELECT * FROM empLOYEE WHERE ROWNUM < n ORDER BY empno;Select * from a where rownum 104.如何统计两个表的记录总数? select(select count(id)from aa)+(select count(id)from bb)总数 from dual;--总数那是没有单引号的,双引号可以。 106.如何在给现有的日期加上2年?(select add_months(sysdate,24)from dual;--2015/4/27 9:28:52 110.tablespace 是否不能大于4G? 没有限制.111.返回大于等于N的最小整数值? SELECT CEIL(N)FROM DUAL; 112.返回小于等于N的最小整数值? SELECT FLOOR(N)FROM DUAL; 113.返回当前月的最后一天? SELECT LAST_DAY(SYSDATE)FROM DUAL; ; 115.如何找数据库表的主键字段的名称? SQL>SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='TABLE_NAME';--我没有查出来。 116.两个结果集互加的函数? SQL>SELECT * FROM BSEMPMS_OLD INTERSECT SELECT * FROM BSEMPMS_NEW; SQL>SELECT * FROM BSEMPMS_OLD UNION SELECT * FROM BSEMPMS_NEW; SQL>SELECT * FROM BSEMPMS_OLD UNION ALL SELECT * FROM BSEMPMS_NEW; 117.两个结果集互减的函数? SQL>SELECT * FROM BSEMPMS_OLD MINUS SELECT * FROM BSEMPMS_NEW; 139.如何查找重复记录? SELECT * FROM TABLE_NAME WHERE ROWID!=(SELECT MAX(ROWID)FROM TABLE_NAMe WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2); 140.如何删除重复记录? DELETE FROM TABLE_NAME WHERE ROWID!=(SELECT MAX(ROWID)FROM TABLE_NAME D WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2); 162.如何知道表在表空间中的存储情况? select segment_name,sum(bytes),count(*)ext_quan from dba_extents where tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name;--把&tablespace_name改成相应的表空间名称。 Oracel 中常使用的语法(部分) Oracel 中常使用的语法 2、显示当前连接用户 :SQL> show user3、查看系统拥有哪些用户 :SQL> select * from all_users; 4、新建用户并授权:SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; 5、连接到新用户 :SQL> conn a/a6、查询当前用户下所有对象:SQL> select * from tab; 7、建立第一个表 :SQL> create table a(a number); 8、查询表结构SQL> desc a9、插入新记录SQL> insert into a values(1); 10、查询记录SQL> select * from a; 11、更改记录SQL> update a set a=2; 12、删除记录SQL> delete from a; 13、回滚SQL> roll;或SQL> rollback; 14、提交SQL> commit; 用户授权: GRANT ALTER ANY INDEX TO “user_id ” GRANT “dba ” TO “user_id ”; ALTER USER “user_id ” DEFAULT ROLE ALL 创建用户: CREATE USER “user_id ” PROFILE “DEFAULT ” IDENTIFIED BY “ DEFAULT TABLESPACE ”USERS “ TEMPORARY TABLESPACE ”TEMP “ ACCOUNT UNLOCK;GRANT ”CONNECT “ TO ”user_id “; 用户密码设定: ALTER USER ”CMSDB “ IDENTIFIED BY ”pass_word “ 表空间创建: CREATE TABLESPACE ”table_space “ LOGGING DATAFILE 'C:ORACLEORADATAdbstable_space.ora' SIZE 5M ---------- 1、查看当前所有对象:SQL > select * from tab; 2、建一个和a表结构一样的空表 SQL > create table b as select * from a where 1=2; SQL > create table b(b1,b2,b3)as select a1,a2,a3 from a where 1=2; 3、察看数据库的大小,和空间使用情况 SQL > col tablespace format a20 SQL > select b.file_id文件ID,b.tablespace_name表空间,b.file_name物理文件名,b.bytes总字节数,(b.bytes-sum(nvl(a.bytes,0)))已使用,sum(nvl(a.bytes,0))剩余,sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比 from dba_free_space a,dba_data_files b where a.file_id=b.file_id group by b.tablespace_name,b.file_name,b.file_id,b.bytes order by b.tablespace_name / dba_free_space--表空间剩余空间状况 dba_data_files--数据文件空间占用情况 4、查看现有回滚段及其状态 : SQL > col segment format a30 SQL > SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS; 5、查看数据文件放置的路径 :SQL > col file_name format a50 SQL > select tablespace_name,file_id,bytes/1024/1024,file_name fromdba_data_files order by file_id; 6、显示当前连接用户 :SQL > show user7、把SQL*Plus当计算器 :SQL > select 100*20 from dual; 8、连接字符串:SQL > select 列1 | |列2 from 表1; SQL > select concat(列1,列2)from 表1; 9、查询当前日期和时间: SQL > select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss')from dual; 10、用户间复制数据:SQL > copy from user1 to user2 create table2 using select * from table1; 11、视图中不能使用order by,但可用group by代替来达到排序目的SQL > create view a as select b1,b2 from b group by b1,b2; 12、通过授权的方式来创建用户 :SQL > grant connect,resource to test identified by test; SQL > conn test/test13、查出当前用户所有表名: select unique tname from col; --------- /* 向一个表格添加字段 */alter table alist_table add address varchar2(100); /* 修改字段 属性 字段为空 */alter table alist_table modify address varchar2(80); /* 修改字段名字 */ create table alist_table_copy as select ID,NAME,PHONE,EMAIL, QQ as QQ2,/*qq 改为qq2*/ ADDRESS from alist_table;drop table alist_table; rename alist_table_copy to alist_table /* 修改表名 */ 空值处理,有时要求列值不能为空 :create table dept(deptno number(2)not null, dname char(14), loc char(13)); 在基表中增加一列: alter table dept add(headcnt number(3)); 修改已有列属性 :alter table dept modify dname char(20); 注:只有当某列所有值都为空时,才能减小其列值宽度。只有当某列所有值都为 空时,才能改变其列值类型。 只有当某列所有值都为不空时,才能定义该列为not null。 例:alter table dept modify(loc char(12));alter table dept modify loc char(12); alter table dept modify(dname char(13),loc char(12)); 查找未断连接 : select process,osuser,username,machine,logon_time ,sql_text from v$session a,v$sqltext b where a.sql_address=b.address; --- 1.以USER_开始的数据字典视图包含当前用户所拥有的信息, 查询当前用户所拥有的表信息: select * from user_tables; 2.以ALL_开始的数据字典视图包含ORACLE用户所拥有的信息, 查询用户拥有或有权访问的所有表信息: select * from all_tables; 3.以DBA_开始的视图一般只有ORACLE数据库管理员可以访问:select * from dba_tables; 4.查询ORACLE用户: conn sys/change_on_installselect * from dba_users; conn system/manager;select * from all_users; 5.创建数据库用户:CREATE USER user_name IDENTIFIED BY password;GRANT CONNECT TO user_name;GRANT RESOURCE TO user_name; 授权的格式: grant(权限)on tablename to username; 删除用户(或表):drop user(table)username(tablename)(cascade); 6.向建好的用户导入数据表 : IMP SYSTEM/MANAGER FROMUSER = FUSER_NAME TOUSER = USER_NAME FILE = C:EXPDAT.DMPCOMMIT = Y 7.索引: create index [index_name] on [table_name](”column_name ") 一、SQL SERVER的理解 SQL SERVER服务器就像一栋大楼,大楼里的机房就像服务器的数据库,机房里的电脑如同数据库里的表 1、登录用户可以登录服务器——可以进大楼 2、登录用户成为数据库用户才能进指定的数据库——进入大楼的人给了某个机房的钥匙 才能进入机房 3、登录用户有权限使用表——进入机房的人有电脑的密码才能使用电脑 二、ORACLE的理解 ORACLE服务器(全局数据库)就像一个商场,商场的每一家公司是表空间,公司的业务是表 1、数据库由多个表空间组成——商场里有多家公司组成2、表空间由段组成——公司要有自己的经营业务,可以只有一个业务,就是一个表空 间中只有一个段,可以有多个业务,就是一个表空间有多个段 3、段由区组成——单个业务的细分类别。例如有家公司经营三个业务,卖书,卖家电,卖衣服,则每个业务就是一个段。而每个业务又有细分,比如卖书的话要进行分类了。计算机区,人文区,小说区等,每一区都要放上书架存放书籍,则书架就是oracle块,存放数据的三、数据库,表空间,用户(指定默认表空间),表统统由管理员管理 四、在OEM中管理数据库的步骤 1、创建 1)存储——表空间——创建表空间(TOMSPACE)(类似于在SQL中创建数据库,通常可以省略,使用默认表空间为USERS,临时表空间为TEMP) 2)首先展开安全性——创建新用户(TOM,指定表空间)(类似于在SQL中指定 数据库用户) 3)创建表——指定方案(用户)和表空间(列名不要带<>) 4)设置约束 5)输入信息:方案——用户名——表——右击——查看 /编辑目录… 2、修改 1)方案——用户名——表 2)修改表结构,添加约束 3、删除: 右击表——移去 五、注意事项 1、刚创建的用户不会出现在方案中,只有创建了一个表指定方案和表空间,该用户的方案名就会出现在方案中,此时就可以方便为该方案创建其他表 1)新创建的用户能在SQLPLUS中登录,为什么不能在企业管理器中登录呢? 解答:需要授予 SELECT ANY DIRECTORY权限才能正常登录企业管理器,但没有其他权限 2)可以对创建的用户在安全性中赋予角色权限,如DBA,则该用户就是数据库管理 员 3)SYS用户主要用来维护系统信息和管理实例,只能以SYSOPER或SYSDBA角 色登录 4)安装oracle的用户自动为ora-dba权限,自动是sys用户,所以在登录时不需要 用户名和密码,只要选中以sysdba登录。其他用户登录计算机系统,在使用oracle 时就是正常登录状态了。 2、向表中添加日期数据:时间格式为DD-MM-YYYY怎么修改呢?如何插入时间数 据 1)先在SQLPLUS中SELECT SYSDATE FROM DUAL;就知道日期的格式 2)alter session set NLS_DATE_FORMAT='YYYY-MM-DD';修改当前输入格式 3)oracle中的默认格式是:‘dd-mm-yyyy’ ;修改语句:alter session set nls_date_format='yyyy-mm-dd';修改后输入和显示都为指定格式,缺点是只对当前会话起作用 假如你是要永久修改的话,改注册表: regedit->hkey_local_machine->oracle->homeo-> NLS_DATE_FORMAT值YYYY-MM-DD(经验证不管用) 默认日期:50年之前是当前世纪,50年之后是之前世纪,31-12月-49代表2049年01-1月-50 代表1950年 4)由于在表编辑器中to_date函数的格式是dd-mon-yyyy,输入时为如下格式13-6 月-1983(代码编辑时一样,世纪可以省略,代表当前世纪) 5)to_char通常用于查询语句; to_date通常用于增删改语句 6)两个’代表一个’ 六、代码编辑器 1、SQL PLUS2、SQL PLUS WORKSHEET3、isqlplus 设置列宽:set linesize 50; 七、与SQL2000中的查询分析器不同,SQL plus worksheet执行所有语句,不单单执行选中语句 八、编辑——清除;可以清除查询结果 九、查看环境变量:select * from v$nls_parameters; 十、示例用户 1)scott/tigernormal登录 2)hr : 需要解锁和重设密码(alter user hr account unlock;) 十一、查看和更改oracle http占用端口号,D:ora9ApacheApacheconf下,httpd.conf和httpd.conf.default中将80修改,然后重新启动HTTP服务 加个字符串 六、工具的使用 1、net manager: 配置服务主机名和监听主机名 2、net configuration assistant:配置监听程序,本地服务名配置等 /*****************************************************************************/ oracle小知识点 1、数据操作时,字段区分大小写 2、Oracle两种认证模式:(1)操作系统认证(2)文件口令认证。 初始化参数的文件目录为D:oracle_programdatabase3、sqlplus中使用 help index查看帮助信息目录,? 命令:查看某个命令的详细用法 连接数据库后才能使用 5、当代码中使用函数时,函数中固定的关键字必须写正确,当放在字符串中的时候,编译没有错误,运行时才会出现错误,通常是SQL递归错误 目 录 摘要........................................................................................................................................................iii Abstract...............................................................................................................................................iv 第一章 绪论.........................................................................................................................................1 1.1 国内外研究动态..................................................................................................................1 1.2 容灾备份系统的现状分析...............................................................................................1 第二章 数据库备份方案...................................................................................................................3 2.1 备份文件...............................................................................................................................3 2.1.1 定义...............................................................................................................................3 2.1.2 主要的内容...................................................................................................................4 2.1.3 优先级别.......................................................................................................................4 2.1.4文件之间的转化............................................................................................................4 2.2 备份恢复方案......................................................................................................................4 2.2.1 备份恢复的分类...........................................................................................................5 2.2.2 备份方案的介绍...........................................................................................................5 2.3 数据库的备份策略.............................................................................................................5 2.3.1 概述...............................................................................................................................5 第三章 备份与恢复功能设计与实现............................................................................................6 3.1 冷备份(脱机备份).........................................................................................................6 3.1.1 定义...............................................................................................................................6 3.1.2 优点与缺点...................................................................................................................6 3.1.3 步骤...............................................................................................................................6 3.1.4 备份恢复功能设计与实现...........................................................................................8 3.2 热备份恢复(联机备份恢复)....................................................................................10 3.2.1定义..............................................................................................................................10 3.2.2 优点与缺点.................................................................................................................10 3.2.3 备份设计与实现.........................................................................................................10 第四章 总结.......................................................................................................................................38 参考文献..............................................................................................................................................39 -i- 谢 辞.....................................................................................................................................................41 -ii- Oracle database 备份与恢复 摘要:随着信息化的发展,数据对我们日常生活中有着举足轻重的影响。生活不能缺少数据,因此数据的备份和恢复在当前至关重要。它能保证数据的完整性、安全性、一致性。它也使数据在非正常情况下丢失后,还能恢复到事故前的状态,确保损失最少,风险最少。 本文主要介绍在Linux服务器端,通过oracle数据库的SQL*plus工具,对oracle数据库进行冷备份恢复(脱机备份)和热备份恢复(联机备份),分别对数据库的参数文件,控制文件,数据文件,日志文件进行备份与恢复。通过模拟不同情况下,数据库文件丢失的情况下,对数据库进行完全恢复和不完全恢复。本文主要详细阐述了不完全恢复时需要注意的要点和不完全恢复的特点。通过本文对备份恢复情况的研究,可以编写相关的数据库备份恢复脚本,简化备份步骤,希望能实现Linux操作系统下,数据库自动备份与恢复。 关键词:oracle;备份;恢复 -iii- Oracle database backup and recovery Abstract:With the development of information,the data has an important influence in our daily life.Our life can’t lack of data,so that data backup and recovery in current is very important.It can guarantee the integrity,the consistency and security of the data.It also can ensure that the data can return to normal statue after lose data.This paper describes the Linux server, oracle database through SQL * plus tools, cold oracle database backup and recovery(offline backup)and hot backup and recovery(online backup), respectively, the parameters of the database files, control files, data files the log files are backed up and restored.By simulating different scenarios, the database files are missing in the case, the database is fully recovered and incomplete recovery.This paper elaborates incomplete recovery points to be noted and incomplete recovery features.Through this case study on backup and recovery, you can write relevant database backup and recovery scripts, simplify backup step, hoping to achieve the Linux operating system, automatic database backup and recovery.Key words:oracle;backup;recovery -iv- 南华大学计算机科学与技术学院毕业设计(论文) 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 外部原因失效时,相同日志组的镜像日志一起失效。 2.1.2 主要的内容 Pfile:系统的参数文件,可用vim,vi等编辑器进行修改,其文件名一般是init System01.dbf:记录系统运行的信息,包含所有的数据字典,PL/SQL程序代码及其他系统信息。 Sysaux01.dbf:system01.dbf文件的辅助文件,存放数据库系统活动的工具,例如LogMiner。 Undotbs01.dbf:存放系统运行时的回退信息,即DML操作后的旧数据信息。Users01.dbf:新建用户未指定存储空间时,默认数据存放的文件。Example01.dbf:存放事例数据信息。 2.1.3 优先级别 Oracle 启动读取参数文件的顺序,如果个文件都不存在,则Oracle会报错: spfile 从spfile来生成pfile create pfile from spfile ,执行完毕后,pfile将$ORACLE_HOME/dbs/init$ORACLE_SID.ora也可以指定pfile 的路径:create pfile = ‘ 第 4 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 2.2.1 备份恢复的分类 按照备份恢复的方式,可以分为逻辑备份、冷备份(脱机备份)、热备份,其中,热备份和冷备份合称为物理备份。按照备份的工具,可以分为EXP/IMP备份、操作系统备份RMAN、第三方工具备份,如VERITAS等。 2.2.2 备份方案的介绍 逻辑备份是指只备份数据库中的数据但不记录数据物理位置的一种备份。导出为数据库作一个二进制的备份,并且这个备份只能由其姐妹程序imp来读取 操作系统备份包括冷备份和热备份。操作系统备份和上面的逻辑备份有本质的区别,它将拷贝整个的数据文件。冷备份在文件级备份开始前数据库必须彻底关闭。热备份是当数据库打开时的操作系统备份。 Recovery Manager(RMAN)是一个使DBA能很方便地对数据库执行备份和恢复任务的oracle应用工具,能够提供DBA对企业数据库备份与恢复操作的集中控制。 2.3 数据库的备份策略 2.3.1 概述 争取的备份策略不仅能保证数据库服务器的7*24小时的高性能的运行,还能保证备份与恢复的快速性与可靠性。采用多级备份就是为了减少每天备份所需要的时间,而保证系统有良好的恢复性。恢复时间与备份时间要有一个权衡。比如只要进行一个数据库的全备份,然后就只备份归档也可以保证能把数据库恢复到最新的状态,但是这样的恢复时间将是不可容忍的。 第 5 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 第三章 备份与恢复功能设计与实现 3.1 冷备份(脱机备份) 3.1.1 定义 冷备份(脱机备份)是当数据库的一切可以被读取和写入的数据库物理文件(参数文件、控制文件,数据文件等)具有一样的系统改变号(SCN)时才能进行的数据库的一致性备份,数据库保持在同一状态的唯一方法是将数据库正常关闭,因此只在数据库正常关闭情况下的备份才算是一致性备份。 冷备份既适用于archivelog模式,也适用于noarchivelog模式。 3.1.2 优点与缺点 优点: 快速并且相对简单的备份方法(因为仅仅需要拷贝文件)。容易恢复至某个时间点上(仅需将文件拷贝回去)。低度维护,高度安全。缺点: 单独使用时,只能提供到“某一时间点上”的恢复。在冷备份过程中,数据库必须是关闭状态。 3.1.3 步骤 (1)、查看数据库文件物理位置。 第 6 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图 2.1 数据文件 图2.2 控制文件 第 7 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.3 日志文件 图2.4 参数文件 (2)关闭运行的数据库。 (3)备份参数文件,控制文件,数据文件,日志文件到指定目录下。 3.1.4 备份恢复功能设计与实现 (1)建立测试表test,并且插入数据‘1’,恢复后,数据应该还是存在的 图2.5 创建测试表 图2.6(2)关闭数据库,执行备份 图2.7 执行冷备份 (3)插入另外一条数据‘2’,恢复时应该丢失的数据 第 8 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.8 插入验证信息 (4)关闭数据库,删除所有的文件:数据文件,控制文件,参数文件,日志文件 图2.9 删除文件 (5)启动数据库 图2.10 启动数据库 (6)恢复冷备份的文件到各自的文件夹 图2.11 冷备份的恢复 (7)验证冷备份的恢复,数据‘2’丢失,只有数据‘1’,备份后插入的数 第 9 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 据不存在。 图2.12 验证恢复 3.2 热备份恢复(联机备份恢复) 3.2.1定义 数据库热备份是指数据库在启动运行的状态下,对数据库的控制文件、参数文件、数据文件等进行备份操作。热备份是用户管理备份恢复的一种方式,也是除了RMAN备份之外比较经常使用的一种备份方式。 热备份仅仅适用于archivelog状态。 3.2.2 优点与缺点 优点: 可以在表空间或数据文件级备份,备份的时间短。备份时数据库仍可以使用。 可达到秒级恢复(恢复到某一时间点上)缺点: 不能出错,否则备份数据不可用。备份方法相对复杂,难于维护。 3.2.3 备份设计与实现 冻结块头-->控制SCN在备份时不发生变化 进行物理拷贝 第 10 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 解冻块头-->让SCN可以变化(当对SCN解冻后,系统会自动更新SCN至最新的状态)查看是否在自动归档模式: 图2.13 非归档模式 如果不是则启动自动归档模式: 图2.14 启动归档模式 第 11 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.15 在线备份数据文件 图2.16 在线备份控制文件 图2.17 备份参数文件和重做日志归档文件 完全恢复: (1)用户表空间数据文件受损 A、查看数据库是否运行在归档模式,确保能把数据完全恢复,如果不是,则设置为自动归档模式 图2.18 归档模式 第 12 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) B、在用户表空间创建测试表,并且插入测试数据 图2.19 插入验证数据 C、对users表空间数据文件进行热备份 图2.20 备份用户空间 D、插入热备份后的另外一条数据,验证热备份完全恢复 图2.21 插入测试数据 第 13 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) E、关闭数据库,删除用户表空间文件,模拟出错 图2.22 模拟故障 查表v$recover_file,用户数据文件需要恢复 图2.23 查看需要回复的数据文件 如果实际中,数据库需要对外服务,但是用户数据文件尚未修复,可以选择先把数据文件离线再进行修复。 图2.24 离线数据文件 第 14 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.25 恢复离线的数据文件 F、查看验证热备份的数据,确认是否完全恢复,重做数据文件到当前的时间点,确保备份后的数据还在,前提是要处于归档模式,切归档重做文件都没被删除 图2.26 查看热备份的效果 (2)用户表空间数据文件受损且无备份的恢复 第一种情况,先删除数据文件,在触发检查点 第 15 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) A、创建用户表空间做测试 图2.27 创建测试数据 B、删除用户表空间,模拟故障,表格还在的原因是因为数据已经缓存到内存了,查找内容实际是在内存找 图2.28 模拟故障 C、当触发检查点,内存数据会写盘,然而查找数据的话,没改变数据内容,写盘的时候不需要修改内容,故数据文件test.dbf不存在也不会报错,但是再查找表的内容的时候,要从磁盘读,因此发现了数据文件不存在 图2.29 数据文件故障 第 16 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) D、关闭系统,然后启动后发现,数据文件处于recover状态 图2.30 recover状态的数据文件 E、创建丢失的数据文件,恢复文件的内容 图2.31 创建需要的文件 图2.32 查看数据文件状态 第 17 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) F、验证数据是否还是存在,数据还在的条件是,归档日志文件存在的时间要比表空间创建的时间要久远,才有重做日志文件支持完全恢复。 图2.33 验证恢复 第二种情况:先触发检查点,在删除数据文件 图2.34 情况二 第 18 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.34 数据文件需要恢复 图2.35 恢复后的数据 (3)System表空间数据文件或者大量数据文件受损 A、对system表空间进行热备份 图2.35 热备份 第 19 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) B、删除system数据文件,模拟数据文件损坏 图2.36 删除数据文件 C、把热备份的数据文件重新拷回去,恢复系统数据文件 图2.37 恢复数据文件 (4)回滚文件损坏的恢复 A、查看回滚表空间的相关信息(回滚文件可以在线删除) 图2.38 回滚表空间信息 B、删除undo数据文件,启动数据库 图2.39 模拟故障 第 20 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.40 故障 C、把回滚数据文件离线,启动数据库 图2.41 离线数据文件 D、创建一个新的回滚表空间,并修改参数undo_tablespace,使undotbs1能成功删除 图2.42 创建回滚表空间 图2.43 创建修改回滚表空间 第 21 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) E、创建测试表test 图2.44 创建测试数据 F、关闭数据库,发现数据库一直关闭不了,挂起了,查看警告文件 图2.45 关机挂起 第 22 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.46 查看跟踪文件 G、启动数据库 图2.47 故障 H、修改参数文件pfile,增加一行 图2.48 修改SPFILE 图2.48 启动数据库 (5)临时文件损坏的修复 A、当控制文件不需要重建的时候 第 23 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.49 模拟故障 B、控制文件重建的时候,因为控制文件的创建不包含temp的路径,若创建时指定会报错,故在启动数据库后要手工绑定。 图2.50 模拟故障2 图2.51 查看临时表空间 图2.52 大查询 图2.53 手工创建临时表空间 不完全恢复 (1)基于time时间的恢复 基于时间的恢复能将数据库通过不完全恢复,到过去的某一时间点,经常被用在误操作导致的删除数据,在备机上将数据库恢复至被删除时间点之前的状态,然后把该表导出到正式环境,以挽回丢失数据。 第 24 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) A、建立测试表test,插入测试数据 图2.54 创建测试数据表 B、热备份除temp表空间以外所有的数据文件,虽然恢复的数据在users表空间,但是不完全恢复基于时间的恢复,所有的表空间数据文件都应该恢复到同一个时间点上,因此,需要备份所有数据文件。 图2.55 热备份所有文件 第 25 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) C、继续插入测试数据,热备份后的数据,如果仅仅恢复备份,数据应该不存在,查看数据丢失之前的时间点,用于不完全恢复的时间参考。 图2.54 继续创建测试数据 D、删除测试数据表,关闭数据库,拷回热备份,启动到mount状态,根据时间点恢复。 图2.55 E、重新以resetlogs方式打开数据库,查看丢失数据是否存在。 图2.56 验证 (2)基于改变scn的恢复 第 26 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 基于改变scn号(system change number)的恢复可以将数据库不完全恢复到过去的某一个scm改变点,也常用于在误操作删除数据后,在备用机上将数据库恢复到删除scn之前,然后把表导出到正式的环境,挽回丢失的数据。 图2.57 图2.58 第 27 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.59(3)控制文件损坏的恢复 *单个控制文件被破坏 由于数据库的三个控制文件都是相互备份的,因此,当损坏一个数据文件的时候,可以从另外的两个数据文件拷贝创建新的数据文件,名字相同即可。或者把pfile中控制文件的数量改变为两个,重新以pfile启动数据库 图2.60 第 28 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.61 *多个控制文件被破坏 在很多个控制文件都被破坏的情况下,如果没有对控制文件做备份,那么只能通过重建控制文件生成。在创建控制文件的时候,应该很清楚的了解到每一个数据文件,日志文件的具体位置,确保在重建数据文件之后,数据库的正确性,并且,在重建控制文件的时,是不包含temp01.dbf数据文件的,只能在打开数据库后,进行temp表空间的重新建立,以达到temp表空间的使用。 图2.62 第 29 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.63(4)日志文件损坏的恢复 *正常关机情况下非当前联机日志文件被破坏 第 30 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 正常关闭DB时缓存均已写盘,且logfile已归档,故仅需clear logfile 重新生成丢失的非当前日志文件即可,无数据丢失;若日志未归档,必须加unarchived参数,才会允许重新生成日志文件,并标志所有备份失效,应该重做全备份。 图2.64 图2.65 *正常关机情况下当前联机(或所有)日志文件被破坏 第 31 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 正常关闭DB时缓存均已写盘,且logfile已归档,因此仅需until cancel 取消系统查找当前联机日志,并且resetlogs重新生成对视的当前联机日志文件即可,无数据丢失。 图2.66 图2.67 第 32 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) *DB运行时或非正常关机的情况下已归档active日志文件被破坏 图2.68 系统suggestion提示文件正确即可回车确认使用该文件进行重做,提示错误则可手工输入filename使用指定文件进行重做,这两种重做都是单步进行的,重做完本归档或者日志文件后,又会继续提示指定用来重做的下一个归档或日志文件,而auto则自动寻找所有归档或日志文件进行重做,非单步进行,后续归档或日志文件的重做无提示等待确认 图2.69 第 33 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 前一个归档或日志文件已经完成恢复重做,不再需要,且再次提示的用于后续恢复的归档文件是错误的而应该使用当前日志文件进行恢复,因此手工输入当前日志文件名进行恢复。 因active日志已经被归档,因此oracle数据库可以到归档文件或者current日志文件中找到需要的数据,以进行实例恢复,次过程没有数据丢失,最后resetlogs用来重新生成已经丢失的归档active的日志文件。 *DB运行时或非正常关机情况下未归档active或current日志文件被破坏 图2.70 图2.71 第 34 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.72 因active/current日志并没有被归档,所以数据库没办法到归档日志中找到需要数据进行数据库的实例恢复,数据文件在没有归档active或current日志文件上不一致,并且没办法使用已经丢失的没有归档文档active或当前日志文件把数据文件重做到一致的时间点上,只可以通过全备份进行不完全恢复,将所有数据文件时间点重做到最后一个可用日志文件中的最后一条重做记录处,其后丢失的未归档active或当前日志文件通过resetlogs重新生成而未进行重做,故有数据丢失,但数据仍一致的,所有数据文件均处于最后一个日志文件中最后一条重做记录所对应的时间点处。 第 35 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) *DB运行时或非正常关机情况下未归档active或current日志文件被破坏(无备份) 图2.73 图2.74 第 36 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 图2.75 图2.76 因current/active日志并没有归档,因此数据库没办法到归档日子文件中找到需要的数据进行实例恢复,数据文件在没有归档active或current当前日志文件上是不一致的,并且没有全备份重做恢复到相同的时间点上面,只能通过设置_allow_resetlogs_corruption=true隐含参数,并resetlogs重新生成丢失的未归档active或current日志文件,使数据库在不一致情况下启动以便备出数据,这种操作会有数据丢失。 第 37 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 第四章 总结 保证oracle数据库的安全是系统安全的重要组成部分,必须要设计完善的数据库备份和恢复方案。Oracle提供的各种工具结合起来使用能够使数据库的备份和恢复变得简单。在实际的oracle数据库的备份和恢复中,会有许多不同的和复杂的情况出现,针对不同的情况,要本着使数据具有最大的可恢复性和恢复时间最短的原则去进行数据库的恢复,这需要大量的实验和经验积累。 第 38 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 参考文献 [1] Thomas Kyte.Expert One-on-One[M].Apress,2003.8 [2] Benjamin Rosenzweig,Elena Silvestrova Rakhimov.Oracle PLSQL实例精解第4版[M].Prentice Hall PTR,2009.6 [3] Thomas Kyte.Expert Oracle Database Architecture 2nd Edition[M].Apress,2010.7 [4] Administrator's Guide.oracle公司 [5] Backup and Recovery Advanced User's Guide.oracle公司 [6] Backup and Recovery Basics.oracle公司 [7] 李丙洋.涂抹oracle--三思笔记之一步一步学oracle[M]中国水利水电出版社,2010.1 [8] Karen Morton.Oracle SQL高级编程[M].人民邮电出版社,2011.11 [9] 梁敬彬,梁敬弘.收获不止oracle[M].电子工业出版社,2013.5 [10] 盖国强.循序渐进oracle数据库管理、优化与备份恢复[M].人民邮电出版社,2011.8 [11] Lan Abramson,Micheael Abbey,Michael J.Corey,窦朝辉.oracle database 11g:初学者指南[M].清华大学出版社,2010-01 [12] 盖国强.oracle dba手记3:数据库性能优化与内部原理解析[M].电子工业出版社,2011.9 [13] K Gopalakrishnan,贾洪峰,梁涛,郭绍明.oracle database 11g Rac手册[M].清华大学出版社,2012.6 [14] John Beresniewicz,Adrian Billington,Martin Buchi.oracle PL/SQL实战[M].人民邮电出版社,2012.11 [15] 蒙邵良,oracle dba高效入职指南[M].清华大学出版社,2012.1 [16] 郭郑州,陈军红.oracle 完全学习手册[M].清华大学出版社,2011.1 [17] 包光磊.临危不惧:oracle 11g 数据库恢复技术[M].电子工业出版社,2012.7 [18] Robert G.Freeman,Matthew Hart,王念滨,陈子阳.oracle database 11g Rman备份与恢复[M].清华大学出版社,2011.4 第 39 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) [19] Edward Whalen,陈曙晖.基于Linux平台的oracle database 10g管理[M].清华大学出版社,2007.1 [20] 林树泽,历铁帅,何会军.oracle 数据库管理之道[M].清华大学出版社,2012.7 第 40 页 共 41 页 南华大学计算机科学与技术学院毕业设计(论文) 谢 辞 论文工作接近尾声,本科学习生涯即将结束。我要感谢大学期间老师、同学们对我的帮助和指导,特别是在论文写作期间,谭敏生院长对我的论文指导跟审查,使我的论文得以顺利完成。 最后我想谈谈这篇论文和系统存在的不足。这篇论文的写作以及修改过程,也是我认识到自己知识与经验缺乏的过程。虽然我尽可能地收集资料,竭尽所能运用自己所学的知识进行论文写作,但是我的论文还存在许多不足之处,有待改进。由于本人水平有限,对某些概念和方法的理解还不是很深刻,以致文章的阐述缺乏足够的说服力,请各位评委老师批评指正。通过这次论文的写作,我个人在信息检索、阅读写作、基础知识、沟通能力等方面都得到了一定程度的提高。这是我很欣慰的地方。但是,这篇论文的写作以及分析的过程,也是我越来越认识到自己知识与分析能力薄弱的过程。虽然,我尽可能地收集材料,竭尽所能运用自己所学的知识进行的论文写作和分析,但论文还是存在许多不足之处分析不透彻或者建议不具体,在以后的研究中还需要努力。所以请各位老师多批评指正,让我在今后的学习与工作中做到更好。 第 41 页 共 41 页第三篇:oracle常用语句
第四篇:oracle学习心得
第五篇:oracle毕业论文