Oracle RAC 学习心得
1. 概念
RAC,全称real application clusters,译为“实时应用集群”, 是Oracle新版数据库中采用的一项新技术,是高可用性的一种,也是Oracle数据库支持网格计算环境的核心技术。
在Oracle9i之前,RAC的名称是OPS (Oracle parallel Server)。RAC 与 OPS 之间的一个较大区别是,RAC采用了Cache Fusion(高速缓存合并)技术。在 OPS 中,节点间的数据请求需要先将数据写入磁盘,然后发出请求的节点才可以读取该数据。使用Cache fusion时,RAC的各个节点的数据缓冲区通过高速、低延迟的内部网络进行数据块的传输。
2. 优缺点
优点:
Oracle RAC主要支持Oracle9i、10g、11g版本,可以支持24 x 7 有效的数据库应用系统,在低成本服务器上构建高可用性数据库系统,并且自由部署应用,无需修改代码。在Oracle RAC环境下,Oracle集成提供了集群软件和存储管理软件,为用户降低了应用成本。当应用规模需要扩充时,用户可以按需扩展系统,以保证系统的性能。 (1)多节点负载均衡;
(2)提供高可用:故障容错和无缝切换功能,将硬件和软件错误造成
的影响最小化; (3)通过并行执行技术提高事务响应时间----通常用于数据分析系
统;
(4)通过横向扩展提高每秒交易数和连接数----通常对于联机事务系
统;
(5)节约硬件成本,可以用多个廉价PC服务器代替昂贵的小型机或大
型机,同时节约相应维护成本;
(6)可扩展性好,可以方便添加删除节点,扩展硬件资源。 缺点:
(1)相对单机,管理更复杂,要求更高;
(2)在系统规划设计较差时性能甚至不如单节点;
(3)可能会增加软件成本(如果使用高配置的pc服务器,Oracle一般
按照CPU个数收费)。
3. Rac 特点
每一个节点的linstance都有自己的SGA
每一个节点的linstance都有自己的background process
每一个节点的linstance都有自己的redo logs
每一个节点的linstance都有自己的undo表空间
所有节点都共享一份datafiles和controlfiles
4. Rac 组件
逻辑结构上看,每一个参加集群的节点有一个独立的instance,这些instance访问同一个数据库。节点之间通过集群软件的通讯层(communication layer)来进行通讯。同时为了减少IO的消耗,存在了一个全局缓存服务,因此每一个数据库的instance,都保留了一份相同的数据库cachel
5. UNDO和REDO读书笔记
1) redo是什么?oracle的redo是如何工作的
redo是重做日志文件,是oracle数据库的日志文件.oracle的重做日志有两种:在线重做日志以及归档重做日志。
在线重做日志:主要用于由于数据库主机掉电等原因导致实例失败,此时oracle采用在线重做日志在数据库启动时将数据库恢复到断电之前的时间点上。
归档重做日志:主要用于介质失败,比如:磁盘受损。此时需要使用对磁盘上的数据备份的归挡重做日志文件将该磁盘上的数据恢复到该归档文件数据所在的时间点上,然后再使用在线重做日志文件将适合的时间点上。
归档重做日志文件实质是被添满的旧的在线重做日志的副本。归档重做日志文件是数据库的历史数据。
在线重做日志在每个数据库中至少有两个重做日志组,每个日志组中至少有一个重做日志文件,这些在线重做日志组是循环使用的,
当日志组1被写到最后时,然后自动切换到日志组2;当日志组2也被写满时,再切换到日志组1。
2) undo是什么?oracle的undo是如何工作的
undo与redo相反,redo是恢复数据,用于在事务失败时重放事务,undo是撤消一条语句或者一组语句的作用。undo是存储在数据库内部的段或者表空间中(undo如果是手动管理,则使用undo段来管理;如果undo使用AUM管理UNDO,则undo使用表空间来自动管理)。
注意:在undo并不是物理的恢复到执行语句之前或者事务之前的样子,只是逻辑的恢复到原来的样子,所有修改只是逻辑的取消,但是数据结构和数据块在回滚之后也大不相同。原因是在多用户系统中,有很多事务是并发进行的,当一个事务修改一个数据并且被回滚,但是该数据在该用户对该数据做过修改之后也有被其他用户修改,这个时候如果是对该事务修改的数据块回滚到原来数据的物理样子,就有可能将后来的事务所做的修改给覆盖掉。所以回滚不是
一个简单的物理的恢复,而是逻辑恢复。
3) undo和redo是如何协作工作的
4)
6.
第二篇:ORACLE学习总结
007-01:
Select总结;
一.
1. select语句不区分大小写;
2. select可以跨行。关键字不可以简写,也不可以跨行
3. from可以使用缩进的方式。以增加程序的可读性。
4. isqlplus基于WEB方式,是一种工具。其中的关键字可以简写如:connect可以简写成
conn。
5. 缺省栏位居中,大写
6. sqlplus日期和字符居左。数字栏位居右。
二.
1.加减乘除:
运算优先级是* / + -。
2.null:
是一种不确定的状态,空白。不是空格,既不等于0也不是空值。
如果和其他值做运算。结果都是null。
三.
1.指定栏位的别名:
1.select en ename from scott.emp;
2.select en as ename from scott.emp
3.select en as “ENAME ” from scott.emp (为di了保证大小写。用双引号)
2.连接符:
1.用“||”:
Select ename || ? ?|| dname from scott.emp
2.literral:
Select last_name || ? is a ? || job_id as “Employee Detail” from employee;
3.去掉重复结果:
Select distinct ename from scott.emp
007-02:
一.
1.where条件:
必须写在from语句 之后。
2.where条件中如果引入字符串和日期型数据的话,需要注意:1.这些值必须用单引号
2.单引号里的字符串是区分大小写的。3.日期数据的缺省格式是区分大小写的。
3.比较条件:
Select * from scott.emp where sals >comm.;
2.between 10 and 50意思就是大于10小于等于50而不是大于10等于50
3.in 代表一个离散的取值而不是一个连续的取值。 是一个点一个点的。In (, ,)
4.like 字符模式的匹配。匹配单个字符--
5.is null 表达式是否为空。
4.逻辑关键字:
优先级由高到底:not and or 取反:在相应关键字之前加一个not
运算表达式的优先级:
5.排序:order by 语句:
1.Oracle中缺省是升序asc,降序是desc
2. 用某个栏位的别名进行排序:
Select last_name,department_id,sqlary from employee order by department_id ,salary desc; 其中desc影响的表达式只是紧跟着它的那个字段。也就是说只对salary起作用。
department_id。Department_id是默认的排序方式。也就是升序。
007-103:
函数:
单行函数:函数可以嵌套。包括字符函数。数据。日期函数。转换函数。通用函数。 字符函数:实现字符处理的函数。
字符大小写的函数:
1. lower全部转换小写格式
2. upper全部转换为大写格式
3. initcap:第一个字母大写。其他的都小写。
字符操作的函数:
1. concat:实现连接,和||一样
||:select au_lname|| ??||au_fname from authors;
Concat:
Select concat(au_lname,au_fname) from authors;
2. substr:实现从左往右substr(字节,+-1,n)从左往右从1到5。C/1/-1把一改成-1
若是正数从左往右。负数的话就是从右往左取。Run执行
3. instr: instr(字段,字母)。判断该字母是否包含在该字段中。
Select instr(au_lname ,?g?) from authors;
查看字母G是否包含在au_lname中
结果显示是第5行。第六个字母。
4. lpad:lpad(salary,10,?*?)从左边填充10个长度。不够的话就填充相应的*
5. rpad(salary,10,?*?)同lpad。
6. trim:
数字函数:
1. round:四舍五入的函数。Round(45.926,2) 结果:45.93,round(45.926,-1),指的
是小数点的左边保留多少位。Round(45.926,-1)结果:50 round(45.926,-2)结果:0
2. trunc:截取 trunc(45.926,2) 结果:45.92,将45.926后的6直接去掉,保留2位小数。
3. mod:求模 mod(1600,300) 结果:100
日期型函数处理:
1. 日期函数的缺省是日月年。月为三位
2. sysdate:系统日期:
select (sysdate-ord_date)/7 from dual;
3. months_between:比较两个日期之间现在间隔了多少个月份,
months_between(‘01-sep-95’,‘11-jan-94’) 结果是:19.6774194
意思就是:
4. add_months:在前一个日期型数据之前的天加几个月得到一个新的日期值、
add_months(?11-jan-94?,6)结果是:11-jul-94
94年的一月份加上六个月就是94年的7月份
5. next_day:指定的日期的下一个日期:next_day(?01-sep-95?,?FRIDAY?)结果是:08-sep-95
意思就是:指定当前日期的下一个星期五是什么时候
6. last_day:指定日期的最后一天。Last_day(‘01-feb-95’)结果是28-feb-95
意思就是:95年2月的最后一天是哪一天。
7. round:四舍五入:sysdate是25-jul-95
round(sysdate,?Month?) 结果是01-aug-95
意思就是:25大于日期的一半
round(sysdate,?year?)结果是:01-jan-96
8. trunc:截取:trunc(sysdate,?month?)结果是01-jul-95
9. 从日期加或者减一个数,结果是一个日期值?
10. 两个日期相减,得到两个日期之间的天数?
11. 用小时数除以24,可以加小时到日期上
转换函数:
1. varchar2 or char 转换成number:
2. varchar2 or char 转换成date:
3. number 转换成varchar2
4. date 转换成varchar2:
转换图:
Character 通过 to_number转换成number
Number 通过to_char 转换成character
Character 通过to_date 转换成 date
Datet通过to_char转换成character
日期格式的模式:format_model
1. HH24:MI:SS:AM :15:45:32 PM
2. DD “OF” MONTH:12 of October
3. ddspth:fourteenth
例子:select last_name TO_CHAR(hire_date,?fmDD MONTH YYYY?) as HIREDATE employee
4.
9:
0:
$:转换成美元符号,select to_char(qty,?$999.99? ) from sals;
L:转换成本地货币符号,select to_char(qty,?L999.99? ) from sals;
.:对千位符
,:
4. to_number(char,?format_model?):
5. to_date(char,?format_model?):
6. select to_char(ord_date,?dd-mon-yyyy?) from sals;
通用函数:
1. nvl(表达式一,表达式二):传递字符串是否为空。为空就显示第二个字符串。
Nvl(commission_pct,0)如果commission_pct为空。得到的是0
Nvl(hire_date,?01-JAN-97?)如果hire_date为空。得到的是01-JAN-97
nvl(job_id,?No job yet?)如果job_id为空,得到的是No job yet
2. nvl2(表一,表二,表三) from
3. nullif(表一,表二)
4. coalesce(表一,表二,,,,)
条件表达式:
1. case语句:
select ename,job,sal,case when empno='7369' then sal*1000000
when empno= '7521' then sal*200000
else sal
end from emp;
2.
007-104:
多表处理:通过SQL实现相等或者不等。
1. 多表连接:笛卡尔积,没有给连接条件。任意两行都是相互匹配的。
Select table1.column,table2.column from table1,table2 where table1.column=table2.column; 若同名。就要用栏位别名。
Select t1.stor_id,t1.stor_name,t2.qyt
from stors t1,sals t2
where t1.stor_id=t2.stor_id and t1.stor_name like ?W%?;
2. 多表连接并且出现出现同名栏位的情况下应该怎么区分column:
规则:表名+字段名,为了简化。引入别名的方式。
Select e.employee_id,e.last_name,e.department_id,
d.department_id,d.location_id
from employee e,department d
where e.department_id=d.department_id;
注意:若连接N张表,连接的条件至少是N-1个。
3. outer joins:外连接:
1. 右连接:
select table1.columb,table2.column
from table1,table2
where table1.column(+)=table2,column;()
2.左连接:
Select table1.column,table2.column
From table1,table2
Where table1.column=table2.column(+);
4. self joins:自连接 :一定要用表的别名。
Select t1.su_lname,t1.au_fname,t2.su_fname
From authors t1,authors t2
Where t1.state=t2.state
注意:重复记录:把自己 排除在外:input and t1.au_id<>t2.au_id L run
Sql99国际标准语法:
Select table1.column,tabe2.column
From table1
Cross join table2
Natural join table2
Join table2 using (column_name)
Join table2 on (table.column_name=table2.column_name)
Left/right/full/outer join table2 on (table.column_name=table2.column_name)
5. natural joins:有多个同名的字段对他进行连接:
用using,joins不能实现表的别名。、
6. 三张表的连接至少有两个连接条件、
007-201:
分组求和:
聚合函数:
Select [column] group function from table where condtion group by column order by column Select sum(qty) from sales;
Avg:求平均:
Count:统计:
Max:最大值
Min:最小值
Stddev:
Sum:求和
Variance:
非整张表:
分组求和:
1. select avg(nvl(commission _pct,0)) from employee
2. group by 子句:分组求平均工资:
select department_id,avg(salary) from employee group by department_id;
出现的select中的字段。要么出现的聚合函数的字段里。要么出现的group by语句中,不然会报错。
在where条件中引用聚合函数。
部门工资大于8000:
Select department_id,avg(salary) from employees where avg(salary)>8000
3. Where 条件是相对于select语句的,而对group by的结果集机型过滤的所用的是having
子句的。
4.having子句:先分组求和。然后对分组求和的结果进行过滤。
Select stor_id,ord_num,sum(qty) from sales
Group by stor_id,ord_num
Having sum(qty)>50
多行函数:
1. 聚合函数
2. group by子句:
3. having子句
007-202:
查询:
1. 多行子查询和多行子查询:
Select * from sales where qty >(select avg(qty) from sales)
子查询就是用括号括起来的查询
标准执行只执行一次。子查询和外查询要有关联
Select select_list from table where expr operator (select select _list from table)
子查询的结果作为外查询的条件传递出去的。
1. 子查询一定要放在括号里面。
2. 一定要放在比较运算符的右边。
3. 引用子查询的时候不可以引用order by 子句
4. 根据子查询返回的单行:做为一个表达式出现在任何地方,若返回多行则不能进行比
较。返回一组结果而不是一个结果的时候。
2.单行子查询返回一行(单值)。可以出现的表达式任何地方。
在having子句中也可以引用子查询。
假定子查询返回多行,可以用:in,any,all.
Select from group by having ziduan in(select
否定的是not in,not any,not all.
除非特别需要,否则一般只用join来用做子查询
3.返回空的结果集。
007-203:
1.启动isqlplus工具
007-204:
数据操纵:
1. 每个dml的语法:
Insert into:
Modify:
Remove:
2. 为了保证事务的完整性:
3. insert into:
insert into table [(column[,column…])] values (values[,values]);
一次只能插入一条记录。
Values括号后面的字段需用单引号。
没有指定相应的name,就用缺省。
Null可以做为填充空值的关键字来引用。
往表里添加函数的时候,可以用格式化来填写。
Insert into sales_reps(id,name,salary,commission_pct)
Select employee_id,last_name,salary,commission_pct
From employee
Where job_id like ?%REP%?
Insert into test1 select * from authors where su_id like ?2%?
4.:update:
语法:Update table set column=values[,column=values,….]
[where condition];
注意:根据where条件的不同。可以一次修改一行也可以修改多行记录。
Uodate 条件中如果不加where条件,那么就是对整张表的条件进行改变。
子查询:
Update employee
Set job_id = (select job_id
From employee
Where employee_id=205),
Salary = (select salary
From employee
Where employee id = 205)
Where employee_id = 114;
注意:子查询返回的结果必须是唯一的。
4. delete记录:
delete [from] table [where condition];
如果不给delete加where条件的话就是对整张表删除。
以另外一张表的条件做条件:
Delete from employee where department_id = (select department_id from departments where department_name like ?%public%?)
删除数据也会考虑数据完整性的问题。
当主键在另一个表中的时候为了保证数据的完整性是不可以删除数据的。
158xxxxxxxx、135xxxxxxxx、131xxxxxxxx
5. merge合并语句:
语法:
Merge into table_name table_alias
Using(table/view/sub_query) alias
On (join condition)
When marched then
Update set
Coll = col_vall,
Col2 = col2_val
When not matched then
Insert into(column_list)
Values (column_values);
139xxxxxxxx梁
007-301:
创建表:
创建表所修改的数据类型。
2. 表名:
标准命名方式:
1. 开头必须是字母
2. 长度必须在1—30之间
3. 必须包含大小写字母,下划线,0-9的数字、到了符号和#号。
4. 不可以引用关键字或者是保留字
非标准的命名方式:
1. 若不满足以上标准命名方式的话就引用双引号create table “test-1”
2.创建表:
1,权限
2.default约束:往表里填新词。在对应的条件上没有显示值、要么返回是常量。要么返回系统值。
Select table [schema.] table (column datatype [default expr] [,…])
2. 数据字典视图:
三类:
1. 可以查看所有对象信息的:以dba_开始的一类
2. 当前用户可以访问的数据对象的信息的:以all_开始的一类
3. 只可以看到自己的这一类的信息的:以users_开始的一类
数据类型的认识:
1. 数据类型和日期类型:
子查询:需要保存select结果集
Desc 查询表结构
2. varchar,char ,number(p,s)
date
long
clob
raw and long raw:图像
blob:二进制大的数据类型
3. 两张表之间成批的拷贝:
Create table [(column,column)] as subquery(子查询)
4. 修改表结构:
添加:Alter table table add (column datetype [DEFAULT expr]) [,column
datetye]
修改:Alter table modify (column datetype [DEFAULT expr]) [,column datetype] 删除:Alter table table drop (column).必须加一个column
5. 写回滚信息:Alter table table set unused(column)
Or
Alter table table set unused column column
删除:alter table table drop unused column,删除表中没有用到的column
6. 对表重命名:
Rename 旧表名 to 新表名
7. 清除一张表:
Truncate table 表名
高效的清空表,没有做日志记录。清空了就找不回来了。
8. 添加注释:
Comment on table tablename is ? 注释内容 ?;
在数据库里可以查找到的注释:
All_col_comments
User_col_comments
All_tab_comments
User_tab_comments
007-302:
保证逻辑规则的完整。
关于constraints 的定义
1. not null
2. unique
3. primary key
4. poreign key
5. check
定义约束条件时:
1. 给约束条件命名。
约束条件是作为表结构的一部分存在的。
待看。
007-303:
在oracle中创建视图:
1. 视图本身是一个逻辑结构。本身不包含任何数据。
2.视图的各种操作。是一个命了名的select语句。
3.select 中不能出现:
1.order by
2.不能出现伪劣
3.视图就相当与一个眼镜
4.语法:
Create or replace view 11.