OracleNotes
1. Oracle用户权限:
角色权限:
Sysdba:系统管理员,拥有最高权限,可以管理oracle实例的,它的存在不依赖于整个数据库完全启动,以sysdba身份登陆,装载数据库、打开数据库;
Sysoper:系统操作员,可以启动、关闭数据库,拥有次高权限,但sysoper比sysdba少了数据库管理功能,也不能创建数据库;
dba:数据库管理员,操作数据库,只有数据库加载后,或者说整个数据库完全启动后,dba角色才有了存在的基础。
用户:
sys/change_on_install:sys用户拥有dba,sysdba,sysoper等角色或权限,是oracle权限最高的用户,所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己维护,任何用户都不能手动更改;
System/manager:系统操作员sysoper、dba角色权限,有次高权限;
Internal:用户是sys用户的别名;
一般用户,具有DBA权限时,就可以管理数据库内的数据库对象。
Oracle一般用户信息是保存在数据字典里的,但有sysdba、sysoper角色的用户信息不是存储在数据字典中,而是通过配置文件和密码文件控制登录权限的。在数据库没有加载的情况下,下面用户均可以成功登录:
sqlplus / as sysdba ----------默认是sys用户,sysdba的角色;
Sqlplus / as sysoper ---------默认是public用户,sysoper角色;
2. Oracle数据库名、服务名、网络服务名:
2.1 数据库名:
数据库名就是一个数据库的内部标识,用参数DB_NAME表示,在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下:
DB_NAME=myorcl
...
创建完数据库之后,数据库名不宜修改,因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值,在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。有很多Oracle安装文件目录是与数据库名相关的,如:
winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\...
Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/...
pfile:
winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora
Unix:/home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora
跟踪文件目录:
winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
在创建数据create database命令、修改数据库结构的语句alter database要指出要修改的数据库的名称。如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,这个命令中也是指出DB_NAME。
查询当前数据库名:
方法一:select name from v$database;
方法二:show parameter db
方法三:查看参数文件。
修改数据库名步骤如下:
1.关闭数据库。
2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
3.以NOMOUNT方式启动实例,修建控制文件。
2.2 数据库实例名:
数据库实例名是用于和操作系统进行联系的标识,实例名也被写入参数文件中,该参数为instance_name,在 winnt平台中,实例名同时也被写入注册表。数据库名和实例名可以相同也可以不同。在一般情况下,数据库名和实例名是一对一的关系,在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。查询当前数据库实例名:
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在参数文件中查询。
ORACLE_SID是操作系统的环境变量,用于与操作系统交互,且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。
2.3 数据库域名(DB_DOMAIN):
在数据库名后加(.DB_domain)构成,为保证数据库名在网络中的唯一性,主要在以下情况下考虑使用:
1. 分布式环境下,两个数据库通过数据库链路进行远程传输
2. 同一环境下,两个数据库的数据库名相同
其他述情况,可不考虑数据库域名问题,以便于数据库理解,参数是在安装时确定。
2.4 数据库服务名(SERVICE_NAMES):
数据库的逻辑表示,它是数据库呈现给客户机的方式。缺省为全局数据库名,即在安装或数据库创建期间输入的由数据库和域名组成的一种名称,如不存在数据域名时即为数据库名。在参数文件PFILE中由SERVICE_NAMES指定: SERVICE_NAMES = testDB.ChinaMobile.com
2.5 网络服务名(NET SERVICES NAME)
即:连接描述符,是对网络连接目标特殊格式的描述,它包括网络协议、主机名称或地址、和目标服务, Oracle8i、Oracle9i则通过数据库服务名来来标识,保存tnsnames.ora文件中在格式如下,myDB链接描述:
myDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testDB.ChinaMobile.com)
)
)
查询数据库服务名:
select value from v$parameter where name = 'service_name';
show parameter service_name
在参数文件中查询。
3. 数据库启动、关闭:
以sysdba登录sqlplus后,运行starup启动数据库实例;
在oracle用户下运行lsnrctl start启动数据库监听进程;
tnsping servicename检查监听进程是否启动;
数据库关闭:shutdown、 shutdown immediate、shutdown abort;
3.1 startup nomount
非安装启动,读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件,这种方式启动下可执行:重建控制文件、重建数据库。
3.2 startup mount dbname
该方式先执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,但此时不对数据文件和日志文件进行校验检查。安装启动,这种方式启动下可执行:数据库日志归档、数据库介质恢复、使数据文件联机或脱机,重新定位数据文件、重做日志文件。
但该方式不能访问数据库中数据。
3.3 startup open dbname
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,这种方式下可访问数据库中的数据。
3.4 startup
等于以下三个命令:
startup nomount
alter database mount
alter database open
3.5 startup restrict
约束方式启动,这种方式能够启动数据库,但只允许具有一定特权的用户访问,非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
3.6 startup force
强制启动方式当不能关闭数据库时,可以用startup force来完成数据库的关闭先关闭数据库,再执行正常启动数据库命令。
3.7 startup pfile=参数文件名
带初始化参数文件的启动方式先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:Oracleadminoradbpfileinit.ora
4. 常用系统视图:
V$Session:当前所有会话;
V$locked_object:当前被锁住的所有对象;
V$instance:所有数据库实例;
V$database:所有数据库;
v$nls_parameters:数据字典中字符集相关参数;
v$process:当前所有进程;
v$archived_log:当前所有归档日志;
5. 常用系统表:
user_objects:所有用户信息;
dba_tables,all_tables:所有表信息;
User_tables:当前用户所有表信息;
All_users, dba_users:所有用户信息;
User_users:当前用户信息表;
All_tab_columns:所有表的所有字段信息;
User_tab_columns:用户所有表的所有字段信息;
6. 使用数据字典:
6.1 用户
查看当前用户的缺省表空间:
SQL>select username,default_tablespace from user_users;
查看当前用户的角色:
SQL>select * from user_role_privs;
查看当前用户的系统权限和表级权限:
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
6.2 表
查看用户下所有的表:
SQL>select * from user_tables;
查看名称包含log字符的表:
SQL>select object_name,object_id from user_objects where instr(object_name,'LOG')>0;
查看某表的创建时间:
SQL>select object_name,created from user_objects where object_name=upper('&table_name');
查看某表的大小:
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name');
查看放在ORACLE的内存区里的表:
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
6.3 索引
查看索引个数和类别:
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
查看索引被索引的字段:
SQL>select * from user_ind_columns where index_name=upper('&index_name');
查看索引的大小:
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&index_name');
序列号查看序列号,last_number是当前值:
SQL>select * from user_sequences;
6.4 视图
查看视图的名称
SQL>select view_name from user_views;
查看创建视图的select语句:
SQL>set view_name,text_length from user_views;
SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
6.5 同义词
查看同义词的名称 SQL>select * from user_synonyms;
6.6 约束条件
查看某表的约束条件:
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name from user_constraints c,user_cons_columns cc where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position;
6.7 存储函数和过程
查看函数和过程的状态:
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE'
查看函数和过程的源代码
SQL>select text from all_source where owner=user and name=upper('&proc_name');
7. 常用命令:
显示当前用户:show user
查询数据库参数:show parameter db
当前ORACLE系统时间:select sysdate from dual
执行command命令:host
退出系统command命令:exit
创建一个控制文件命令到跟踪文件:
alter database backup controlfile to trace;
8. Sqlplus:
在命令行运行sql*plus是使用sqlplus命令来完成的,该命令适用于任何操作系统平台,语法如下:
sqlplus [username]/[password][@server]
username用于指定数据库用户名,password用于指定用户口令,server则用于指定主机字符串(网络服务名)。
当连接到本地数据时,不需要提供网络服务名,如果要连接到远程数据库,则必须要使用网络服务名。
8.1 获取帮助:
help command
8.2 l[ist]
该命令用于列出sql缓冲区的内容,使用该命令可以列出sql缓冲某行,某几行或所有行的内容。在显示结果中,数据字为具体的行号,而"*"则表示当前行。
8.3 a[ppend]
该命令用于在sql缓冲区的当前行尾部添加内容。注:该命令将内容追加到标记为"*"的行的尾部,示例如下:
sql>l
1 select empno,ename,sal,hiredate,comm,deptno
2 from emp
3* where deptno=10
sql>a and job='CLERK'
8.4 c[hange]
该命令用于修改sql缓冲区的内容。如果在编写sql语句时写错了某个词,那么使用该命令可以进行修改:
sql>select ename from temp where deptno=10;
SQL> c /temp/emp
1* select ename from emp where deptno=10
8.5 run和/
run的/命令都可以用于运行sql缓冲区中的sql语句。注:当使用run命令时,还会列出sql缓冲区内容。
8.6 save
该命令用于将当前sql缓冲区的内容保存到sql脚本中。当执行该命令时,默认选项为create,即建立新文件:
SQL> save c:\a.sql create
当执行命令之后,就会建立新脚本文件a.sql,并将sql缓冲区内容存放到该文件中。如果sql已经存在,使用replace选项可以替撚已存在的sql脚本,如果要给已存在的sql脚本追加内容,可以使用append选项。
8.7 get
该命令与save命令作用恰好相反,用于将sql脚本中的所有内容装载到sql缓冲区中。
SQL> get c:\a.sql
8.8 start和@
start和@命令用于运行sql脚本文件。注:当运行sql脚本文件时,应该指定文件路径。
SQL> @c:\a.sql
8.9 @@
该命令与@命令类似,也可以运行脚本文件,但主要作用是在脚本文件中嵌套调用其它的脚本文件,可在调用文件所在目录下查找相应文件名。
8.10 spool和spool off
该命令用于将sql*plus屏幕内容存放到文本文件中。执行该命令时,应首先建立假脱机文件,并将随后sql*plus屏幕的所有内容全部存放到该文件中,最后使用spool off命令关闭假脱机文件。
sql>spool c:\a.sql
8.11 &
引用替代变量(substitution variable)时,必须要带有该标号。如果替代变量已经定义,则会直接使用其数据,如果替代变量没有定义,则会临时定义替代变量(该替代变量只在当前语句中起作用),并需要为其输入数据。如果替代变量为数字列则提供数据,则可以直接引用;如果替代变量为字符类型列或日期类型列提供数据,则必须用单引号。
SQL> select ename,sal from emp where deptno=&no and job='&job';
8.12 &&
&标号所定义的替代变量只在当前语句中起作用;而&&标号所定义的变量会在当前sql*plus环境中一直生效:
select ename,sal from emp where deptno=&&no and job='&&job' --定义了no变量
8.13 prompt的pause
prompt命令用于输出提示信息,而pause命令则用于暂停脚本执行。在sql脚本中结合使用这两条命令,可以控制sql脚本的暂停的执行:
prompt '按<Return>键继续'
pause
8.14 variable
该命令用于在sql*plus中定义绑定变量,当在sql语句或pl/sql块中引用绑定变量时,必须要在绑定变量前加冒号(:);当直接给绑定变量赋值时,需要使用execute命令(类似于调用存储过程):
sql>var no number
sql>exec :no:=7788
8.15 print
该命令用于输出绑定变量结果:
SQL> print no
8.16 环境变量:arraysize
该环境变量用于指定数组提取尺寸,其默认值为15.该值越大,网络开销将会越低,但占用内存会增加。
8.17 环境变量:autocommit
该环境变量用于设置是否自动提交dml语句,其默认值为off(表示禁止自动提交),当设置为ON时,每次执行DML语句都会自动提交。
8.18 环境变量:autotrace
用于跟踪SQL执行计划 set autotrace on set autotrace off
9. 查看数据库的SQL
8.1 查看表空间的名称及大小:
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name;
8.2 看表空间物理文件的名称及大小:
select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
8.3 回滚段名称及大小:
select segment_name, tablespace_name, r.status, (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, max_extents, v.curext CurExtent From dba_rollback_segs r, v$rollstat v Where r.segment_id = v.usn(+)order by segment_name ;
8.4 查看控制文件
select name from v$controlfile;
8.5 查看日志文件
select * from v$logfile; ##日志文件信息
select * form v$log; ##日志信息
8.6 查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name;
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE, (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE" FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
建立表空间:
CREATE TABLESPACE data01
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
UNIFORM SIZE 128k; #指定区尺寸为128k,如不指定,区尺寸默认为64k
删除表空间:
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
修改表空间大小:
alter database datafile '/path/NADDate05.dbf' resize 100M
8.7 查看数据库库对象:
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;
8.8 查看数据库的版本:
Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle';
数据库的创建日期和归档方式
Select Created, Log_Mode, Log_Mode From V$Database;
10. ORACLE用户连接的管理
用系统管理员,查看当前数据库有几个用户连接:
SQL> select username,sid,serial# from v$session;
停某个连接用:
SQL> alter system kill session 'sid,serial#';
如果这命令不行,找它UNIX的进程数:
SQL> select pro.spid from v$session ses,v$process pro where ses.sid=21 and ses.paddr=pro.addr;
说明:21是连接的sid值。
然后用 kill 命令杀此进程号。
11. ORACLE逻辑备份
完全备份:
rq=` date +"%m%d" `
su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/export/db_comp$rq.dmp"
累计备份:
rq=` date +"%m%d" `
su - oracle -c "exp system/manager full=y inctype=cumulative file=/oracle/export/db_cumu$rq.dmp"
增量备份:
rq=` date +"%m%d" `
su - oracle -c "exp system/manager full=y inctype=incremental file=/oracle/export/db_incr$rq.dmp"
root用户crontab文件
/var/spool/cron/crontabs/root增加以下内容
0 2 1 * * /oracle/exp_comp.sh
30 2 * * 0-5 /oracle/exp_incr.sh
45 2 * * 6 /oracle/exp_cumu.sh
当然这个时间表可以根据不同的需求来改变的,这只是一个例子。
12. 常用SQL语句:
12.1 增加一个新的日志文件组的语句:
connect internal as sysdba alter database add logfile group 4
(’/db01/oracle/CC1/log_1c.dbf’, ’/db02/oracle/CC1/log_2c.dbf’) size 5M;
12.2 在Server Manager上MOUNT并打开一个数据库:
connect internal as sysdba
startup mount ORA1 exclusive;
alter database open;
12.3 在init.ora 中备份数据库的位置:
log_archive_dest_1 = ’/db00/arch’
log_archive_dest_state_1 = enable
log_archive_dest_2 = "service=stby.world mandatory reopen=60"
log_archive_dest_state_2 = enable
12.4 用户表空间的管理:
create user USERNAME identified by PASSWORD
default tablespace TABLESPACE_NAME;
alter user USERNAME default tablespace TABLESPACE_NAME;
alter user SYSTEM quota 0 on SYSTEM;
alter user SYSTEM quota 50M on TOOLS;
create user USERNAME identified by PASSWORD
default tablespace DATA
temporary tablespace TEMP;
alter user USERNAME temporary tablespace TEMP;
12.5 数据文件:
alter database datafile ’/db05/oracle/CC1/data01.dbf’ resize 200M;
创建一个自动扩展的数据文件:
create tablespace DATA datafile ’/db05/oracle/CC1/data01.dbf’ size 200M autoextend ON next 10M maxsize 250M;
在表空间上增加一个自动扩展的数据文件:
alter tablespace DATA add datafile ’/db05/oracle/CC1/data02.dbf’ size 50M autoextend ON maxsize 300M;
修改参数:
alter database datafile ’/db05/oracle/CC1/data01.dbf’ autoextend ON maxsize 300M;
在数据文件移动期间重新命名:
alter database rename file ’/db01/oracle/CC1/data01.dbf’ to ’/db02/oracle/CC1/data01.dbf’;
alter tablespace DATA rename datafile ’/db01/oracle/CC1/data01.dbf’ to ’/db02/oracle/CC1/data01.dbf’;
alter database rename file ’/db05/oracle/CC1/redo01CC1.dbf’ to ’/db02/oracle/CC1/redo01CC1.dbf’;
alter database datafile ’/db05/oracle/CC1/data01.dbf’ resize 80M;
12.6 回滚段的管理:
create rollback segment SEGMENT_NAME tablespace RBS;
alter rollback segment SEGMENT_NAME offline;
drop rollback segment SEGMENT_NAME;
alter rollback segment SEGMENT_NAME online;
回滚段上指定事务:
commit;
set transaction use rollback segment ROLL_BATCH;
insert into TABLE_NAME select * from DATA_LOAD_TABLE;
commit;
查询回滚段的大小和优化参数:
select * from DBA_SEGMENTS where Segment_Type = ’ROLLBACK’;
select N.Name, /* rollback segment name */
S.OptSize /* rollback segment OPTIMAL size */
from V$ROLLNAME N, V$ROLLSTAT S
where N.USN=S.USN;
回收回滚段:
alter rollback segment R1 shrink to 15M;
alter rollback segment R1 shrink;
例子
set transaction use rollback segment SEGMENT_NAME
alter tablespace RBS default storage (initial 125K next 125K minextents 18 maxextents 249)
create rollback segment R4 tablespace RBS storage (optimal 2250K);
alter rollback segment R4 online;
select Sessions_Highwater from V$LICENSE;
grant select on EMPLOYEE to PUBLIC;
12.7 表的备份与恢复:
使用 export 程序:
exp system/manager file=expdat.dmp compress=Y owner=(HR,THUMPER)
exp system/manager file=hr.dmp owner=HR indexes=Y compress=Y
imp system/manager file=hr.dmp full=Y buffer=64000 commit=Y
备份表:
exp system/manager FILE=expdat.dmp TABLES=(Thumper.SALES)
备份分区:
exp system/manager FILE=expdat.dmp TABLES=(Thumper.SALES:Part1)
恢复例子:
imp system/manager file=expdat.dmp
imp system/manager file=expdat.dmp buffer=64000 commit=Y
exp system/manager file=thumper.dat owner=thumper grants=N
indexes=Y compress=Y rows=Y
imp system/manager file=thumper.dat FROMUSER=thumper TOUSER=flower
rows=Y indexes=Y
imp system/manager file=expdat.dmp full=Y commit=Y buffer=64000
imp system/manager file=expdat.dmp ignore=N rows=N commit=Y buffer=64000
离线备份的shell脚本
ORACLE_SID=cc1; export ORACLE_SID
ORAENV_ASK=NO; export ORAENV_ASK
. oraenv
svrmgrl <<EOF1
connect internal as sysdba
shutdown immediate;
exit
EOF1
insert backup commands like the "tar" commands here
svrmgrl <<EOF2
connect internal as sysdba
startup
EOF2
时间点恢复的例子:
connect internal as sysdba
startup mount instance_name;
recover database until time ’1999-08-07:14:40:00’;
12.8 修改用户密码:
Alter user XXXX indentified by NewPassword;
13. 死锁处理:
死锁的处理完全通过三个表的联合查询定位的:
V$LOCKED_OBJECT:记录所有被锁对象
V$SESSION:记录所有会话
ALL_OBJECTS:当前表空间所有的数据对象
查找死锁的进程:
SELECT
A.object_name, #被锁对象名称
S.SID, #锁定SessionID
S.SERIAL#,
L.ORACLE_USERNAME, #oracle用户名
L.OS_USER_NAME, #OS用户名
L.PROCESS #进程名
FROM
V$LOCKED_OBJECT L,
V$SESSION S,
all_objects A
WHERE
L.SESSION_ID=S.SID and A.object_id=L.object_id;
kill掉这个死锁的会话:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
如果还不能解决,只能kill掉死锁的进程:
select
P.spid
from
v$session S, v$process P
where
S.sid=XXX #XXX为死锁的会话号。
and
S.paddr=P.addr;
在操作系统中查询该进程号:
ps -ef|grep spid
其中spid是这个进程的进程号,kill掉这个Oracle进程。
14. 函数nvl(xxx,yyy)
select nvl(LOGIN_DATE,JUA-01-1998) from XXXX;
从XXXX表中查询LOGIN_DATE字段,若该字段为空则用“JUA-01-1998”代替。
Count():计算行数;
avg():计算平均数;
sum():计算总和;
max()/min():取最大、最小值。
15. 用户被锁定问题:
SDF访问数据库失败,命令行方式访问数据库,提示:
ORA-28000: the account is locked
解决方法:
select RESOURCE_NAME,LIMIT from dba_profiles where RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';
得到结果10,表示连续登录10次失败后,帐号被锁定。
以sysdba用户链接数据库,执行:
Alter user zxin_smap account unlock;
则该用户不再被lock,可以正常登录了。
修改系统参数,不限制连续登录失败的次数:
alter profile default limit failed_login_attempts unlimited;
16. SQL跟踪问题:
设置跟踪:
Alter session set sql_trace=true;
设置跟踪文件的关键字:
Alter session set tracefile_identifier=”xxxxtest”;
设置跟踪文件的目录(默认是$ORACLE_BASE\instance_name\admin\udump):
Alter session set user_dump_dest=”路径名”;
执行需要跟踪的SQL;
取消跟踪:
Alter session set sql_trace=false;
默认时,在$ORACLE_BASE\instance_name\admin\udump目录下会新增用户的sql跟踪文件。
17. 导出Exp导入imp:
导出一个完整数据库:
exp system/manager file=bible_db log=dible_db full=y
导出数据定义:
exp system/manager file=bible_db log=dible_db full=y rows=n
导出一个用户表空间:
exp system/manager file=seapark log=seapark owner=seapark
导出一个表:
exp seapark/seapark file=tank log=tank tables=AAA.tank
导出部分表记录:
exp system/manager query=\"Where salad_type=\'FRUIT\'\" tables=amy.salad_type file=fruit
导入整个库:
imp system/manager file=bible_db log=dible_db full=y ignore=y
导入一个表:
导出表时可以使用tables=UserName.TableName指定,导入表时只能使用fromuser=UserName tables=TableName;
imp userid=zxin_smap/zxin_smap@zxin fromuser=zxdbg_101 file=table.dmp tables=s101ftservicekey
导入另一用户:
imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy
18. 系统回收站recyclebin:
Oracle10g增加recyclebin功能,启用该功能的参数:
Alter system set recyclebin=on;
Alter system set recyclebin=off;
若启用该功能,所有删除的对象都保存到recyclebin中,如:
drop table XXX cascade;
dba_tables/user_tables中的XXX都被删除了,但dba_objects里会新增一个表如:
BIN$hMrqmDZewYvgQCoKXmVONg==$0
这些表都在dba_recyclebin里的。
清空方法:
Purge dba_recyclebin;
删除表可以同时进入回收站:
drop table XXX cascade purge;
19. oracle默认连接数据库:
默认连接数据库是环境变量$ORACLE_SID指定数据库,但是在zxin10用户下执行sqlplus连接数据库要求$ORACLE_HOME/bin/oracle增加属主、属群的权限:
chmod u+s $ORACLE_HOME/bin/oracle
chmod g+s $ORACLE_HOME/bin/oracle
查看该文件的权限信息:
oracle@linux:~/oracle10g/bin> ls -al oracle
-rwsrwsrwx 1 oracle dba 96741978 2010-05-26 09:52 oracle
S位权限有两种:
usid 表示用户访问文件时具有文件属主权限;
gsid表示用户访问该文件时具有文件归属群的权限。
20. 游标cursor
l open_cursors
Oracle 使用 init.ora 中的初始化参数 OPEN_CURSORS 指定一个会话一次最多可以拥有的游标数。缺省值为 50,要获得数据库中 OPEN_CURSORS 参数的值,可以使用以下查询:
SQL> show parameter open_cursors;
NAME TYPE VALUE
———————————— ———– —————
open_cursors integer 300
重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值),也不会增加系统开销。.修改 OPEN_CURSORS 的参数值。
alter system set open_cursors = 1000 scope=both; commit;
open_cursors设定每个session(会话)最多能同时打开多少个cursor(游标)。session_cached_cursor 设定每个session(会话)最多可以缓存多少个关闭掉的cursor。两个参数有着相同的作用:让后续相同的sql语句不在打开游标,从而避免软解析过程来提供应用程序的效率,在v$open_cursor里面我们可以看到当前打开的cursor和pga内cached cursor。
l Session
Sessions 参数指定了一个 Instance中能够同时存在的sessions数量,或者说就是能同时登陆到数据库的并发用户数。通常,我们设定这个数字时需要考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数:
sessions=(1.1*process+5)
当数据库连接的并发用户已经达到这个值时,又有新session连进来,就会报错:
00018, 00000, "maximum number of sessions exceeded"
// *Cause: All session state objects are in use.
// *Action: Increase the value of the SESSIONS initialization parameter.
l Processes
Processes参数指定了Instance在OS层面所能同时运行的进程数。基于和sessions设定同样的考虑,我们在设定processes时,也应考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数。
当然,在MTS(shared server)的配置下,这个值的确定会有所不同。应该是普通后台进程+最大共享服务器的进程数(max_shared_servers) + 最大Dispatcher进程数(max_dispatchers)。
当Oracle需要启动新的process而又已经达到processes参数时,就会报错:
00020, 00000, "maximum number of processes (%s) exceeded"
// *Cause: All process state objects are in use.
// *Action: Increase the value of the PROCESSES initialization parameter.