重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、找到并进入运行窗口:(可以用windows+r快捷键哦)输入sqlplus命令:如图
成都创新互联公司是一家集网站建设,五龙口企业网站建设,五龙口品牌网站建设,网站定制,五龙口网站建设报价,网络营销,网络优化,五龙口网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
2、进入新窗口后使用scott/tiger用户和密码进行登录会发现登录不成功:如图
3、这时我们可以使用system用户进行登录,应为此用户的权限排第二,并且密码我们已经在安装时输入了了,所以是可以登录进入的:如图
4、system登录成功之后就可以使用命令给用户进行解锁了:如图
5、最后再用scott/tiger用户时,你可以神奇的发现此时能连接成功了:如图
锁是数据库用来控制共享资源并发访问的机制。
例如
用户A执行了
update tb1 set name='xx' where id=1;
那么在用户A没提交前表tb1的id=1的行就是锁着的,其它用户想要修改必需等A用户提交后才能执行修改任务。
当然ORACLE的锁有很多种,比如行级锁、表级锁等等
下面是一些复制来的希望对你有帮助
锁是数据库用来控制共享资源并发访问的机制。
锁用于保护正在被修改的数据
直到提交或回滚了事务之后,其他用户才可以更新数据
锁定的优点
一致性- 一次只允许一个用户修改数据
完整性- 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
锁的类型
行级锁
对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
行级锁是一种排他锁,防止其他事务修改此行
在使用以下语句时,Oracle会自动应用行级锁:INSERT UPDATE DELETE SELECT …FOR UPDATE SELECT …FOR UPDATE语句允许用户一次锁定多条记录进行更新
使用COMMIT或ROLLBACK语句释放锁
SELECT …FOR UPDATE语法:SELECT …FOR UPDATE [OF columns][WAIT n | NOWAIT];
SQL SELECT * FROM order_master WHERE vencode=’V002’
FOR UPDATE OF odate, del_date;
SQL UPDATE order_master SET del_date=’28-8月-05’
WHERE vencode=’V002’;
SQL COMMIT;
SQL SELECT * FROM order_master WHERE vencode=’V002’
FOR UPDATE WAIT 5;
SQL SELECT * FROM order_master WHERE vencode=’V002’
FOR UPDATE NOWAIT;
使用命令显示地锁定表,应用表级锁的语法是:
LOCK TABLE table_name IN mode MODE;
行共享(ROW SHARE) – 禁止排他锁定表
行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁
共享锁(SHARE)
锁定表,仅允许其他用户查询表中的行
禁止其他用户插入、更新和删除行
多个用户可以同时在同一个表上应用此锁
共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁
排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表
表级锁
占用模式 其他用户
ROW SHARE ROW EXCLUSIVE SHARE SHARE ROW EXCLUSIVE EXCLUSIVE SELECT..FOR UPDATE INSERT DELETE UPDATE
ROW SHARE √ √ √ √ × √ √
ROW EXCLUSIVE √ √ × × × √ √
SHARE √ × √ × × √ ×
SHARE ROW EXCLUSIVE √ × × × × √ ×
EXCLUSIVE × × × × × × ×
死锁
当两个事务相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
右边是一个死锁的例子
在DBA的日常工作中,经常遇到为Oracle用户解锁的操作;这篇文章给出在命令行下进行Oracle用户解锁的操作方法,通过几条简单的解锁语句就能完成此项工作。下面是具体的过程:
默认的scott用户是被锁定的,先解锁就能登陆上了。 使用下面的语句解锁scott:
alter user scott account unlock;
解锁之后可能会要求你该密码:
alter user scott identified by tiger;
再登陆:
sqlplus scott/tiger
就能登陆了
Oracle锁定和解锁用户的命令
SQL conn /as sysdba
已连接。
//scott 用户在没有设定tieger默认密码时,登陆不上
锁定用户的方法:
SQL alter user test account lock;
用户已更改。
-------test用户登陆数据库,失败了。
C:\sqlplus test/test
ERROR:
ORA-28000: the account is locked
Oracle用户解锁的方法:
SQL conn /as sysdba
SQL alter user test account unlock;
用户已更改。这样就完成了Oracle的用户解锁操作。
ORACLE锁具体分为以下几类:
1.按用户与系统划分,可以分为自动锁与显示锁
自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的
显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
2.按锁级别划分,可分为共享锁与排它锁
共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。
排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
3.按操作划分,可分为DML锁、DDL锁
+DML锁又可以分为,行锁、表锁、死锁
-行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作 表中操作行的排它锁。
-表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行 过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语 句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用
LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参 考相关文档)。
-死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就 出现死锁。
如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4 中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务 1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造 成了死锁。死锁一般是因拙劣的事务设计而产生。
死锁只能使用SQL下:alter system kill session 'sid,serial#';
或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者 使用其它工具杀掉死锁进程。
+DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁
-排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。
如使用alter table语句时,为了维护数据的完成性、一致性、
合法性,该事务获得一排它DDL锁。
-共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享
获得DDL锁。
如创建一个包,该包中的过程与函数引用了不同的数据库表,
当编译此包时,该事务就获得了引用表的共享DDL锁。
-分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使
运行相同语句的应用速度更快。一个在共享池中缓存的对象获得
它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,
ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖 关系。当一个事务修改或删除了共享池持有分析锁的数据库对象
时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语 句时,ORACLE重新分析编译此语句。
4.内部闩锁
内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。
当事务需向缓冲区写入信息时,为了使用此块内存区域, ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入
信息。
1、在做Oracle监听程序测试时,发现帐户已经被锁定。
2、在数据库安装电脑上,点击开始打开运行窗口。
3、在运行窗口输入CMD,调出命令提示符界面。
3、在命令提示符下面,用管理员身份登入到数据库sqlplus / as sysdba。
4、输入解锁命令alter user Scott account unlock后回车。
5、看见用户已更改的字样,表示命令已成功执行。
6、再切换到监听程序验证,原来的ora-28000帐户被锁定的提示已经不存在了。用户解锁成功。
这个连续5次不好定义,假设一个人今天试验了4次,明天又试验了一次,那么也可以说是连续5次(虽然有点抬杠,不过这个也算是连续5次),这种怎么算?
以下纯属猜想,没有试验过只是把想到的可能说一说
我能想到的是oracle的一个让人很头痛的功能(因为开了这个功能的话,真的比较恐怖)——审计。这个功能会记录登录失败的信息在相关的表中,比如aud$,如果能建立触发器对该表进行统计,那么应该能实现你说的连续5次,但是这个就好像和profile没什么关系了。可能需要手动锁定用户了,然后再开启一个定时任务,一旦执行了所应用户的操作(基本上又是一个c触发器),那么5分钟后执行解锁用户,不过这个环节也太多了,而且oracle的两个计划任务有时也不怎么靠谱,万一有一个环节卡死了,那么整套流程就进行不下去了。感觉好像更麻烦的样子。
如果不在oracle的层面可能就会好解决一些,如果外面套了一层java的壳,那么简单的做一个循环就好了,只要在多长时间内(比如24小时)循环到5,或者连续循环到5,那么就锁定断开该登录(拒绝登录)5分钟,根本不用锁定用户(毕竟别人还要用)。(个人不会java,以上纯属猜测)
我记得还有一种方式可以将登录失败的信息记录到alert文件,但是就算能统计出来连续5次,然后呢,这个5怎么传入数据库,传入后怎么操作,我想了半天也没想明白。毕竟frofile本身,没有“连续密码错误”的这个参数。