Welcome to Rolland Town which Record fire's life.

Solaris关机用户—sudo实现(090623更新)

  需求:服务器归一个部门管理,但是由于数据的敏感性,所以root帐号不能交给这个部门。所以出现了这样一个需求。关机、重启等特殊命令给一个用户来执行。但是考虑到服务器上脚本的安全性,这个用户又不能去查看这些脚本。

  首先,我想到的是Solaris的RABC来实现。通过SMC建立相应的角色,用户,并授权。可能由于我操作的问题,始终都没弄对。

  然后一翻google。将能搜索到的办法都基本尝试了一下,居然没有一个可行,继续怀疑自己的问题。其实网上的办法是另外一种,就是通过shell来做文章,登陆后立刻执行一个shell关机,比如(如下办法我没成功):

要关机,必须有关机权限。什么人有关机权限?root。但不能把root口令告诉普通用户,怎么办?创建一个特殊的超级用户,他的登录shell是一个定制的文件:一条关机命令。具体做法如下:

# vi /etc/passwd

shutdown:x:0:1:shutdown user:/:/bin/shutdown 添加一个用户

# vi /etc/shadow

shutdown::::::::

# vi /bin/shutdown

/usr/sbin/shutdown -y -g0 -i5

把别的用户logout,试着用shutdown用户登录。输入完用户名和口令后,系统就开始关机。

  最后大鱼儿和一个同事建议我使用sudo。尝试下总归是好的,去sunfreeware.com下载相关的包,上传到服务器。

# gunzip libgcc-3.4.6-sol10-sparc-local.gz
# gunzip libiconv-1.11-sol10-sparc-local.gz
# gunzip libintl-3.4.0-sol10-sparc-local.gz
# gunzip sudo-1.7.1-sol10-sparc-local.gz
# pkgadd -d /export/home/soft/libintl-3.4.0-sol10-sparc-local
# pkgadd -d /export/home/soft/libiconv-1.11-sol10-sparc-local
# pkgadd -d /export/home/soft/libgcc-3.4.6-sol10-sparc-local
# pkgadd -d /export/home/soft/sudo-1.7.1-sol10-sparc-local
# useradd -u 600 -m -d /export/home/shdUser -s /usr/bin/bash shdUser
# vi /usr/local/etc/sudoers
增加:shdUser ALL=(root) NOPASSWD: /usr/sbin/shutdown,/usr/sbin/showmount,/usr/ccs/bin/dump
//设置相关shell的权限
# chmod 700 /export/home/yourshell.sh

  一切准备就绪。然后用shdUser登陆。

$ vi .profile
//增加:export PATH=/usr/bin:/usr/ucb:/etc:/usr/local/bin:/usr/ccs/bin:.
//保存后退出重新登陆
$ sudo -l
User shdUser may run the following commands on this host:
    (root) NOPASSWD: /usr/sbin/shutdown, (root) /usr/sbin/showmount, (root) /usr/ccs/bin/dump
$ sudo shutdown -y -g0 -i5
We trust you have received the usual lecture from the local System Administrator.
It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type
#3) With great power comes great responsibility
//输入shdUser密码
Sorry, user shdUser is not allowed to execute ‘/usr/ucb/shutdown -y -g0 -i5′ as root on yourhostname.
//看来不能简单些shutdown
//090623更新,感谢大鱼儿:由于profile中的目录优先级问题,所以没法直接使用shutdown。可以改一下profile中/usr/ucb/和/usr/local/bin的顺序即可。大鱼儿提到写个sh脚本让用户执行,这样应该更好一些。
$ sudo /usr/sbin/shutdown -y -g0 -i5
//顺利关机!

  更多sudo信息可以参考Sudo Main Page

2009年06月11日生活随笔

评论关闭

读“大学的专业,不能按职业来设置”有感

  订阅张鸣老师的博客已经有一段时间了。但是一直没有冒泡,其实张老师的博文很多都和高校教育有关,这也正是我订阅的原因。今天看到张老师的“大学的专业,不能按职业来设置”忍不住上来写两句。

  现在国内的高校(211工程的还好一点),和中小学已经没有太大的区别,这也就是国内高等教育的悲哀。中小学拼什么?拼升学率!不管国家怎么三令五申,最终衡量一个小学和中学好坏的标准就是升学率。而大学呢?就业率!变相的升学率而已。

  张老师说:大学本科的专业设置,无非是标志一个大体上的专业方向,并不意味这学了某个专业的学生,就一定会是这个专业的专家,着眼点在于学生的素质培养,同时在最后两年,给学生规定一个大致的方向。学生可以继续深造,研究某方面的学术,攻读博士,也可以读一个更具体的专业硕士,更多的是直接进入就业市场,但是,对于就业的学生而言,他们能否被用人单位录用,最关键的是他们的综合素质,而非他们的专业。但是,普通高校的扩招,全民文凭的提升最终的结果呢?研究生不如本科生找工作容易,本科生不如专科生找工作容易。这反映了什么?这里说普通高校,211工程的高校呢?扩招屈指可数!这里如果要展开讲,涉及的太多了,太大了。而用人单位从最开始的文凭高低,到工作能力已经开始了转变。而高校呢?似乎还停留在老路上,很多普通高校包办似的“双选”会就能说明问题。

  我个人认为。新生进校,或者说高校录取根本就不应该以专业来录取,而是直接录取人数。也就是说比如学校A有30个专业,今年需要录取5000人。那高考之后录取就可以了。

  然后呢?进校后除了基本的军训教育。那对于基础课程,所有人都上同样的课程,当然这里也要区分文理。然后在上课的同时,不断的进行各种专业的认识教育。到了大三,才是选择专业选择方向的时候。我想两年基础课的学习,加上两年不断的专业认知教育,会让学生更全面的认识本校所有的专业,然后进行选择。这个和大学选课前试听是一个道理。或许张老师更注重从理论上,而我更注重操作层面。这样操作起来难度也非常大。

  1、可能出现有些专业无人问津的情况;

  2、大三之后才开始专业基础课以及专业课,后面2年学生学业负担比较重;

  上面也仅仅是我的一个设想。如果要付诸实践需要更精心的策划和安排。改天来说说普通高校和211工程高校的区别。

  

Oracle双机互为主备简单备份sh

  Oracle本身的备份策略很多,这里只说说简单的exp命令备份在双机互为主备的方案中shell怎么做。

  由于互为主备,平时AB机各自运行自己的实例,当然发生故障后有双机软件去实现自动切换。这样就导致了存储上挂接的同一个lum并不会同时出现两台主机上。那么传统的exp备份脚本就无法正常运行。比如常用的exp的shell脚本如下:

ORACLE_BASE=/export/home/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_HOME
ORACLE_SID=test
export ORACLE_SID
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/openwin/lib
export LD_LIBRARY_PATH
NLS_LANG="simplified chinese"_china.zhs16gbk
export NLS_LANG
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORA_NLS33
PATH=$PATH:/opt/SUNWspro/bin:/usr/sbin:/opt/bin:$ORACLE_HOME/bin:/usr/ccs/bin
export PATH

DATE=`date +%Y%m%d`

cd /databak
exp userid=’test/test’@test compress=n  file=test${DATE}.dmp log=test${DATE}.log

gzip test${DATE}.dmp

  如果套用到互为备份的双机中,就有问题,这个shell到底放在A机还是B机呢?还是两台都放?

  如果放在其中一台服务器上,假设放在A机上。A机出问题(网络故障或者系统故障),数据库B机自动接管了(这时存储上的lum都会挂接到B机)。A机脚本就无法工作。

  如果A、B机都放,依然是问题。存储上的lum是无法同时挂接到两台服务器的。

  因此,那就应该考虑,从判断监听是否启动或者判断数据库是否启动入手,通过shell生成一个flag文件,然后去判断这个flag文件大小。修改后的shell如下:

ORACLE_BASE=/export/home/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_HOME
ORACLE_SID=test
export ORACLE_SID
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/openwin/lib
export LD_LIBRARY_PATH
NLS_LANG="simplified chinese"_china.zhs16gbk
export NLS_LANG
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export ORA_NLS33
PATH=$PATH:/opt/SUNWspro/bin:/usr/sbin:/opt/bin:$ORACLE_HOME/bin:/usr/ccs/bin
export PATH

DATE=`date +%Y%m%d`
#这里是AB机种本地磁盘的目录
cd /test/test_sh/
rm -f  lsnr.test
ps -ef | grep "/export/home/oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER_test" | grep -v grep > lsnr.test
if [ -s lsnr.test ]
then
#这里是存储上的目录
cd /test/Backup
exp userid=’test/test’@test compress=n  file=test${DATE}.dmp log=test${DATE}.log
gzip test${DATE}.dmp
else
echo(当然这里还可以和邮件结合起来,让每次备份什么的dba心中有数)
fi

  最后,在AB机都放上这个脚本。在crontab中写好执行时间,也不会因为其中一台服务器down掉导致备份无法正常执行。
 

2009年06月6日代码生活

评论关闭

Oracle-HA实施步骤(20090607修改)

  Oralce做双机一般来说都是高可用的代名词,可以采用各种不同的HA软件来做,这里不具体涉及到HA软件,只是从Oracle本身出发。

  常见的方式就是一主一备,这样一般数据库只有一个实例,这样的双机方案很多。而互为主备,就只能采用双实例方式,也就是说A机日常运行实例A,B机运行实例B。当故障发生时,在另外一台机器上启动数据库。

  实施的时候很简单。在方案设计时,必须要将A、B机的实例A和实例B全部设计在存储上。

  1、在A机和B机上安装好数据库软件,仅软件本身,不创建数据库和监听。注意确保2台机器上oracle用户和dba组 id相同

  2、在A机或者B机上创建实例,比如这里A机创建实例A和数据库,之后再创建实例B和数据库。然后建立监听。

  3、将A机的$ORACLE_HOME下,dbs下spfile,orapwfile等copy到B机,将 A机的 network/admin目录下listener.ora和tnsnames.ora文件也copy到B机。并修改listener.ora文件中host参数所指IP。将A机的$ORACLE_BASE目录下的admin目录下所有文件(包括<SID>中的bdump、udump、cdump等dump文件目录),全部copy到B机。注意:这里listener.ora对于互为主备的方案必须要是两个监听名,比如LISTENER_A和LISTENER_B。举例如下(粗体处请特别注意):

# listener.ora Network Configuration File: /export/home/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER_A =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
  )

LISTENER_B =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

SID_LIST_LISTENER_A =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /export/home/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_NAME = Adb)
      (ORACLE_HOME = /export/home/oracle/product/10.2.0/db_1)
      (SID_NAME = Adb)
    )
  )

SID_LIST_LISTENER_B =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /export/home/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
     (GLOBAL_NAME = Bdb)
      (ORACLE_HOME = /export/home/oracle/product/10.2.0/db_1)
      (SID_NAME = Bdb)
    )
  )

  4、尝试在B机上启动实例B监听和数据库。如果有问题,再按照出错信息找原因(这句话有点白,实际上就是如果前面3步正确,那这里应该不会有问题。如果第三点listener.ora粗体处KEY一致,可能会在启动监听时报错:TNS-01106 Listener using listener name string has already been started)。

  5、手工测试:尝试在A机上启动两个实例数据库,尝试在B机上启动两个实例的数据库。

  6、HA软件测试:如果没问题,剩下的工作就交给HA软件了。只是在故障发生后,不管什么HA软件都需要手动切换回去。注意:这里和单机的Oracle区别在于不需要再去建立服务器重启后Oracle的重启脚本之类的,一切都应该是HA软件来完成,否则可能导致HA软件无法接管并启动数据库。

  回过头来,觉得真的很简单。但是实际在我实施的过程中遇到了些问题,都是因为上面的第三点,如果有文件拷贝不完整,就无法启动B机的数据库。还有,安装的时候一定要保持头脑清醒,我都做到最后一步了,发现昨晚1点在A机上创建的实例A没有放在存储上,简单的只能删除了重建(当然也有办法改,不过相对删除重建要麻烦点)。最后,这里不得不说到Unix系统,不像Windows一样有注册表的概念,才会有这样如此简单的办法。以上写的都相对简单。

Oracle RAC问题一则(未解决)

1、solaris10 + oracle10.2.0.4 rac

2、连接时出现ORA-12545:增加两个节点的LOCAL_LISTENER设置。用sys帐号登录后分别在两个节点执行:
ALTER SYSTEM SET LOCAL_LISTENER = ‘(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.7)(PORT = 1521))’   SID = ‘testdb1′;
ALTER SYSTEM SET LOCAL_LISTENER = ‘(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.8)(PORT = 1521))’   SID = ‘testdb2′;

3、客户端tnsname.ora
testDB =
 (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.7)(PORT = 1521))
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.8)(PORT = 1521))
  (LOAD_BALANCE = yes)
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = swpudb)
    (FAILOVER_MODE =
      (TYPE = SELECT)
      (METHOD = BASIC)
      (RETRIES = 180)
      (DELAY = 5)
    )
  )
 )

4、导入两个应用的数据做测试后,

5、问题:就是在node1使用ssh连接时,键入命令有时停顿很严重,但是服务器负载很低。而且应用程序连接是也非常缓慢,这种情况一天内不间断发生。尝试修改应用连接的VIP地址,将两个node的VIP互换,发现应用程序可正常连接,响应速度正常。说明node1有问题,但是至今无法确认到底是什么问题。无比头疼。

6、在node1中查看alter日志:
-bash-3.00$ tail -200 /export/home/oracle/admin/swpudb/bdump/alert_testdb1.log | grep ORA
Starting ORACLE instance (normal)
Starting up ORACLE RDBMS Version: 10.2.0.4.0.
WARNING: inbound connection timed out (ORA-3136)
WARNING: inbound connection timed out (ORA-3136)
在node2中查看alter日志:
-bash-3.00$ tail -200 /export/home/oracle/admin/swpudb/bdump/alert_testdb2.log | grep ORA
Starting ORACLE instance (normal)
Starting up ORACLE RDBMS Version: 10.2.0.4.0.
google出的一个文档:http://www.dbasky.net/archives/2009/05/oracle10gora-3136.html,按照文档所说在两个节点上都增加响应配置。
$ lsnrctl
LSNRCTL> show inbound_connect_timeout
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hpcmdb2.transgd)(PORT=1521)))
LISTENER parameter "inbound_connect_timeout" set to 60
The command completed successfully
LSNRCTL> set inbound_connect_timeout 0
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hpcmdb2.transgd)(PORT=1521)))
LISTENER parameter "inbound_connect_timeout" set to 0
The command completed successfully
LSNRCTL> show inbound_connect_timeout
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hpcmdb2.transgd)(PORT=1521)))
LISTENER parameter "inbound_connect_timeout" set to 0
The command completed successfully
LSNRCTL> exit

7、节点1依然不正常……

返回顶部