甲骨论42课锁基础原理
锁是数据库并发的前提。进程等待锁的时间过长会影响用户体验。
锁有latch锁和lock锁。遍历过的链会被serverprocess并发访问,用latch锁保护。
lock锁主要用来保护buffercache,分为排它锁和共享锁。排它锁被对象访问时其它对象不能访问,共享锁不排它。
行锁指向被修改块的对应事务槽。行级锁是Oracle锁的最小粒度单位。一个事务修改事务槽不影响构造CR块对行进行读取。
事务锁TX是由行级锁产生的(行级锁必然产生事务锁),一个事务只有一个事务锁。commit和rollback就将事务锁解锁。DML语句加锁。
表级锁TM有:
l 行级排他锁(Rowexclusive)或RX锁
事务A修改许多行,给每行加行锁,只给A加一个事务锁,在表上加RX锁。RX锁有兼容性,也就是两个事务都给同一个表加RX锁。RX锁和X锁是互斥的,不能同时加。
DML语句自动在被更新表上添加RX锁,lock命令显示在表上添加RX锁,加RX锁后不能加X锁。
>lock table in row exclusive exclusive[share row exclusive] mode;
l 行级共享锁(RowShared)或RS锁
>select … from for update;//需要加RS锁,由于forupdate和update是互斥的。
where rownum=1 //选第一行的sql语句
l 排他锁(Exclusive)或X锁
对表的结构进行改变和删除表需要X锁。此时任何其它会话都不能修改表。
l 共享锁(Share)或S锁
l 共享行级排他锁(ShareRow Exclusive)或SRX锁。
使用锁要注意锁的粒度、锁的排他性。
锁的兼容性:
RX锁可再加RX锁、RS锁。X锁与任何锁排他,对并发影响最大。
加锁语句:增删改产生RX锁,可再加RX和RS。select…fromfor update产生RS锁,可再加RS、RX、S、SRX锁。S锁可再加S和RS。SRX可再加RS。X锁与所有锁排他。
甲骨论43课锁相关视图及相关操作
锁视图:vlock,通过锁的视图找出锁的问题。
>selectxidusn,xidslot,xidsqn,status from v$transaction;//查事务回滚段编号、事务槽编号、覆盖次数、回滚块的状态
vYou can't use 'macro parameter character #' in math modesession的主键,共同标识一个session。
v$enqueue_lock显示那些申请锁定,但是无法获得锁定的session信息。记录按照申请锁定的时间先后顺序排列,排在前面的优先获得锁定。
v$locked_object记录当前被锁定的对象信息,其中OBJECT_ID说明当前被锁定的对象的ID号,可以根据ID号到dba_objects查找被锁定的对象名称。LOCKED_MODE指锁定模式的数字编码。
v$session记录当前会话信息。
>grant selecton v赋予用户访问mystat表的权限,需在sys用户执行
>select sidfrom v$mystat where rownum=1;//查看第一行会话的sid
死锁产生:两个会话同时分别访问两个数据块(锁住),相互依赖导致相互等待。对两个会话roolback解决死锁。死锁发生时在/u01/app/oracle/admin/数据库名/bdump/alert_jiagulun.log日志中记录ORA-00060:Deadlockdetected死锁信息,.trc文件记录了死锁的具体信息。
甲骨论44课Oracle网络原理及配置
由于Oracle没有负载,不容易出问题。
Oracle连接过程:
1) 客户端发送连接请求给Listener
2) Listener将连接请求发送给Oracle数据库的实例
3) 据库实例启动server process并将server process地址发给Listener
4) Listener将serverprocess地址发给客户端
5) 客户端直接发送请求给server process
6) 客户端发送用户名和密码给serverprocess,验证通过则正式建立会话。
l 建立会话后Listener不再使用,Listener只负责建立连接的转发(不含密码)。只有在短时间内在大量的连接请求才需要优化。
l 监听只负责找到数据库实例,而与数据库实例没有常链接。
l 监听默认端口号1521
监听的3个文件:listener.ora、tnsnames.ora、sqlnet.ora,服务端有listener.ora和rnsnames.ora,客户端只有tnsnames.ora。
在客户端配置服务端的监听:
1) #xhost+
2) #w //获取远程登陆的IP地址
3) #export DISPLAY=”IP地址”//将图形界面映射到本地
4) #su -用户
5) #netca //配置监听,生成listener.ora文件
6) 设置:监听名、协议TCP、标准端口号
7) 在Oracle程序的/network/admin/listener.ora文件检查主机名和端口号。
把主机名改为IP地址。
8) #lsnctl restart;lsnctlstop;lsnctl start;lsnctl status//重启监听
客户端配置:
1) 查看数据库服务名:连接数据库->show parameter service
2) 查看主机名:#netstat –tulnp:grep 1521
3) #netca
4) 选net本地服务配置、服务名、TCP、主机名(服务器的监听IP)、网络服务名(任填)。
5) 在/network/admin/tnsnames.ora查看生成文件,检查主机名,服务名。
6) #sqlplus 用户名/密码@网络服务名//从tnsnames.ora自动解析@后的字符串(IP、端口、服务)
排错流程:
1) tnsnames.ora的ip、端口号、service_names。服务器端 netstat–tulnp|grep 1521;show parameter service。网络服务名要与tnsnames.ora中的一致。
2) tnsping 网络服务名
3) > alter system register;//强制将servicename注册到监听中(加速),默认地Oracle会将service name注册到监听中。这两种方式都称为动态注册。
数据库有3个名字:数据库名、实例名、服务名。使用服务名静态注册到监听中。
客户端与监听连接过程:用tnsnames.ora解析命令@后的字串得IP和端口号,根据IP和端口号找监听,如果tnsnames.ora中的服务名与监听中的服务名一致,则建立连接。
服务名的”静态注册”为解决动态注册不稳定的问题。在listener.ora加入脚本。
连接方式:不用监听、只用监听、用监听和tnsnames.ora
l #sqlplus hr/hr;//直接连接,不用监听
l #sqlplus / as sysdba
l用监听、不用tnsnames.ora的启动方法:
>sqlplus hr/[email protected]:1521/数据库服务名
一个数据库可以使用多个监听,实现负载均衡。
l #sqlplus hr/hr@数据库服务名;//用监听和tnsnames.ora启动
甲骨论45课Oracle参数文件及数据库的启动和关闭
参数文件位置$ORACLE_HOME/dbs/spfile实例名.ora。9i以后都是动态参数文件,静态参数文件是文本文件,静态参数文件缺点是修改参数需要重启数据库,动态参数文件是二进制文件。如果是单实例,数据库名与实例名相同。
Oracle启动过程:
1) 找参数文件,根据$ORACLE_SID找”spfile实例名.ora”
查:#echo $ORACLE_SID
改:#cd;vi .bash_profile;export ORACLE_SID=实例名;//设置不对显示”连接到空闲的实例上”
Oracle启动过程:nomount、mount、open。三个阶段:
1) nomount:找到参数文件spfile,根据参数文件分配内存和启动进程。
m#ps –ef//查进程
#ipcs –a//查内存
>show parameter control//显示参数文件
2) mount:根据参数文件记录的控制文件位置,打开控制文件。
>alert database mount;//打开控制文件
3) open:打开数据文件和重做日志
>alter database open;
>createpfile from spfile;//从动态文件生成静态文件。
改启动参数:
>alter system set parameter_name=parameter_valuescope=memory|spfile|both [sid=’sid’|’*’];//改启动参数。memory仅内存有效重启后失效,spfile只修改参数文件重启后生效,默认both。若文档中是FALSE,则只能scope=spfile。
>selectname,value,ISSYS_MODIFIABLE from v$parameter;//查看参数值及生效类型
查阅:官方文档/reference/v$parameter/。ISSYS_MODIFIABLE中有IMMEDIATE则立即生效、DEFERRED重新登陆会话生效、FALSE重启生效。
参数错误会导致无法用vim打开。解决方法是:生成静态修改后再重新生成动态文件。
1) >create pfile fromspfile;exit;
2) #vim %ORACLE_SID/init.ora;
3) 将参数改回来
4) #sqlplus / as sysdba;
5) >create spfile from pfile;
数据库关闭方式:
>shutdown immediate;//最常用
l normal(等提交回滚和断连接)
等待事务主动提交或回滚,等待用户主动断开连接,存在用户未断开连接则无法关闭。
l transactional(等提交回滚)
等待正在运行的事务直到提交和回滚(主动结束),然后强行中断连接。将实例中为数据写入数据文件,清空缓存。存在未提交或回滚的事务则无法关闭。
l immediate(全回滚不等提交,但仍写回buffer cache)
强行中断或因滚所有事务,然后关闭连接。将数据文件写入数据文件。
l abort(重启需要实例恢复)
模拟突然断电。事务立即中断,没有提交/回滚,内存没有写入数据文件就被清空。