oracle

15天的OCP培训笔记

2018-07-12  本文已影响231人  fjxCode

第一天

7月13日OCP笔记:

Oracle Ocp11g准备资料:

OracleFundmentals 书

管理1 书

管理2 书

光盘下载:otn.oracle.com

文档下载:docs.oracle.com

虚拟机配置:1cpu/2G RAM/OracleLinux/网络HostOnly/40G SATA。安装OracleEnterpriseLinux5.4,Oracle11gR2 11.2.0.1。E盘没还原卡。

操作系统:语言选英文(免环境变量NLS_LANG)静态IP:200.100.50.13/24,主机名server13.example。时区:上海,不用UTC。密码codecraft。软件全选。关闭防火墙,SELinux禁用。Kdump内核转储不选。不创建帐户。分辨率1024*758(系统-管理-显示-硬件-LCD-1024*768,首页也要改,改后重启)。

装Oracle11gR2:

建组 oinstall dba oper 用户oracle/密码oracle1158

建目录/u01/app/oracle,改所有者,改权限775

加环境变量:

umask 022

export TMP=/tmp

export TMPDIR=/tmp

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1

export ORACLE_SID=orcl

export PATH=.:$ORACLE_HOME/bin:$PATH

安装包拷到/tmp目录下。进oracle帐户,执行xhost+,$cd /;./runInstaller;

Create and configure the database

Server Class

单实例single Instance

装包 包在Linux光盘的Server目录

SQL语句:

查询 SELECT

数据维护DML INSERT UPDATE DELETE

数据定义DDL CREATE ALTER DROP TRUNCATE

数据控制DCL GRANT REVOKE

事务控制TCL COMMIT ROLLBACK SAVEPOINT

解锁用来学习Oracle的hr帐户:

SQL>alter user hr identified by "hr" account unlock;

查书《SQL Language Reference》

进入sqldeveloper:

#xhost +

#su - oracle

$ORACLE_HOME/sqldeveloper/sqldeveloper.sh

设置:连接名hr,用户名hr,密码hr,SID为orcl。测试应该状态成功。

按F9执行sql语句。Sqldeveloper命令可修改,带Tab自动补齐和Ctrl+BackSpace删单词使用更方便。

显示用户:

>show user

不同帐户有不同的表,只有hr帐户有employess表,而sysdba中没有。

用数据字典显示所有的表:

>select table_name from dba_tables;//管理员的拥有表

>select table_name from user_tables;//用户的拥有表

查看表结构(相看表有哪些列):

>desc 表名

相看表内容:

>select语句

关键字和对象名不区分大小写,换分是任意的。

查询:

>select 列|表达式 from 表;//表达式不影响原表

查询的列别名AS "别名":解

>select first_name,last_name,salary*12 as "nianxin" from employees;

一般表达式都是加别名便于理。别名可以不加引号,但有空格的别名必须加引号。

查询的去重复行:

>select distinct department_id from employees;

注意:表达式中与NULL有关的任何计算均为NULL。

双坚线字符串连接用双坚线||

当字符串间中单引号,使用q'[]'括起字符串。

每课的练习只有英文版中才有。作业为Practice for lesson1。

第二天

7月14日OCP笔记:

数据类型:NUMBER DATE VARCHAR2

DATE要求单引号界定,大小写区分,格式满足要求。

ORA-27300错误导致无法启动数据库,需要修改内核参数#vim /etc/sysctl.conf加入kernel.sem=250 32000 100 128完成。

关键字、表名、列名都不区分大小写。

选92年之后进公司的:(使用日期)

>select first_name,last_name,salary from employees where hire_date='01-JAN=92';

查看没有提成的:(IS NULL筛选)

>select first_name,last_name,salary from employees where commission_pct IS NULL;

按薪水排序:

>select first_name,last_name,salary from employees order by salary desc;

查询名字中第2个字母为a的员工:

>... where last_name like '_a%';

IN关键字与OR功能有重复:

>salary IN(5000,6000,7000)同salary=5000 OR salary=6000 OR salary=7000

&变量替换可以替换列名或表达式

>select first_name,last_name,&v1 from employees where hire_date>'01-JAN-92' order by &v2 desc;

PL/SQL最常用功能:条件判断,循还。还有函数,存储过程,包,触发器。

单行函数,转换函数,组函数可以无需PL/SQL编程,直接实现常用功能。

单行函数单进单出,多行函数则是多入单出。功能在SQL Language Reference中的Function查询。

虚拟表dual用于构造完整语句:

>select upper('abcdefg') from dual;

年YYYY,而年缩写YY/RR不易用不建议使用。

加月:

>select add_month(sysdate 1) from dual;

下周五:

>select next_day(sysdate 'FRIDAY') from dual;

月份最后一天:

>select last_day(sysdate) from dual;

日期四舍五入:

>select round(sysdate,'YEAR') from dual;

>select trunc(sysdate,'MONTH') from dual;

Sqlplus保存文件:(需要创建目录)

>save /test.sql;不填路径默认存在/home/oracle路径下。

运行Sqlplus:

>@/test.sql;

编缉.sql文件用VIM编缉器,另存为方式如下:

Shift+:w /test2.sql

答疑:

字串中有'用其它引号运算符q'[]'。字串、日期用单引号,列别名用双引号。筛选%和_用逃脱转义符like '%Smi\_th%' ESCAPE '\'。

使用sys用户登sqldeveloper需将Role换为sysdba。

显示转换:

>select 123+'234' from dual;//相当于123+to_number('234')

显示转换自定义日期格式:

select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

显示转换区分大小写,以下两条语句不同:

>select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS YEAR') from dual;

>select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS Year') from dual;

自定义的字符串放到日期格式之间用""

>select to_char(sysdate,'YYYY-MM-DD "of" HH24:MI:SS') from dual;

格式ddspth,dd数字日期,sp拼写,th排序:

>...

使用fm删除前导空格:

>...

数字显示转换为字符:

>select to_char(12345678,'$99,999.00') from dual;

注意任意长度数字占位小于数字将无法显示。

to_number几乎不用。

to_date使用:隐式转换可能报错,因而最好加上。

>...where hire_date

nvl(exp1,exp2)当表达式1不为空返表达式exp2:

nvl2(exp1,exp2,exp3)当表达式1不为空返表达式exp2,为空返表达式exp3:

nullif(exp1,exp2)比较两个表达式,不等返回表达式1,相等返回空。

coalesce(exp1,exp2,exp3)返回第一个非空值。

CASE条件表达式:

>select lst_name,salary,CASE department_id WHEN 10 THEN salary+1000 WHEN 20 salary+2000 WHEN 30 salary+3000 ELSE salary+500 END AS "New Salary" from employees;

DECODE条件表达式:

>select lst_name,salary,decode department_id,10,salary+1000,20,salary+2000,30,salary+3000,salary+500 as "NewSalary" from employees;

第三天

7月15日OCP笔记:

子查询内容:

查询员工名字,工资(比Jones低的):

>select last_name,salary from employees where salary<(select salary from employees where last_name='Jones');

在查询的结果中再进行查询。单行子查询的结果是一行一列,多行子查询的结果是多行一列。多列结果只能分割为一列。

子查询用途1:放到比较条件中,单行子查询常配合组函数使用。

单行比较运算符:> < >= <=

多行比较运算符:>ALL ANY大于最小

子查询用途2:放在被查询表处

select last_name,salary from (select last_name,salary from employees);

集合运算符:UNION/UNION ALL;INTERSECT;MINUS

例子:

>create table a (id number,name char(10));

>create table b (id number,name char(10));

>insert into a values(10,'aa');

>insert into a values(20,'bb');

>insert into b values(10,'aa');

>insert into b values(30,'cc');

>select * from a union select * from b;

处理数据包括: DML数据操作语句和TCL事务处理语句。

create table 表/列,insert into 表/值,update表set的列赋值,delete表/条件。建表的表名和列名加与不加空格都可以。insert into表列行用于添加缺少部分列信息的行,也可以在VALUES子句中填NULL。

表中插入单行:

>desc table1;//先查询表结构,再方便插入行数据。

>insert into employees values(行值);

些语法一次只能插入一行。列名是可选参数一般不填,空值填NULL。

创建一个同结构的空表:

>create table emp as select * from employees where 1=2;

表中一次插入多行,也就是将子查询结果插入到表中:

>insert into emp select * from employees where department_id=50;

子查询结果的结构要与被录入表的结构一致。若只录入前10前:where rollnum<11;

修改数据:

>update emp set salary=10000,comission_pct=0.1;

删除数据:

>delete emp where salary>5000;

清空表。删除所有表内容,表还在:

>delete emp;删除表内容的DML语句

>truncate table emp;//此为DDL语句

DDL语句:truncate;create;alter;drop;

DC语句:grant;revoke;

TCL事务控制语句:commit;rollback;savepoint;select for update;

事务特征ACID:原子性,一致性,隔离性,持久性。多条DML都是一个事务、一条DDL、一条DCL。也就是说DDL、DCL语句自动提交(隐式提交)。正常退出也会自动提交。系统崩溃则回滚rollback。

select for update;锁定被修改的行直到commit或update才释放。

模拟崩溃:

#ps ef|grep oracleorcl;//查看进程号

#kill -9 进程号;

练习:建表,录入10行,试下不同的提交方式。

标记保存点:

>savepoint p1;

回滚到保存点:

>rollback p1;

利用伪列选择前10行:

>select * from employees where rownum<11;

只有提交的数据才能被其它用户可见。修改的未提交数据,其它用户不可修改,只能访问修改前的数据。

读一致性:读取的数据为查询命令的执行时间的数据。在数据区实现修改,修改前数据通过构造CR块实现。

SELECT是无锁,DML会产生锁,锁为行锁。commit将释放行锁。

DDL语句。

命名规则:30个字符以内,同一用户不能重名,只含字母数字_#$,首不为数,不含保留字。

查看用户:

>desc dba_users;//要求SYSDBA权限

>select username from dba_users;

查看保留字:

>desc v$reserved_words;//要求SYSDBA权限

>select * from v$reserved_words where reserved='Y';//保留字多数是关键字

建表,要求有存储空间和权限:

>create table hr.students (stu_id number,stu_name varchar2(20),stu_sex char(1) DEFAULT 'M');

DEFAULT参数填入默认值。

数据类型:number date 定长char(2000Byte) 可变字串varchar2(4000Byte) CLOB(charactor larger object 约4Gbyte)。

查看块大小:

>show parameter db_block_size;

时间间隔的数据类型:INTERVAL YEAR TO MONTH;INTERVAL DAY TO SECOND

添加列:格式(alter table 表 add 表)

>alter table students add resume clob;

>desc students;

建表约束条件,用于建表的列名后:constraint+约束名+约束类型

NOT NULL不空

UNIQUE不重,允许为空

PRIMARY KEY不重不空

FOREIGN KEY外键的值只能为参考主键值或NULL

CHECK自定义检查

约束用于限制表中数据的有效性。

NOT NULL约束:(NOT NULL约束直接附在列名后)

>create table t1(id number NOT NULL,name char(10));

>create table t2(id number,name char(10));

>alter table t2 modify id number NOT NULL;

UNIQUE约束:

>create table t3 (id number constraint t3_id_un UNIQUE,name char(10));

>create table t4 (id number name char(10));

>alter table t4 add constraint t4_id_un UNIQUE(id);

主键约束用法:(建表的constraint+约束条件名+约束类型,改表的constraint+约束条件名+x约束类型括进列名)

>create table t5 (id number constraint t5_id_pk primary key,name char(10));

>create table t6 (id number,name char(10));

>alter table t6 add constraint t6_id_pk primary key(id);

外键约束用法:(constraint+约束条件名+references+主键表(主键列))

>cerate table classes (id number constraint class_id_pk primary key,class_name char(10));

>drop table students

>create table sutdents (stu_id number,stu_name char(10),class_id number constraint stu_classid_fk references classes(class_id));//建表外键约束写在内部

>create table sutdents (stu_id number,stu_name char(10),class_id number,constraint stu_classid_fk foreign key(class_id) references classes(class_id));//建表外键约束写在外部

>create table students1 (stu_id_number,stu_name char(10),class_id number);

>alter table students1 add constraint stu1_classid_fk foreign key(class_id) references classes(class_id);

注意建表外键约束写在外部同修表形式,若写在内部不能加数据类型和foreign key关键字。否则将出现ora-02253错误,“这里不允许限制声明”。

教材31页可以练习创建主外键的关系。

检查约束:

>alter table students add stu_age number(2);

>alter table students add constraint ck_age CHECK(stu_age between 12 AND 18);

>alter table students add stu_sex char(1) constraint ck_sex CHECK (stu_sex IN('M','F','m','f'));

复合主键:

>create table t8 (id2 number,name char(10) constraint t8_pk primary key(id1,id2));

用数据字典查看表的主外键关系:

>select table_name from user_tables;//查看表名

>select constraint_name,constraint_type from user_constraints where table_name='classes';//查看约束关系

第四天

160718第四天OCP笔记

ON DELETE CASCADE参数,联动修改,删除主键相关行同时删除外键相关行:

SQL> alter table students drop constraint STU_CLASSID_FK;

SQL> alter table students add constraint STU_CLASSID_FK foreign key(class_id) references classes(class_id) on delete cascade;

ON DELETE SET NULL参数,联动修改,删除主键相关行同时将外键相关行置NULL:

SQL> alter table students drop constraint STU_CLASSID_FK;

SQL> alter table students add constraint STU_CLASSID_FK foreign key(class_id) references classes(class_id) on delete set null;

添加列:

>alter table students add resume clob;

删除列:

>alter table students drop resume;

重命名列:

>alter table students rename resume resume1

修改列定义:

>alter table students modify resume varchar2(4000);

修改列默认值、列约束条件的内容前面讲过。

创建视图:

>create view v1 as select * from employees;

视图本质上就是封闭一条查询语句。视图也可也像表那样用select desc。

视图不能删除,只能删除再创建:(两种方法)

>drop view v1;

>create view v1 as select * from employees;//方法1

>create or replace as ...;//方法2

创建视图问题:

>create or replace v1 as select * from employees;

WITH CHECK OPTION子句,对视图的DML操作限定在视图范围内,超出范围将被拒绝:

>create or replace v1 as select last_name,salary from employees where salary>15000 with check option;

>update v1 set sal=12000 where last_name='Kochhar';//若不加with check option参数,修改后值将不可见,添加此参数将拒绝修改。

创建只读视图:

>create or replace v1 as select last_name,salary from employees where salary>15000 with read only;

删除视图:

>drop view v1;

简单视图的基表只能是1个,不包含函数,不分组。

视图包含以下内容不能删除行:DISTINCT、伪列rownum、组函数。

视图包含以下内容不能修改行:DISTINCT、伪列rownum、组函数以及表达式定义的列。例如salary*12为表达式定义的列。

视图包含以下内容不能添加行:DISTINCT、伪列rownum、组函数、表达式定义的列以及没有包含NOT NULL列。

SEQUENCE序列。

>create sequence seq1 increment by 3 start with 0 maxvalue 50 cycle cache 10;//参数cache指一次算10个,供后面使用。

>create table test001(id int);

>insert into test001 values(id,sql.nextval);

>使用数据字典user_sequence查看sequence当前值

索引。

索引可以自动创建或手动创建,自动使用。全内存数据库不需要创建索引。且索引增加DML负担,浪费系统资源。

数据库查询有全表扫描和索引扫描,等方式。Oracle根据执行计划进行成本判断决定是否使用索引。当具有索引且索引有助于(执行方案选优)查询才使用索引。

例如select count(*) from t1;是用全表扫描的,当有where条件时可能用索引。

以某一列创建索引:

>create index inx_test001_id on test_001(id);

创建索引的情况:列值范围很广,列中包含大量的空值,在where子句频繁用表的列尤其是多表联接的等值联接条件,表很大(万行以上)却查询结果小于4%。

OLPT系统改的多查的少,一般不建索引。

upper(last_name)='SMITH'代替last_name='Smith'会解决输入大小写的问题,但不再使用索引。

同义词:

>create synonym emp for employees;

>create pulbic synonym e1 for hr.employees;//需要sysdba权限,创建所有人都可以使用的同义词。

第一章 了解Oracle体系结构

Oracle Server=Oracle Instance(运行时)+Oracle Database(存储上)

Oracle Instance=Processes+Memory

Processes=ServerProcess+BackgrountProcess。服务进程为用户所拥有

查看Oracle服务进程:

>ps -ef|grep|oracleorcl

查看后台进程:

>ps -ef|grep ora_

研究5个关键的后台进程:

Process Monitor      即ora_pmon_orcl 作用:注册服务器、回收资源

System Monitor       即ora_smon_orcl 作用:实例恢复,合并空间

Database Writer      即ora_dbw0_orcl 作用:将内存中的数据写回磁盘

Log Writer           即ora_lgwr_orcl 作用:将内存中的日志写回磁盘

Checkpoint           即ora_ckpt_orcl 作用:同步数据文件、日志文件、控制文件,使数据库达到一致性。

Memory:一个共享区域(System Global Area SGA)和N个私有区域(Progrram Global Area PGA)。

SGA划分:database buffer cache、redo log buffer、shared pool、java pool、stream pool、large pool。

large pool用于支持备份恢复、数据装载、数据导入导出、并行查询或DML操作。

java pool用于支持java虚拟机。

streams pool支持流服务。

PGA用于存放会话信息、权限、变量、堆栈。

存储:filesystem/ASM裸设备/RAW/NFS/NAS/SAN...

数据库文件:数据文件、日志文件、控制文件、参数文件。归档日志文件、备份文件、口令文件、

参数文件存放位置:

$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora。用于启动Oracle Instance。

数据文件存放位置:

>select name from v$datafile;

>select name from v$tempfile;

日志文件存放位置:

>select nember from v$logfile;

控制文件:

>select name from v$controlfile;

口令文件:

$ORACLE_HOME/dbs/orapworcl.ora;

进程跟踪及预警文件:

/u01/app/oracle/diag/rdbms/orcl/orcl/trace;//进程跟踪文件

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log;//预警文件

实施ASM存储后性能和容错性会提升。

安装独立于服务器的Oracle Grid Infrastructor:

安装Linux

创建组:asmadmin asmdba asmoper oinstall dba oper

创建帐号:#useradd grid -g oinstall -G asmadmin,asmdba,asmoper,dba;useradd oracle -g oinstall -G asmdba,dba,oper

(注意用户组要加对,否则无法添加ASM磁盘组,id grid;id oracle查组,usermod -a G dba grid添加组)

建目录:/u01/app/grid;/u01/app/oracle。拥有者:grid:oinstall /u01;oracle:oinstall /u01/app/oracle。权限:775。

环境变量修改部分:export $ORACLE_BASE=/u01/app/grid;export $ORACLE_HOME=/u01/app/grid/product/11.2.0/gridhome_1;ORACLE_SID=+ASM

准备ASM磁盘:40G,平均分11个区。

查看Linux内核版本:#uname -r

安装ASMLib:#rpm -ivh /光盘目录/*;

配置ASMLib服务:#/etc/init.d/oraleasm configure; 参数:grid/asmadmin/y/y。注意当前目录执行要用./oracleasm configure;

转化为ASM磁盘:#/etc/init.d/oraleasm createdisk asmdisk01 /dev/sdb1;//注意sdb4分区是扩展区不能使用,注意是ROOT用户

asmdisk01 /dev/sdb1

asmdisk02 /dev/sdb2

asmdisk03 /dev/sdb3

asmdisk04 /dev/sdb5

asmdisk05 /dev/sdb6

...

asmdisk10 /dev/sdb11

查看ASM磁盘:#/etc/init.d/oraleasm listdisks;

删除ASM磁盘#/etc/init.d/oracleasm deletedisk asmdisk18

DATA Normal asmdisk01-04

FRA External asmdisk05-08

安装grid软件:

#su - grid

$.../clusterware/Disk1/runInstaller;//执行安装

选:Install and Configure Grid Infrastructor for a Standalone Server;数据磁盘选DATA Normal;口令;其它同Oracle安装

用grid帐户执行$asmca;把5-8磁盘选成FRA。

($sqlplus / as asmdba;>startup;//启动ASM实例)

安装OracleDatabase软件:

Oracle用户下运行./runInstaller,只安装不建库,单实例数据库(不选RAC,real application cluster),执行脚本参数为缺省的不覆盖。

建库:

$dbca,General模板(General为OLPT模板,DATA为仓库模板)。全局数据库名任意起名,SID与环境变量一致。EM用database control(不用grid control)。密码。

Storage Tyep用ASM,Darabase Area用+DATA,ASM口令。recovery option的flash recovery area设置为FRA(主要用来放备份文件),不选EnableArchiving。

勾选Samples,内存(默认)、进程数(默认)、字符集(AL32UTF8)、ConnectionMode(默认)。

勾选建库,存模板,存建库脚本。EM解锁。

第五天

160719第五天OCP笔记

init.ohasd(包装进程):实现自动启动监听、ASM实例、数据库实例。

数据库逻辑结构:数据库-表空间-段-区-块。段是空间分配单元。表不够用时,以区为单位扩展。一般SYSTEM、SYSTEMAUX不用来存数据。

查看表空间名:

>select tablespace_name from dba_tablespaces;//需要SYSDBA权限

查看表空间名及文件名:

>select tablespace_name,file_name from dba_data_files;

向指定表空间建表:

>create table test (id number,name varchar(10)) tablespace users;

修改表的列宽

>col segment_name for a10;

查看表所在表空间、表、段、区、块:(表空间是users,而所有者是SYS)

>select tablespace_name,segment_name,blocks,extents,bytes/1024/1024 from dba_segments where owner='SYS' and segment_name='TEST';//注意SYS大写,表名也必需大写,不能用通配符?

循还录入数据(注意加/执行):

>begin

for i in 1..1000 loop

insert into test values(i,'aa');

end loop;

commit;

end;

/

启动监听:无GI用oracle帐号 lnsrctl start,有GI用grid帐号。再启数据库、EM(EM启动需要创建安全例外)。

执行脚本:>sqlplus hr/hr@scripts.sql

数据库分阶段诊断启动:过程instance started;database mounted;database open;

>start nomount;//若执行startup mount直接执行到第2阶段

>alter database mount;

>alter database open;

数据库4种关闭方式。生产环境多用shutdown transactional。shutdown abort则再启动由SMON实例恢复。

命令startup force=shutdown abort+startup

参数含义查看文档,改参数:

>alter system set sga_max_size=800M scope=both;//scope值memory、spfile、both

查看内存参数:

>show parameter sga_max_size;

查看磁盘参数文件:

#strings $ORACLE_HOME/dbs/spfileorcl.ora;//文件系统

#strings +DATA/orcl/spfileorcl.ora;//ASM设备

其中sp指separate physical

SQL清屏:

>!clear;

Oracle运维需要查看:

1、预警文件        运行常规信息

1、进程跟踪文件    各类进程,用地排错

3、动态性能视图    日常性能监控 内存表的视图

4、数据字典视图    数据库的物理和逻辑信息 数据字典的视图

从References 的PartIII Dynamic Performance View

动态性能视图:

用v$sql保存最近执行的SQL语句:

>select sql_text,executions from v$sql where cpu_time>200000;

用v$session查看登录的会话:

用v$lock查询锁信息:

>select sid,ctime from v$lock where block>0;

数据字典视图(都是复数):

查看用户拥有的表:

>select table_name from user_tables;

>select table_name from dba_tables;//查看所有用户拥有的表

其它表dba_users、all_sequences、dba_indexes。

查看预警文件:EM-AlertHistory。

/*--------------------------------------------------------------------------------------------------------------------

ASM的磁盘组在数据库建立之前用命令行管理,数据库建立之后用EM或SQLPLUS管理。

实例管理ASM磁盘组(SQLPLUS):

grid帐号运行sqlplus / as asmdba;

用v$asmdisk v$asm_diskgroup查看ASM磁盘使用情况:

>select group_number,name from asm$disk;

建磁盘组(4块):

>create diskgroup DG1 normal redundancy disk 'asmdisk09','asmdisk10','asmdisk11','asmdisk12';//redundancy指冗余

再次查看磁盘组:

>select group_number,name from asm$disk;

添加/删除磁盘组:

>alter diskgroup dg1 add/drop disk 'asmdisk13';

同时添加删除磁盘(经常用于换盘,用一条执行的更快):

>alter diskgroup DG1 add disk 'asmdisk14' drop disk 'asmdisk12';

删除磁盘组:

>drop diskgroup dg1;

实例管理ASM磁盘组(EM):

进入General下的ASM,删除ASM磁盘要force。

创建磁盘组参数:

Redundancy冗余参数有high(至少三块磁盘)、normal(至少两块磁盘)、external(不冗余至少一块磁盘)

Allocation Unit分配单元

创建故障组(EM):选若干块磁盘,FailureGroup起相同的名字。

创建故障组(SQLPLUS):

>create diskgroup dg normal redundancy failgroup f1 disk 'asmdisk09','asmdisk10';

>create diskgroup dg normal redundancy failgroup f2 disk 'asmdisk10','asmdisk11';

区映射:只了解。

ASM磁盘组的兼容性:DATA/FRA/DG磁盘组由“ASM实例-Grid”管理,由“数据库实例-OracleDatabase”使用。

创建磁盘组时OracleDatabase版本<'compatible.rdbms'<'compatible.asm'<=Grid版本。兼容版本越低性能越差。

重平衡REBALANCE,数据平均分配到磁盘上。

创建表空间

>create tablespace tbs1 datafile '+FRA';

删除磁盘后每个磁盘内容变多:

>alter diskgroup FRA drop disk 'asmdisk08';

ASM快速镜像重新同步:当磁盘离线

实例管理ASM磁盘组(命令行)(在数据库建立之前使用):

grid$asmca;

grid$asmcmd;

课后练习5.1。需要将Oracle安装光盘的labs目录下。

第六天

160720第六天OCP笔记

/*网络配置-------------------------------------------------------------------------------------------------------------------------------------------------

netmgr中的名字解释:HostName主机名、ServiceName数据库全局服务名、SID为$ORACLE_SID。

对于单实例数据库,Oracle Server、Oracle Listener在同一台服务器。

listener.ora提供以下信息:监听器名、IP、端口、数据库服务名。

生成监听listener.ora:无GI用orcle有GI用grid帐户。$netmgr;添加Listeners,主机IP(用静态加快访问速度)、端口、GlobalDatabaseName填数据库全局名、填$ORACLE_SID。

注意监听配好后要启动监听,多监听启动要指定监听名。

生成tnsnames.ora:无GI有GI用oracle帐户。$netmgr;添加Service Naming,NetServiceName填网络服务名,主机IP,端口号,ServiceName填数据库全局名。

注意listener.ora的参数要与已配好监听相同。

文本编缉监听器$vim $ORACLE_HOME/network/admin/listener.ora;$vim $ORACLE_HOME/network/admin/tnsnames.ora;有GI与无GI的区别是$ORACLE_HOME不同。

文本编缉第2个监听器的名字不同、端口号不同、去掉IPC通讯的一行(第一个监听器IPC保留),其它的相同。由Process Monitor提供注册服务。

查数据库全局名>show parameter service_names

显示$ORACLE_HOME:echo $ORACLE_HOME

显示$ORACLE_SID:echo $ORACLE_SID

查看监听是否提供服务:$lsnrctl status listener2;

通过进程间通信而不通过网络访问数据库:

$sqlplus hr/hr;

$sqlplus / as sysdba;

使用监听访问数据库(简单访问):

$sqlplus hr/hr@IP:1521/orcl

$sqlplus sys/oracle@IP:端口/数据库全局服务名 as sysdba;

通过使用不同的端口使用不同的监听器。

使用监听和tnsnames.ora访问数据库():

$sqlplus hr/hr@网络服务名;

$sqlplus sys/oracle@网络服务名 as sysdba;

专用服务器进程:

查看服务器进程:

>show parameter processes;//查看全部进程

>ps -ef|grep ora_;//查看后台进程

设置共享服务器进程(服务端):

>alter system set shared_servers=25;//设置共享服务的进程数

>alter system set shared_server_sessions=100;//设置共享服务的用户数

>alter system set dispatchers='(protocol=tcp)(dispatchers=1)';//拿出一个进程作排号器,注意dispatchers参数加引号

设置共享服务器进程(客户端):

编缉tnsnames.ora将server=dedicated改为server=shared//将dispatchers注册到默认监听器。

用lsnrctl;services是否是dispatcher,约等5分钟才显示。dispatcher分配器。

对于共享服务器进程,当用户请求时,监听将不返回server process地址,而是返回dispatcher序列号。

以下操作不被共享服务器进程:管理、备份还原、装载、导入导出、并行。如shutdown immediate;

对于共享服务器进程,SGA要增,PGA(用户独有)要减。

/*存储结构-------------------------------------------------------------------------------------------------------------------------------------------------

查询表空间及文件:

>select tablespace_name,files from dba_data_files;

创建表空间:

>create tablespace tbs1 datafile '+DATA' size 20M;//若文件系统datafile的参数'/u01/app/oracle/oradata/orcl/tbs2.dbf'

>create tablespace tbs2 datafile '+DATA' size 20M,'+FRA' size 20M;//此命令创建2个数据文件,小表空间最多1024个文件,大表空间(32T-128T)只有1个数据文件

>create tablespace tbs3 datafile '+DATA' size 20M,autoextend on next 10M maxsize 10G,'+FRA' size 20M autoextend on next 5M maxsize unlimited;

删除表空间:

>drop tablespace tbs4;

EM图形界面管理表空间:略

段 区对应关系:

1M 64K

1-64M 1M

64M- 8M

区是最小的分配单位,块是最小的I/O单位。

数据由OMF管理的数据文件,在表空间删除会由oracle自动删除对应文件。????

删除表空间:

>drop tablespace tbs4 INCLUDING CONTENTS;

>show parameter db_create_file_dest;

>alter system set db_create_file_dest='/u01/app/oracle/oradata';

扩大数据库。

显示文件编号:

>select file# from v$datafile;

设置数据库文件大小:

>alter database datafile 9 resize 40M;

数据库文件大自动扩展:

>alter database datafile 10 autoextend on next 10M maxsize 10G;

表空间大小自动扩展:

>alter tablespace tbs3 add datafile '+DATA' size 10M autoextend on next 10M maxsize10G;

/*用户管理-------------------------------------------------------------------------------------------------------------------------------------------------

建帐户:

>create user jack identified by jack123;//需要SYSDBA权限,密码不加引号

系统权限。

用DCL语句(grant revoke)进行授予登录权限:

>grant create session to jack;

授予建表权限:

>grant create table to jack;

授予用户其它权限:

>grant create sequence,create synonym,create view to jack;

撤消权限:

>revoke create session from jack;

对象权限的撤消是级联的,系统权限的撤消是不级联的。

授予级联系统权限:

>grant create table to jack with admin option;

撤销级联系统权限:

>revoke create table from jack;

EM图形界面:Database-Users-填用户名,密码,系统权限

对象权限。对象权限为grant+权限+on表+to用户。

>grant select on hr.jobs to jack;

>revoke select on hr.jobs from jack;

>grant select on hr.jobs from jack with grant option;

>revoke select on hr.jobs from jack;//对象权限的撤销是级联的

级联???

>grant insert,update,delete on hr.jobs to jack;

角色使用:

>create role r1;

>grant select any table,create any table to r1;

>create role r2;

>grant all on hr.employees to r2;

>grant r1,r2 to jack;//把角色当作权限授权给用户

概要文件对应EM中的profile。用于资源控制和口令安全性。如:限制连接时间、空闲多长时间断开、每个用户限制的会话数。

EM中设置概要:Server-Security-Profiles-。

资源限制开启:

>alter system set

通过函数限制口令复杂度:要么用PL/SQL编。要么$ORACLE_OME/rdbms/admin/utlpwdmg.sql脚本,以SYS用户执行此脚本,就可以在"ComplexityFuntion"填入函数名。

配额:

alter user jack quota 20M on users;

alter user jack quota unlimited on example;

grant unlimited tablespace to jack;

/*并发访问-------------------------------------------------------------------------------------------------------------------------------------------------

复习:锁机制,行锁、表锁、事务锁。锁的并发性和兼容性。

事务结束释放行锁和表锁。

查看某用户的事务信息SID:

>select sid from v$session where username='HR';//注意用户名要大写。

获取事务SID的锁类型、锁级别、请求的锁、阻断时间(s):

>select sid,type,lmode,request,ctime from v$lock where type in ('TM','TX') and sid in(事务号1,事务号2);

3级锁较温和,6级是排它锁。

EM图形界面:Performance-BlockingSessions。

看书只看收集命令。教材学生指导书只有大纲的作用,写的不细致。

第七天

160721第七天OCP笔记

TM锁-DML enqueue

TX锁-Transaction enqueue

LMODE:

0 none

1 null

2 row-S(SS) RowShare

3 row-X(SX) RowExclusive

4 share(S)

5 share row exclusive(SRX)

6 exclusive(X)

锁的排他性:X锁全排他,RS锁除了X锁全兼容,RX锁、S锁、SRX锁只兼容RS锁,SRX锁、X锁自斥。

DML加RX锁,select for update加RS锁,DDL、DCL加X锁。锁的兼容会导致等待。

兼容的锁加锁后,一个会话解锁后只解其会话的锁。

用EM查看锁等待队列:Performance-InstanceLocks。

分别对第一个用户,第二个用户加锁:

>lock table jobs in row share mode;//能加上锁,说明二级锁是不排它的。

解锁:

>commit;

找到长期占有锁的会话:

>select sid,ctime from v$lock where block>=1;//查找超过1秒的阻断。

>select serial# from v$session where sid=上条命令进到的;

结束长期占有锁的会话:

>alter system kill session 填SerialNumber immediate;

死锁由Orcle自动撤销产生死锁的语句。

EM管理undo表空间:Server-AutomaticUndoManagement:

>create undo tablespace undotbs2 data '+DATA' autoextend on next 10M maxsize 10G;

Oracle只能用一个undo_tablespace,由此语句设置undo表空间:

>alter system set undo_tablespace='UNDOTBS1';

显示undo表空间的自动管理、保留时间、强制保留:

>show parameter undo_;//undo_retention在事务完成之后开始记时,

设置undo_retention:

>alter system set undo_retention=900;单位秒

从EM获取undo表空间设置建议:

RelatedLinks-AdvisorCenter指导中心-AutomaticUndoManagement-RunAnalysis计算保留时间与undo表空间大小的对应关系。

用as of timestamp(to_timestamp(时间))查询还原数据:

>select * from employees as of timestamp(to_timestamp('2016-07-13 11:00:00','yyyy-mm-dd hh24:mm:ss')) ;

/*数据库审计-----------------------------------------------------------------------------------------------------

审计包括:强制审计、sysdba审计、标准审计、FGA细粒度审计、基于值的审计。

授予用户sysdba权限:

>grant sysdba to hr;//

强制审计只审计管理员用户的登录行为。

查找强制性审计的进程号(由sid找paddr到spid):

>select spid from v$process where addr=(select paddr from v$session where sid=(select distinct sid from v$mystat));//注意v$process中的列名为addr

显示审计文件位置:

>show parameter audit_file_dest;//默认在$ORACLE_BASE/admin/orcl/adump;由上面的进程号找到审计文件位置

$进目录

$more orcl_ora_进程号.aud;

标准审记审计非sys用记的行为:

>show parameter audit_trail;

若audit_trail=DB则审计信息保存在数据字典aud$。若audit_trail=OS则审计信息存放在audit文件目录。

标准审计的具体内容:

审计范围-session(默认)、access

审计类型-默认成功失败都记录

审计用户-默认所有人

审计内空-执行语句、使用系统权限、使用对象权限。

启用审计:

>audit unlimited tablespace by hr;//启用无限表空间的审计

用表dba_auti_trail查询标准审计

>col obj_name for a10;

>select username,obj_name,action_name from dba_audit_trail where username='用户名HR' and obj_name='表名T1';

关闭审计:

>noaudit create sequence by hr;//关闭建序列的审计

审计的图形界面:Serer-Security-AuditSettings。

FGA细粒度审计,可以查看用户发出语句的详细信息。通过包DBS_FGA实现。

查文档:MasterBookList-PL/SQL Packages and Types Reference-DBMS_FGA。

语法如下:

DBMS_FGA.ADD_POLICY(

  object_schema      VARCHAR2,

  object_name        VARCHAR2,

  policy_name        VARCHAR2,

  audit_condition    VARCHAR2,

  audit_column       VARCHAR2,

  handler_schema     VARCHAR2,

  handler_module     VARCHAR2,

  enable             BOOLEAN,

  statement_types    VARCHAR2,

  audit_trail        BINARY_INTEGER IN DEFAULT,

  audit_column_opts  BINARY_INTEGER IN DEFAULT);

添加审计查看、修改50部门员工工资:

begin

DBMS_FGA.ADD_POLICY(

  object_schema  =>    'hr',

  object_name    =>    'employees',

  policy_name    =>    'audit_50_sail',

  audit_condition=>    'department_id=50',

  audit_column   =>    'salary',

  handler_schema =>    VARCHAR2,

  handler_module =>    VARCHAR2,

  enable         =>    true,

  statement_types=>    'select,update');

end;//注意包参数用=>,无效参数要去掉,end结尾加分号和/。

由数据字典查看dba_fga_audit_trail审计:

>select sql_text from dba_fga_audit_trail;

禁用审计:

DBMS_FGA.ADD_POLICY换为DBMS_FGA.DISABLE_POLICY

启用审计:

DBMS_FGA.ADD_POLICY换为DBMS_FGA.ENABLE_POLICY

删除审计:

DBMS_FGA.ADD_POLICY换为DBMS_FGA.DROP_POLICY

基于值的审计,可以看出值的变化。通过触发器记录信息,信息必需记录在自定义的表中。

sysdba审计。

开启sysdba审计:

>show parameter audit_sys_operations;

>alter system set audit_sys_operations=true scope=spfile;//此参数不能直接修改,需要重启数据库

>shutdown immediate;

>startup;

/*试用以下脚本不记录----------

scott.emp   sal  的变化记录下来

create table audit_emp_change(name varchar2(10),oldsal number,newsal number,time date);

create or replace trigger tr_sal_change

after update of sal ON emp

for each row

declare

v_temp int;

begin

select count(*) into v_temp from audit_emp_change

where name=:old.ename;

if v_temp=0

then

insert into audit_emp_change values(:old.ename,:old.sal,:new.sal,sysdate);

else

update audit_emp_change set oldsal=:old.sal,newsal=:new.sal,time=sysdate

where name=:old.ename;

end if;

end;

/

/*----------

sysdba审计记录位置,再通过查进程号确定哪个文件:

>show parameter audit_file_dest;

/*数据库维护-----------------------------------------------------------------------------------------------------

由于sql语句处理成ExcutionPlans需要消耗系统资源。由优化程序统计信息可以获得较好的执行计划。

查询执行计划:

>set autotrace on;

>select sql_text,?? from v$sql;

由GATHER_DATABASE_STATUS Procedures包控制。

EM中查看统计信息:Server-QueryOptimizer-ManageOptimizerStatistics-GatherOptimizerStatistics。

由数据字典查看表的最后收集时间的表行数,用于优化执行计划。

>select num_rows,to_char(last_analyzed,'yyyy-mm-dd hh24:mm:ss') from dba_tables where owner='HR' and table_name='EMPLOYEES';

用GATHER_TABLE_STATUS Procedures包手动进行统计信息收集:

DBMS_STATS.GATHER_TABLE_STATS(

ownname=>'hr',

tabname=>'employees',

cascade=>true

第八天

160722第八天OCP笔记

性能管理:内存、I/O、应用程序(SQL PL/SQL)、资源争用(锁、闩、互斥Lock latch mutex)、网络

等待事件 v$event

查询等待事件:

>select distinct wait_class from v$event_name;

>select name from v$event_name;

查询等待事件(阻断)的SID:

>select sid from v$lock block=1;

等待事件相关的动态性能视图:系统v$sysstat v$system_event 会话v$sesstat v$session_event 特定服务v$service_stats v$service_event。从asktom.orale.com网站上找脚本。

内在优化由oracle 11g AMM Automatic Memiry Management自动管理。只需指定memory_target=内存大小,由MMAN进程通过AWR快照调整内存,每10分钟检测一次。

OLPT系统DB80%和OS20%,Oracle通过指导中心的内存指导报告内存。Oracle11g将sga_target设为0、pga_aggregate_target设为0(自动),只设置memory_target即可。

OLAP/DSS在线分析系统,即用作数据仓库时PGA大些 SGA50%/PGA50%。

验证索引对性能提升:

设置跟踪:

>set autotrace on;//需要SYSDBA权限

>create table hr.test200 tablespace users as select * from dba_objects;//建表

>create index hr.ind_test200 on hr.test200(object_id);//建索引

执行查询:

>select * from hr.test200 where object_id=1000;

将表移动,将使索引失效:

>alter table hr.test200 move tablespace example;

查索引是否失效:

>select status from dba_indexes where owner='HR' and index_name='IND_TEST200';

解决只需重建索引:

>alter index hr.ind_test200 rebuild;

删除索引:

>drop index hr.ind_test200;

/*备份恢复的概念---------------------------------------------------------------------

故障现象:语句失败、用户进程失败、网络故障、用户错误、实例故障、介质故障。只有介质故障通过"备份和恢复"。

复用文件一般3个,太多影响性能。控制文件、日志文件、归档日志可以复用,数据文件不复用。全数据库、数据文件、归档日志、控制文件、参数文件可以备份。

复用控制文件:

>select name from v$controlfile;//查看现有控制文件

>asmcmd拷贝控制文件(注意需要关闭文件进行控制文件拷贝,否则容易出现数据库版本不一致)

>alter system set control_files='控制文件1','控制文件2','控制文件3' scope=spfile;//注意ASM存储中.后面的文件名不填。control_files只能改参数文件

注意:控制文件挂多个只是方便查询复用的位置,而只有一个生效。

>重启数据库

ASM中拷贝文件:

$su - grid

$asmcmd

>cd;ls进目录

>cp 被拷文件 拷贝到

ASM常用命令:cd ..进入根目录,lsdg列出磁盘组,lsdsk列出磁盘。

复用日志文件:

>col member for a50;

>select group#,member from v$logfile;

>alter database add logfile member '+DG' to group 1;//文件系统填路径

>alter database add logfile member '+DG' to group 2;

>alter database add logfile member '+DG' to group 3;

切进日志直到消除invalid状态:

>alter system switch logfile;

>select group#,member,status from v$logfile;

复用归档日志(归档日志是组内镜像,组间同步)。

设置归档路径:

$mkdir -p /u01/arch01;

$mkdir -p /u01/arch02;

>alter system set log_archive_dest_1='location=/u01/arch01';//ASM为'location=+FRA'

查看归档路径:

>show parameter log_archive_dest;//显示归档路径

>show parameter db_recovery_file_dest;//默认归档路径

>关数据库,再启到mount模式startup mount

开启归档:

>alter database archivelog;

#ps -ef|grep ora_arc;//查看进程

检查归档开启:

>desc v$database;//找到log_mode

>select log_mode from v$database;

备份工具RecoveryManager可用于在线备份。

数据库必需先归档后备份,归档过程为:建目录,设置归档路径(检查设置),在数据库挂载状态开启归档(检查进程),切换以使用归档。

先删除表空间方便实验:

>drop tablespace 表空间名;

>drop datafile 文件名

$su - oracle

$rman target /

备份全数据库:

>backup database;

备份表空间:

>col tablespace_name for a30;

>select tablespace_name,file_name,file_id from dba_data_files;

>backup tablespace users,example;

备份数据文件:

>backup datafile 4,5 format '/u01/backup/f4_5.bak';

备份控制文件:

>backup current controlfile;

备份参数文件:

backup spfile;

备份归档日志

backup archivelog all;

查文档:backup & recovery;backup & recovery user guides

控制文件坏了只能启动到实例。

查控制文件目录:

>select name from v$controlfile;

$关闭数据库,删除控制文件,再启动数据库;ASM存储需要先关闭数据库才能删除控制文件

运行一条语句,再查日志找到控制文件的报告:

$tail -20 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log;

设置control_files修复:

>alter system set control_files=没坏的文件;

也可以拷贝修复:

$关闭数据库,拷贝控制文件,再重启数据库。

注意:ASM会删除空目录,是OMF的特征。建目录mkdir +FRA/orcl/controlfile/。

日志文件损坏修复。日志文件只添加无需拷贝。

先切换日志以启用日志:

>alter system switch logfile;//切换日志去掉INVALIDATE

>select group#,member,status from v$logfile;

>删除部分日志文件模拟损坏,ASM需要关闭数据库才能删除文件,查看预警日志文件。

$tail -20 $ORACLE_BASE/diag/rdbms//orcl/orcl/trace/alert_orcl.log;

通过删除损坏的日志组成员来修复:

>alter database drop logfile member '日志文件路径';

若无法删除,说明为当前日志组成员,使用alter system switch logfile;切换掉。

重加日志组成员,还原复用结构:

>alter database add logfile member '日志文件路径' to group 组号;

临时文件损坏。临时文件用于存放临时表和磁盘排序。

查临时文件位置:

>select name from v$tempfile;

查临时表空间名:

>select tablespace_name from dba_tablespaces where contents='TEMPORARY';

删除临时文件模拟损坏:ASM删除文件需要关闭数据库

添加临时文件:

>alter tablespace temp add tempfile '$ORACLE_BASE/oradata/orcl/tmp02.db' size 20M autoextend on next 20M maxsize 10G;//注意不要漏掉容量

删除损坏文件:

>alter tablespace temp drop tempfile '$ORACLE_BASE/oradata/orcl/tmp01.db';

若在关闭期间损坏临时表空间文件,则数据库自动重建。

口令文件的损坏,口令损坏将导致远程登录无法使用。

删除口令文件:

$rm $ORACLE_HOME/dbs/orapworcl;

重建口令文件:

$orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle;

数据文件损坏(非关键数据USERS)。

>alter system flush buffer_cache;

>select tablespace_name,file_name,file_id from dba_data_files;

查看备份文件:

$rman

RMAN>list backup;

损坏文件离线:

RMAN>sql 'alter database datafile 4,5 offline';

还原文件:

RMAN>restore datafile 4,5;

恢复文件(跑日志):

RMAN>recover datafile 4,5;

文件上线:

RMAN>sql 'alter database datafile 4,5 online';

数据文件损坏(关键数据SYSTEM/SYSAUX),需要关闭数据库进行恢复。

RMAN>run{

startup mount;

restore datafile 1,2,3,4,5;

recover datafile 1,2,3,4,5;

alter database open;

}

5、丢失所有日志组成员(上节课讲过丢失部分日志组成员)

INACTIVE非当前(已写回磁盘的日志,做日志恢复操作无需该组操作) ACTIVE非当前(此组日志对应的数据没有完全被刷新回磁盘,做数据库恢复需要该组中的日志信息) CURRENT(当前正在被使用的日志组)

先查看日志组成员:

>select group#,sequence#,status from v$log;

切换日志:

>alter system switch archivelog;

执行检查点,将所有日志对应的数据写回磁盘:(全部成为INACTIVE)

>alter system checkpoint;

破坏:删除INACTIVE的日志文件:

INACTIVE日志修复,不丢失数据,修复方法为:

>alter database clear logfile group 2;

第九天

160723第九天OCP笔记

参数文件的损坏。参数文件损坏将无法启动和写参数,已运行数据库可以使用。

指定文件备份路径:

>backup spfile format '/u01/sp.bak';

>list backup;

破坏参数文件:

$rm $ORACLE_HOME/dbs/spfileorcl.ora;//ASM的控制文件在+DATA/orcl/spfileorcl.ora

关闭数据库:

>shutdown immediate;

RMAN的数据库服务器至少到开启至实例状态,而缺少参数文件将无法启动至实例状态。解决办法是用RMAN内置实例启动数据库:

RMAN>start nomount;

用RMAN修复:

RMAN>restore spfile from 'u01/sp.bak';

RMAN中重启数据库:

RMAN>startup force;同startup abort+startup;

常见问题:若出现NO LOGON,是由于关闭时间过长,可以结束进程强制关闭数据库。

RMAN的设置。

查看所有的配置项:

RMAN>show all;

修改参数:

RMAN>参数;

删除备份:

RMAN>delete backup;不能在ASM中删除否则将不能同步日志,RMAN会误认为备份存在

备份参数有:控制文件自动备份、备份冗余、优化、加密、类型。

RMAN中只用分号查询命令帮助。查文档

configure control file auto backup启用控制文件自动备份。

configure retention policy to redundency 1备份冗余量,1为保留最近一次冗余量,2为保留最近两次冗余量。

configure retention policy to recovery window of 7 days备份保留天数。

cofigure backup optimization on备份优化以节约磁盘(恢复时间更长),一般不开。

configure encryption for database off开启加密。

configure encryption algorithm 'AES128'开启加密算法。

configure device type disk paralielism 1 backup type to backset备份类型:backup set备份集即空块不备份、image copy拷贝即和原始文件一样。

>backup database;

>backup as backupset database;

>backup as compressed backupset database;

>backup as copy database;

完全备份backup database,增量备份backup incremantal level 0 database。增量备份从0级开始。累积增量备份backup incremental level 1 cumulative database;

>delete backup;

>delete copy;

恢复控制文件数据库。

非本机登录RMAN:

$rman target sys/oracle@orcl;

备份共备份了:备份数据和备份原数据。备份原数据在控制文件当中。

通常建立目录数据库建立备份元数据-catalog database。丢失全部控制文件时就需要用catlog。

建立catlog过程:建库、建表空间、建用户、授权、创建catlog、注册catlog、同步catlog。

#xhost +

#su - oracle

$export $ORACLE_SID=catdb;

$dbca;不需要EM、不用自动管理、存储用文件系统、字符集AL32UTF8。(建库dbca时会自动在tnsnames.ora建立网络服务名)

>show parameter db_name;

建表空间用于存放元数据:

>create tablespace cats datafile '$ORACLE_BASE/oradata/catdb/cats.dbf' size 20M autoextend on;

建一个帐户用于管理元数据:

>create user catu identified by "catu" default tablespace cats temporary tablespace temp quota unlimited on cats;

授权:

>grant connect,resource,recovery_catalog_owner to catu;

创建catlog:

$rman target / catalog catu/catu@catdb

$rman target sys/oracle@orcl catalog catu/catu@catdb;//命令含义同上条

RMAN>create catalog;

注册catlog:

RMAN>register database;(否则将出现target database not found错误)

rman target /的备份同步到catlog:

>resync catalog;

修改之前的笔记,在grid帐户下配监听。

数据库的不完全恢复:主动/被动。

1、基于时间点的数据库不完全恢复。例如对DDL语句的恢复。

查看备份:>report need backup;//查看现有备份

$export NLS_LANG=american_america

$export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

$rman target /

RMAN>run {

startup force mount;//恢复需要在mount模式下进行

set util time='2016-07-20 01:36:00';

restore database;

recover database;

alter database open resetlogs;//数据库恢复之后必需以重置日志的方式打开一次

}

查看日志序号:

>archive log list;

删除之前日志:

>delete noprompt backup;

>delete noprompt copy;

进行第一次增量备份

>backup incremental level 0 database;

设置:

>sql 'alter system archive log current';

同步catalog:

>resync catalog;

2、使用SCN号进行数据恢复:

查SCN号:

>select current_scn from v$database;

恢复:

RMAN>run {

startup force mount;//恢复需要在mount模式下进行

set util scn=填SCN号;

restore database;

recover database;

alter database open resetlogs;//数据库恢复之后必需以重置日志的方式打开一次

}

3、基于SEQUENCE日志序号的数据恢复。

日志归档要复用,且放在不同磁盘上:

备份:

>delete noprompt backup;

>delete noprompt copy;

>archive log list;

>backup incremental level 0 database;

>sql 'alter system archive log current';

>resync catalog;

查日志的序号:

>desc v$log;

>select group#,sequence#,status from v$log;//序号为current为当前,

先进行表的添行DML语句,再切日志以增加日志序号:

>alter system switch logfile;

恢复:

RMAN>run {

startup force mount;

set util sequence=6;//恢复到第5组日志

restore database;

recover database;

alter database open resetlogs;

}

4、所有控制文件损坏:

备份:

>delete noprompt backup;

>delete noprompt copy;

>archive log list;

>backup incremental level 0 database;

>sql 'alter system archive log current';??含义

>resync catalog;

查看目前控制文件:

>select name from v$controlfile;

>shutdown abort;

>删除控制文件

启动到nomount并用RMAN进行恢复:

>startup nomount;

RMAN>configure control file auto backup;

RMAN>restore controlfile from autobackup;

RMAN>alter database mount;

RMAN>recover database;//文件不同步,仍要进行recover

RMAN>alter database open resetlogs;

再进行数据库备份:

5、

>select group#,sequence#,status from v$log;

>create table test100(id int);

>insert into test100 values(1);

>commit;

>alter system switch logfile;

>insert into test100 values(2);

>commit;

>alter system switch logfile;

>select group#,sequence#,status from v$log;

rman target / catalog catu/catu@catdb

startup mount;

restore database;

recover database until cancel;参数AUTO

recover database until cancel;参数CANCEL

alter database open resetlogs;

第十天

160724第十天OCP笔记

备份脚本:

run{

>delete noprompt backup;

>delete noprompt copy;

>archive log list;

>backup incremental level 0 database;

>sql 'alter system archive log current';

>resync catalog;

}

&灾难恢复。灾难恢复不含跟踪文件、预警文件、口令文件。

日常维护--

RMAN中启用控制文件自动备份configure control file auto backup

建立catalog

检查备份--

$rman target / catalog catu/catu@catdb

RMAN>list backup;

检查备份内容是否好:

RMAN>crosscheck backup;

破坏--

用联合查询查出控制文件、数据文件、日志文件:

>select name from v$datafile union select name from v$tempfile union select name from v$controlfile union select member from v$logfile;

>关闭数据库

asmcmd>删除以上文件

查参数文件并删除:

asmcmd>rm +DATA/orcl/spfileorcl.ora

查口令文件并删除:

$rm $ORACLE_BASE/dbs/orapworcl;

恢复--

恢复顺序:参数文件、控制文件、数据日志文件、口令文件。

文件损坏只参启到实例:

RMAN>startup nomount;//注意文件未损坏,要删除。否则会调用错误的参数文件而无法恢复

恢复参数文件:

RMAN>restore spfile from autobackup;//默认备份目录+FRA/ORCL/AUTOBACKUP/以日期命名的目录/。若无法恢复则用完全路径

RMAN>shutdown immediate;

RMAN>startup nomount;

恢复控制文件后可以挂载启动:

RMAN>restore  controlfile from autobackup;

RMAN>shutdown immediate;

RMAN>startup mount;

恢复数据文件:

RMAN>restore database;

SQL>recover database until cancel using backup controlfile;//。注意恢复日志文件的跑日志要在SQLPlus中,填参数为先AUTO、后CANCEL。???

恢复日志和临时文件:

SQL>alter database open resetlogs;//也可以在RMAN中执行

创建口令文件:

$orapwd file=%ORACLE_HOME/dbs/orapworcl password=oracle;

删除备份并重新备份:

&灾难恢复需要换设备,不能恢复到原始设备上的问题处理。

建目录:

$mkdir -p /u01/app/oracle/oradata/bak/;

查文件位置:

>select name from v$datafile;

确认备份:

RMAN>list backup;

恢复脚本:(添加了set newname,switch datafile)

run{

sql 'alter database datafile 4,5 offline';

startup mount;

set newname for datafile 4 to '/u01/app/oracle/oradata/bak/users01.dbf';//项ASM磁盘组则换为'+DG',DG为换上的新磁盘组。

set newname for datafile 5 to '/u01/app/oracle/oradata/bak/examples01.dbf';

restore datafile 4,5;

switch datafile 4;

switch datafile 5;

recover datafile 4,5;

sql 'alter database datafile 4,5 online';

}

&ASM的迁移。

创建一个非ASM的表空间--

$mkdir -p $ORACLE_BASE/oradata/orcl/

>create tablespace tbs10 datafile '/u01/app/oracle/oradata/orcl/tbs10.dbf' size 20M autoextend on;

>create table sys.test10 tablespace tbs10 as select * from dba_objects;

>select name,file# from v$datafile;

将非ASM表空间迁移到ASM--

查看未备份项:

RMAN>report need backup;

拷贝备份到指定磁盘组:

RMAN>backup as copy datafile 6 format '+DATA';

RMAN>sql 'alter database datafile 6 offline';

切换文件名:

RMAN>switch datafile 6 to copy;//迁移地址可以简写为copy

由于操作延迟,将文件前滚一点:

RMAN>recover datafile 6;

RMAN>sql 'alter database datafile 6 online';

&Blobk块的损坏。

开启校验

物理校验db_block_checksum=TYPICAL 耗CPU2~3%

逻辑校验db_block_checking=MEDIUM 耗CPU1-10%

物理校验在块头写入校验信息,逻辑校验校验段头块和段之间的关系。校验只能预防坏块。

文档

创建表空间tbs20并加表test20--

查看表的块信息:

>select header_file,header_block,blocks from dba_segments where segment_name='TEST20' and owner='HR';

备份--

RMAN>report need backup;

RMAN>backup datafile 7;//7是新建的表空间对应文件

破坏块--

#dd dd of=/u01/app/oracle/oradata/orcl/tbs20.dbf bs=8192 conv=notrunc seek=200<

>任意填覆盖信息

>EOF;//结束

制造查询出错,报错为第一个坏块--

>alter system flush buffer_cache;

>exit;

$sqlplus hr/hr

>select count(*) from sys.test20;

修复坏块--

#su - oracle

找到所有坏块:

$dbv file=$ORACLE_BASE/oradata/orcl/tbs20.dbf blocksize=8192;

用RMAN修复坏块:

RMAN>recover datafile 7 block 坏块序号用逗号隔开;

附dd命令:

将指定的文件写入到指定的输出文件:

#dd if=boot.bin of=orange.img bs=512 count=1 conv=notrunc;

&Oracle11g新特性DRA Database Recovery Advisor数据恢复顾问

使用DRA用来修复坏块--

发现错误:

RMAN>list failure detail;

修复建议:

RMAN>advice failure 错误号;

修复错误:

RMAN>repair failure;

&闪回技术

闪回删除            回收站

闪回查询            UNDO表空间

闪回事务            redo log

闪回数据库          数据库的闪回日志

Tocal Recall        闪回归档

1、闪回删除

drop table并没有删除而是放到回收站。每个表空间有独立的回收站,除了SYSTEM表空间。

开启回收站:

>show parameter recyclebin

>alter system set recyclebin on;

实验--

>create table hr.t1 tablespace system as select * from dba_objects where rownum<10001;

>create table hr.t2 tablespace system as select * from dba_objects where rownum<10001;

>c/2/3;把2换成3再创建张表

>create index hr.idx_t1 on hr.t1(object_id) tablespace system;

>create index hr.idx_t2 on hr.t1(object_id) tablespace system;

>create index hr.idx_t3 on hr.t1(object_id) tablespace system;

>drop table hr.t1;//删除表会自动删除索引

>drop table hr.t2;

>drop index hr.inx_t3;

>drop table hr.t3;

显示回收站内容:

>show recyclebin;

加收站中的名称较长,用数据字典查其原名user_recyclebin或dba_recycle_bin:

>select object_name,original_name,type from user_recyclebin;

回收站中的数据可以查询SELECT,而不可以DML/DDL操作。表的删除其索引也被附带删除。

闪回:

>flashback table t2 to before drop;(闪回表的相关索引同时闪回)

若回收站中有重名,需使用回收站中的名称,需用双引号界定,并重命名:

>flashback table "回收站中的名称" to before drop rename to t2_other;

以下两种情况表删除不经过回收站:drop table t1 purge;、表经过virtual personal database(VPD)加密。

当有空间压力时,回收站中的内容会自动清空。自动扩展的表空间有空间压力也要先清空回收站。

>purge table t2;

>purge index t1_idx;

清空回收站:

>purge user_recycle_bin;purge dba_recycle_bin;

>purge tablespace users USER hr;

2、闪回查询

undo_tablespace=undotbs1;

undo_management=auto;

undo_retention=900;

用于已提交DML的闪回查询。

>select salary from employees where employee_id=196;

>update employees set salary=13100 where employee_id=196;

>commit;

闪回查询:

>select salary from employees as of timestamp(to_timestamp('2016-07-20 01:00:00','YYYY-MM-DD HH24:MI:SS')) where employee_id=196;

用子查询查闪回值:

>update employees set salary=(select salary from employees as of timestamp(to_timestamp('2016-07-20 01:00:00','YYYY-MM-DD HH24:MI:SS')) where employee_id=196)  where employee_id=196;

将表闪回到过去的时间点:

>alter table employees row movement;//开启行迁移功能

>flashback table employees to timestamp(to_timestamp('2016-07-20 01:00:00','YYYY-MM-DD HH24:MI:SS'));

通过伪列(versions_starttime versions_endtime)看列具体的时间:

>select salary,versions_starttime,versions_endtime from employees versions BETWEEN to_timestamp('2016-07-20 01:00:00','YYYY-MM-DD HH24:MI:SS') AND to_timestamp('2016-07-20 02:00:00','YYYY-MM-DD HH24:MI:SS')  where employee_id=196;

3、闪回事务 Redo Log

开启补充日志:

>alter database add supplemental log data;

>alter database add supplemental log data(primary key) columns;//需要SYSDBA权限

DML:

>update hr.employees set salary=8100 where employees_id=196;

查看闪回事务:

>select undo_sql from flashback_saction_query where table_name='EMPLOYEES' and TABLE_OWNER='HR';//需要SYSDBA权限

>update "HR" ."EMPLOYEES" set "SALARY"='6100' where rowid='闪回事务的rowid';

4、闪回数据库--数据库闪回日志

前提要先启用归档模式

>shutdown immediate;

>startup mount;

启用数据库闪回功能:

>alter database flash on;

检查已开启闪回功能:

>select flashback_on from v$database;

#ps -ef|grep ora_rvwr

查看闪回日志位置:

>show parameter db_recover_file_dest;

设置闪回日志保留时间:

>alter system set db_flashback_retention_target;

误操作truncate table的解决:

RMAN>startup force mount;

RMAN>flahsback database to time="to_date('2016-07-20 11:57:00','YYYY-MM-DD HH24:MI:SS')";//注意time时间赋值加引号

RMAN>alter database open resetlogs;

RMAN>flahsback database to SCN=值;

RMAN>flahsback database to SEQUENCE=值;

用还原点还原--

>create restore point aaa;

>truncate table hr.t2;

>starup force mount;

>flashback database to restore point aaa;

>alter database open resetlogs;

闪回的限制:

1、控制文件重新建立过或者还原过:

2、删除过表空间;

3、收缩过数据文件;

这些情况只能数据库的不完全恢复来解决。

5、闪回归档Total Recal,用于闪回查询的UNDO表空间限制undo_retention

>create tablespace recall datafile '+DATA' size 20M autoextend on;

>create flashback archive default flash_recall tablespace recall retention 10 year;

>alter table hr.employees flashback archive flash_recall; select salary from employees as of timestamp(to_timestamp('2016-07-20 10:44:29','yyyy-mm-dd hh24:mi:ss'));

第十一天

160727第十一天OCP笔记

移动数据(Oracle的IO)--

非Oracle数据移到Oracle数据    用装载SQL Loader

Oracle数据移到Oracle数据      用导入导出DataDump

外部表技术:将数据旋转在数据库外部,通过数据库访问外部数据。分为非Oracle数据外部表,和Oracle数据外部表。

官方文档

//****************************************************************************************************

&SQL Loader使用--

TXT/EXCEL/SQL Server/。。

编缉数据文件:

$vim f1.dat

101,M,zhao

102,M,qian

103,F,sun

编缉控制文件(导入语法):载入文件、文件导入的表符列。

$vim f1.ctl

load data infile 'f1.dat'

insert into table students WHEN (5)=M fields terminated by ','

TAILING NULLCOLS

(stu_id,stu_sex,stu_name)

其中fields指字段。每行就是数据库行的分隔符,不用指定。

INSERT|APPEND|TRUNCATE关键字,INSERT只能向空表加入、APPEND追加、TRUNCATE先清空后添加。

WHEN (5)=M第五个字符为M的行放弃数据,第一个字符为1。未装载数据分为放弃数据和拒绝数据。

建表:

>create table students (stu_id number(3),stu_sex char(1),stu_name varchar2(10))

装载:

$sqlldr hr/hr control=f1.ctl;//需要指定向哪个用户装载数据

$sqlldr hr/hr control=f1.ctl log=f1.log bad=f1.bad;//功能同上条语句

产生f1.log存导入记录,f1.bad存未导入的记录。

对表添加约束(功能同放弃数据):

>alter table students add constraint ck_name CHECK(stu_id not in('qian'));

&装软件包使SQLPlus能够翻命令:解包、配置、编译、安装、加别名

#tar zxf rlwrap-0.36.tar.gz

#./configure

#make

#make install

#echo "alias sqlplus='rlwrap sqlplus'">>/home/oracle/.bashrc;//两个剑头指追加

#echo "alias rman='rlwrap rman'">>/home/oracle/.bashrc

查命令历史:#history

//****************************************************************************************************

&DataPump使用--

命令 expdp和impdp

数据包dbms_datapump

创建目录对象:

>create directory dump as '/u01/app/oracle/dump/';//目录由oracle帐户创建,命令需要SYSDBA权限

>grant read,write on directory dump to hr,system,scott,sh;

导出表:

$expdp hr/hr directory=dump dumpfile=employees.dmp tables=employees,departments;

导出schema的所有表:

$expdp hr/hr directory=dump dumpfile=employees.dmp schema=hr;

导出tablespace:

$expdp \'sys/oracle as sysdba\' directory=dump dumpfile=employees.dmp tablespaces=users,examples;//需要SYSDBA权限

导出db:

$expdp \'sys/oracle as sysdba\' directory=dump dumpfile=employees.dmp full=y;

参数文件1,含directory、dumpfile参数:

$vim 02.par

directory=dump

dumpfile=hr02.dmp

schemas=hr

exclude=table:"in ('jobs','locations')"

参数文件2,导出部分表:

$expdp scott/tiger directory=dump dumpfile=scott.emp parfile=/tmp/01.par

$vim 01.par;//用参数文件

schemas=scott

include=table

include=package

include=view:"LIKE 'V0%'"

参数文件3,只导出查询结果:

schemas=hr

tables=employees

query=employees:"where salary>15000"

参数文件4,导出表的采样:

tables=employees

sample=40

参数文件5,导出元数据或只导出数据:

tables=employees

content=metadata_only|data_only|all

导入表:

>create table emp01 as select * from employees;//建表

$expdp hr/hr directory=dump dumpfile=emp01.dmp tables=emp01;//导出表

>drop table emp01;//删除表

$impdp hr/hr directory=dump dumpfile=emp01.dmp tables=emp01;//导入表

>select * from emp01;//查询是否导入

只导入数据而不导入元数据:

$impdp hr/hr directory=dump dumpfile=emp01.dmp tables=emp01 content=data_only;

追加|清空方式导入:

$impdp hr/hr directory=dump dumpfile=emp01.dmp tables=emp01 table_exists_action=append|truncate;//导入表

将表映射导入到其它帐户:

$expdp scott/tiger directory=dump dumpfile=emp01.dmp tables=hr.emp01 schemas_map=hr:scott;

$impdp scott/tiger directory=dump dumpfile=emp01.dmp tables=hr.emp01 schemas_map=hr:scott remap_tablespace=example:users;//如果映射到的帐户没有表空间,则创建

//****************************************************************************************************

&数据放在Oracle外,外部表只能查不能改--

非Oracle到Oracle 装载数据驱动 ORACLE LOADER Access Driver

create table students_e (stu_id number(3),stu_sex char(1),stu_name varchar2(10))

organization external

(type oracle_loader

default directory dump

access parameters (records delimited by newline fields terminated by ',' missing fields values are null)

location ('f1.dat'));

外部只能查询,不能做索引,也不能DML操作。由于外部表的性能较低,只用于偶尔的查询。

&Oracle到Oracle的访问,即直接访问其它数据库而不用导入数据--

数据泵驱动 ORACLE DATAPUMP Access Driver

方法共3步。

从orcl导出hr.employees--

CREATE TABLE students_e (stu_id,stu_sex,stu_name)

organization external

(type oracle_loader

default directory dump

location ('employees.dmp'))

AS SELECT employee_id,last_name,salary FROM employees where salary>10000

copy到目标数据库所有机器--

接收的catdb数据库也需要创建目录对象和授权:

本地或网络拷贝到目标机器的目录对象:

在目标catdb建外部表,读取该文件:

CREATE TABLE students_e (stu_id number,stu_sex char(1),stu_name varchar2(10))

organization external

(type oracle_loader

default directory dump

location ('employees.dmp'))

//****************************************************************************************************

内存管理

6大池除了log_buffer均为自动设置。

6大池之外的保留缓冲池db_keep_cache_size、循还缓冲池db_recycle_cache_size、nK缓冲区调整缓存db_nK_cache_size基中n为2、4、8、16、32。

块大小db_block_size,根据行大小设置块大小,1块中保存多行。

保留缓冲池重用机率很高,循还缓冲池重用机率很低。

高重用的表缓冲到保留缓冲池:

>alter table hr.employees storage (buffer_pool recycle);

转存到默认缓冲池:

>alter table hr.employees storage (buffer_pool default);

>alter system set db_16k_cache_size=16M;

>create tablespace tbs16 datafile '+DATA' size 20M autoextend on blocksize 16k;

表空间块大小一般与buffer_cache块大小一致,不同则先转到db_nK_cache_size缓冲,再转到buffer_cache。表空间的行尽量放在不同块中,目的是提高并发量。

db_nK_cache_size设置小,全表扫描慢而并发访问变块。

查看各池容量:

>select component,current_size from v$sga_dynamic_components;

sga_target

pga_aggregate_target

memory_target

memory_max_target

共享池分为:library cache、row cache、result cache结果缓存(存储已查询结果,一般不开启,需配合参数文件开启)、

若做成共享服务器,则原本在PGA中的UGA(用户全局区)会移动到SGA的大型池中。

>select name,value from v$sysstat where name='physical reads';//查物理读

>select name,value from v$sysstat where name='consistent gets';//查一致性读

>select name,value from v$sysstat where name='db block gets';//查当前读

命中率:1-物理读/(一致性读+当前读),命中率高而性能未必高。

AWR report查看命中率报告:

Performance-AWR Baselines

第十二天

160728第十二天OCP笔记

医院建立信息数据库,收集健康设备的信息。

OLPT系统调优的首要原则就是绑定变量。

使用绑定变量避免硬解析:

var v1 number

exec :v1:=196

select salary from employees where employee_id=:v1;

PL/SQL的变量、赋值号加冒号。

让Oracle自动替换成绑定变量:

>alter system set cursor_sharing=force;//force的引号可加可不加

查询执行次数、解析次数:

>select executions,parse_calls from v$sqlarea where sql_text like '语句';//需要SYSDBA权限,也可以用表v$sql

SEQUENCE对于单实例数据库cache 100。多实例RAC数据库cache 5000。

pin住PL/SQL对象

自动共享内存管理。MMIN收集工作量为信息基础,MMAN调整内存。白天为OLPT在线查询系统,晚上为OLAP在线分析系统。

由AMF实现,配合spfile实现。早期版本的Oracle用init初始化参数,缺点是参数不能被系统修改。

性能优化方法:

规划:投资、系统(可扩展性Linux最强)...

SQL优化(应用优化) 对应课程SQL turning 调整:SQL PL/SQL

性能优化(实例优化)对应课程Performance Turning 调整:内存、I/O、网络、资源如lock

v$sys_time_model系统时间模型 v$sess_time_model会话时间模型。用于查询数据库启动、SQL解析、SQL执行、SQL编译等时间的消耗。

生成AWR报告:

@?/rdbms/admin/awrrpt.sql

报告保存在/home/oracle/

用EM查看资源的会话消耗:

EM-Performance-TopCustomers-TopSessions

/****************************************************************************************************

???

SQL优化指导 STA sql tuning advisor

           Automatic SQL Tuning Result

SQL访问指导 SAA sql access advisor

SQL性能分析 SPA sql performance analyzer 位置:EM-Server-AdvisorCentral-sql performance analyzer

自动化任务 EM-Server-Automatic-AutomaticSqlTuning

EM-Server-AdvisorCentral-

优化指导:个别语句用Automatic SQL Tuning Result优化、使用SQL Profile直接修改执行计划、收集统计信息、使用索引、修改SQL语句。后3条都是间接干涉执行计划。

第十三天

160729第十三天OCP笔记

江苏移动外包:

限制job资源使用:

PLAN--group??

EM-Server-OracleScheduler-Window

CreateWindow-Name:DayWindow-Repeat:by days-duration:12h

CreateWindow-Name:DayWindow-Repeat:by days-duration:12h

>ater system set resource_manager_plan;

&管理空间。

OMF管理数据文件/控制文件的参数:db_create_file_dest=+DATA

日志文件/控制文件:db_create_online_log_dest

块--

块大小db_block_size。块大小优先由表空间blocksize决定,未指定则由db_block_size决定。

块预留10%的pct free空间,仅用于更新数据UPDATE。块的pct free用完就需要行迁移了。

块空闲空间按剩余空间分类:fs1<25% ,25%

空表不占空间,只是在数据字典中留记录。

数据录入是无序的,进行表的整理可以提高全表扫描的性能。

行链接:行大于块大小。行迁移:update的新数据大于旧数据且块pct free用完,将旧块指向新块的地址。

避免行链接的方法:

>alter system set db_16k_cache_size=16M;

>create tablespace tbs16 datafile '+DATA' size 20M autoextend on blocksize 16k;

解决行迁移:

使用段指导发现行迁移并解决。可以添加自动化任务定期解决。

手工处理行迁移--

>create table scott.t1 (id number,name varchar2(2000));

begin

for i in loop 1..1000

insert into scott.t1 values(i,'aa');

end loop;

commit;

end;

/

>update scott.t1 set name=lpad('x',1550,'x') where mod(id,2)=1;//语法lpad(列名,长度,填充符)

查具有行移的表:

>@?/rdbms/admin/utlchain.sql;

>analyze table scott.t1 list chained rows;

拷出来(拷出具有行迁移的行):

>create table t1_chain as select * from scott.t1 where rowid in(select head_rowid from chained_rows);

清空表:

>select count(*) from scott.t1_chain;//查下迁移行数量

>delete scott.t1 where rowid in(select head_rowid from chained_rows);

再拷回去:

>insert into scott.t1 select * from scott.t1_chain;

区的管理--

extent management local

segment space management auto|manual

段的延迟创建(创建表时并不分配空间,插入时创建):

>alter system set deferred_segment_createion=true;

Oracle在安装时会创建很多永远不会用到的空表,段延迟创建可以节约空间和加快安装速度。

段的立刻创建:

>create table t1 segment creation immediate as select * from t2 where 1=2;

按需创建表只适用于非分区表和索引,不适用于IOT、聚簇表...,不适用于字典管理的表空间中的表。

先创建索引逻辑不使用,以后使用:

>create index t1_idx on t1(id) unusable;

>alter index t1_idx rebuild;

表压缩减少IO多耗CPU,BASIC压缩方式适用于OLAP/DSS数据仓库,FOR OLTP压缩方式适用于OLTP常规交易型数据库。

>create table t1 compress basic|for olpt|nocompress;

收缩段的3步:

>alter table t2 enable row movement;

移动行 进行块的整理:

>alter table t2 shrink space compact;

降低高水位HWM 释放空间:

alter table t2 shrink space;

如果只执行第3步,不执行第2步,则在收缩段期间不能进行DML语句。

收缩段的优点是节约空间,提高全表扫描性能。

管理可恢复的空间分配--

会话交互(会话遇到空间问题,等待问题解决而非终止):

>alter session enable resumable;

系统级别可以设置会话时间,超时由系统选择:

>show parameter resu

>alter system set resumable_timeout=3600;//单位:秒

目前磁盘为4K扇区,Linux内核3.0以上支持4K扇区磁盘。要求db_block_size要4K~32K,默认8K。32以上需要OS支持。

查看日志的块大小:

>select blocksize from v$logfile

建库时要设置日志组块大小16K,提高性能。

移动表空间,对于使用不同指令集的CPU,需要用RMAN提供的convert命令。--

过程:表只读、datadump导出metadata、转字节码、拷元数据及数据文件、datadump导入、表读写。

建表:

>create tablespace test datafile '+DATA' size 10M;

1、在orcl数据库将表空间置为read only:

>alter tablespace test read only;

2、使用datadump提取表空间的metadata为一个文件:

>create directory dump as '/u01/app/oracle/dump/';//目录由oracle帐户创建,命令需要SYSDBA权限

>grant read,write on directory dump to hr,system,scott,sh;

$expdp system/oracle directory=dump dumpfile=test_m.dmp transport_tablespaces=test;

3、(目标与原使用相同的字节序endian,若不同需要用RMAN转换:

RMAN>sql 'alter tablespace hr read only convert tablespace hr to platform '操作系统平台' format '路径';

4、传送元数据和数据两部分文件到catdb:

$cp /u01/dump/tbs2_m.dmp /u01/catdb/dump;

$cp /u01/app/oracle/oradata/orcl/tbs2.dbf /u01/app/oracle/oradata/catdb;

5、使用datapump导入metadata:

$export $ORACLE_SID=catdb

$impdp system/oracle directory=dump dumpfile=test_m.dmp transport_datafiles=/u01/app/oracle/oradata/catdb/tbs2.dbf;//???

6、置表为read write:

>alter tablespace test read write;

移动数据库。

1、备份源库 orcl数据库

RMAN>backup database format '/u01/app/oracle/backup/%U';

RMAN>backup archivelog all format '/u01/app/oracle/backup/%U';

修改参数文件--

>create pfile from spfile;//生成initorcl.ora

initorcl.ora改名initprod.ora

在spfile中添加(数据库改名):

db_file_name_convert='orcl','prod';

log_file_name_convert='orcl','prod';

创建spfile中相应的目录:

启动数据库--

$export $ORACLE_SID=prod;

$sqlplus / as sysdba;

>startup nomount;

使用RMAN连接--

$export $ORACLE_SID=prod;

$rman sys/oracle@orcl auxiliary /;//连接辅助数据库

RMAN>duplicate target database to prod;

恢复数据库:

run {

sql 'alter database datafile 4,5,6 offline';

set newname for datafile 4 to '/u01/app/oracle/oradata/orcl/users01.dbf';

set newname for datafile 5 to '/u01/app/oracle/oradata/orcl/example01.dbf';

set newname for datafile 6 to '/u01/app/oracle/oradata/orcl/test.dbf';

restore datafile 4,5,6;

switch datafile 4;

switch datafile 5;

switch datafile 6;

recover datafile 4,5,6;

sql 'alter database datafile 4,5,6 online';

}

改fstab参数:

>startup nomount

$vi /etc/fstab

tmpfs                   /dev/shm                tmpfs   defaults,size=4g        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

#mount -o remount /dev/shm

报名考试:VOE网站注册OC号,Oracle网站注册号并绑定,找徐老预约考试,考试时间和科目。

上一篇下一篇

猜你喜欢

热点阅读