关于 八月, 2008 的文章

Linux下Oracle数据库的启动、关闭和数据字典的利用

注:该文章系网上多篇文档和资料的查询,并结合实际操作而完成,未能一一列举出处,仅在此表示感谢。
注意$代表shell命令提示符,这里的oracle是9.0以上版本。

启动步骤:
$ su - oracle
$ sqlplus / nolog
sql> conn / as sysdba
sql> startup (一般不需要加参数,只要设置好环境变量)
sql> quit (退出sql模式)
$ lsnrctl start (启动监听器)

【startup】等于以下三个命令:
startup nomount
alter database mount
alter database open
startup有七个参数,七个参数的含义如下:
【nomount】非安装启动, 读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。
这种方式启动下可执行:重建控制文件、重建数据库。
【mount dbname 】安装启动,执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置, 但此时不对数据文件和日志文件进行校验检查。
这种方式启动下可执行:数据库日志归档、数据库介质恢复、使数据文件联机或脱机,重新定位数据文件、重做日志文件。
【open dbname 】先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件。
这种方式下可访问数据库中的数据。
【restrict 】约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问,非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
【force】强制启动方式,先关闭数据库,再执行正常启动数据库命令。
当不能关闭数据库时,可以用startup force来完成数据库的关闭 。
【pfile=参数文件名 】带初始化参数文件的启动方式,先读取参数文件,再按参数文件中的设置启动数据库。
例:startup pfile=E:Oracleadminoradbpfileinit.ora
【EXCLUSIVE】

关闭步骤:
$ lsnrctl stop(关闭监听器,在这之前,应该先关闭应用程序)
$ sqlplus /nolog
sql>shutdown

shutdown有四个参数,四个参数的含义如下:
【normal】需要在所有连接用户断开后才执行关闭数据库任务,所以有的时候看起来好象命令没有运行一样!在执行这个命令后不允许新的连接
【immediate】在用户执行完正在执行的语句后就断开用户连接,并不允许新用户连接。
【transactional】 在拥护执行完当前事物后断开连接,并不允许新的用户连接数据库。
【abort】 执行强行断开连接并直接关闭数据库。
前三种方式不回丢失用户数据,第四种在不的已的情况下,不建议采用!
经常遇到的问题:
1)权限问题,解决方法,切换到oracle用户;
2)没有关闭监听器 ,解决方法:关闭监听器
3)有Oracle实例没有关闭,解决办法:关闭oracle实例
4)环境变量设置不全,解决办法:修改环境变量。

用户如何有效地利用数据字典:
ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化,
体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。
数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。
我们不能手工修改数据字典里的信息。
很多时候,一般的ORACLE用户不知道如何有效地利用它。
dictionary 全部数据字典表的名称和解释,它有一个同义词dict
dict_column 全部数据字典表里字段名称和解释
如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句:
SQL>select * from dictionary where instr(comments,'index')>0;
如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:
SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES';
依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。
下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。
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;
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;
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');
4、序列号
查看序列号,last_number是当前值
SQL>select * from user_sequences;
5、视图
查看视图的名称
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、同义词
查看同义词的名称
SQL>select * from user_synonyms;
7、约束条件
查看某表的约束条件
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;
8、存储函数和过程
查看函数和过程的状态
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('&plsql_name');

查看数据库的SQL:
1、查看表空间的名称及大小
SQL>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;
2、查看表空间物理文件的名称及大小
SQL>select tablespace_name, file_id, file_name,
   round(bytes/(1024*1024),0) total_space
   from dba_data_files
   order by tablespace_name;
3、查看回滚段名称及大小
SQL>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$ro

No Comments

"File Size Limit Exceeded" 错误处理日志

File Size Limit Exceeded

今天,roseha双机软件出现了故障,其中一台上的hasvrd进程挂掉,在双机管理程序中看到这台server的状态都是error。
而重启了roseha服务之后,这一台server上的hasvrd还是不能启动。于是我直接单独运行hasvrd,结果出现了File Size Limit Exceeded 的错误。“文件大小超过限制”,奇怪!因为该程序文件大小还不到300KB!
在网络上借鉴了多位前辈的经验教训之后,我估计应该是该程序启动后会打开roseha的日志文件,而该日志的大小已经达到了2G多。于是立刻手动清空该日志文件,再次重启roseha,结果hasvrd进程成功启动,双机重新恢复了正常。
最后,为了避免以后再次出现该问题,我在两台双机Server中添加了“每天自动清除一次日志”的计划任务。

crontab -e
30 1 * * * cat /dev/null > /opt/roseha/etc/*.log

No Comments

2008-8-7工作笔记--LVM磁盘管理

2008-8-7工作笔记--LVM磁盘管理
-------------------------------------------------------------------------------------------
如何挂载一块从别的机器上取下的做了LVM的硬盘:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.vgscan //扫描LVM卷
3.vgchange -ay
4.lvscan //如果正常则会显示出硬盘的LV状态都是 active
5.mount -t ext3 /dev/VGname/LVname /mnt/lvmdisk/
-------------------------------------------------------------------------------------------
如何将一块新硬盘添加到现有的LVM中,以达到扩容目的:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.fdisk /dev/sdb //创建一个新的分区sdb1,并使用t参数标记为8e(即Linux LVM)
>n
>t
>8e
3.pvcreate //建立物理卷
4.vgextend VolGroup00 /dev/sdb1 //将新增的屋里卷加入到卷组中去
5.lvextend -L +800G /dev/VolGroup00/LogVol00 //将新增的80G硬盘的所有空间都加到逻辑卷中去
6.RHEL4: ext2online /dev/VolGroup00/LogVol00
RHEL5: resize2fs -p /dev/VolGroup00/LogVol00
//激活新增的空间
7.df -h //此时便可以看到新增的空间了
-------------------------------------------------------------------------------------------
如何删除一个现有的LVM:
1.umount 所有vg0下的lv
2.lvremove /dev/vg0/lv0
3.vgchange -an /dev/vg0 (休眠vg0,-ay是激活)
4.vgremove vg0 //移除vg0
-------------------------------------------------------------------------------------------
如何删除一个现有LVM中的物理卷,以取出新增的硬盘:
1.转移数据 pvmove /dev/sdb1 [sdc1] //如果想指定转移的物理卷则在后面输入,默认是其它地方
2.pvreduce vg0 /dev/sdb1 把sdb1从卷组中删除
-------------------------------------------------------------------------------------------
一些常用的LVM管理命令:
扩展VG: vgextend vg0(卷组名) /dev/sdb1(PV名)
扩展LV: lvextend -L +10G(空间大小) /dev/vg0/lv0(LV名)
查看信息: vgdisplay /dev/vg0 , lvdisplay /dev/vg0/lv0
数据迁移: pvmove /dev/sdb1 /dev/sdc1
-------------------------------------------------------------------------------------------
所有命令列表:
1.extendfs 扩展一个离线文件系统
2.lvchange 改变一个逻辑卷的的属性
3.lvcreate 在卷组中创建一个逻辑卷
4.lvdisplay 显示逻辑卷的信息
5.lvextend 增加分配给逻辑卷的物理区域数
6.lvlnboot 将逻辑卷设为启动,交换或内存映像卷
7.lvmerge 将以前镜像的卷合并成一个逻辑镜像卷
8.lvreduce 减少分配给逻辑卷的物理区域数
9.lvremove 从卷组中删除一个或多个逻辑卷
10.lvrmboot 删除联接到启动,交换或内存映像卷的逻辑卷
11.lvsplit 将镜像的逻辑卷分成两个逻辑卷
12.lvsync 同步在一个或多少失效逻辑卷上的逻辑卷镜像
13.pvchange 改变卷组中的物理卷的属性
14.pvcreate 创建一个可以被卷组使用的物理卷
15.pvdisplay 显示卷组中一个或多个物理卷的信息
16.pvmove 将分配的物理区域从一个物理卷转移鲐其他物理卷
17.vgcfgbackup 保存卷组LVM配置
18.vgcfgrestore 将LVM配置恢复 到卷组
19.vgchange 开关卷组的一些状态
20.vgcreate 创建一个卷组
21.vgdisplay 显示卷组信息
22.vgextend 通过添加物理卷扩展一个卷组
23.vgexport 从系统输出一个卷组
24.vgimport 向系统输入一个卷组
25.vgscan 扫描卷组的系统物理卷
26.vgreduce 通过删除一个或多个物理卷减小卷组
27.vgremove 从系统上删除一个或多个卷组的定义
28.vgsync 同步在一个或多个失效卷组上的逻辑镜像

No Comments

每个人都不能同时挑选两种不同的价值观

手表定理是指一个人有一只表时,可以知道现在是几点钟,而当他同时拥有两只表时却无法确定。两只表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。
如果每个人都“选择你所爱,爱你所选择”,无论成败都可以心安理得。然而,困扰很多人的是:他们被“两只表”弄得无所,心身交瘁,不知自己该信仰哪一个,还有人在环境、他人的压力下,违心选择了自己并不喜欢的道路,为此而郁郁终生,即使取得了受人瞩目的成就,也体会不到成功的快乐。
手表定理在企业经营管理方面给我们一种非常直观的启发,就是对同一个人或同一个组织的管理不能同时采用两种不同的方法,不能同时设置两个不同的目标。甚至每一个人不能由两个人来同时指挥,否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于每个人都不能同时挑选两种不同的价值观,否则,你的行为将陷于混乱。
-----------------------------------------------------------------------------------------
讲的很好,相信我们大家每一个人都有过这样的矛盾。
就我而言,便是常常陷入 “提升文凭”和“继续工作”的两种不同的价值观当中。而事实上前者的确是迫于环境和他人的压力之下而产生的。真正“我所爱”的,其实是后者。
“每个人都有属于自己的成功之路”,关键是要做到“选择你所爱,爱你所选择”。

No Comments