前言:
想起刚开始做DBA时,有一次安装集群,跑到了机房,网络不通,还需要用到图形界面,所以只能在寒冷的机房敲命令。
后来研究静默安装Oracle,借鉴同事写的python安装Mysql的文档,自己写了一个类似的,脚本仅供参考,纪念当时初入DBA的岁月。
一、静默安装Oracle数据库[单实例]
需要权限:root用户
平台: Linux
Oracle版本: 11.2.0.4
1 系统安装包:
cat >/tmp/yum.sh<<EOF
yum install binutils* -y
yum install compat* -y
yum install gcc* -y
yum install glibc* -y
yum install glibc-devel* -y
yum install ksh -y
yum install libgcc* -y
yum install libstdc++* -y
yum install libstdc++* -y
yum install libaio* -y
yum install make* -y
yum install sysstat* -y
yum install unixODBC* -y
yum install unixODBC-devel* -y
yum install libcap* -y
yum install libXp.i686 libXp-devel.i686 libXt.i686 libXt-devel.i686 libXtst.i686 libXtst-devel.i686 -y
EOF
# 安装所需要的系统包
sh yum.sh
2. 创建系统oracle,grid组及用户(已统一规范,不论RAC还是单节点)
#创建Oracle,grid用户组
/usr/sbin/groupadd -g 1006 oinstall
/usr/sbin/groupadd -g 1001 dba
/usr/sbin/groupadd -g 1002 asmadmin
/usr/sbin/groupadd -g 1003 asmdba
/usr/sbin/groupadd -g 1005 oper
/usr/sbin/groupadd -g 1004 asmoper
#创建Oracle,grid用户:
useradd -u 1006 -g oinstall -G dba,asmadmin,asmdba,asmoper grid
useradd -u 1001 -g oinstall -G dba,asmadmin,asmdba,oper oracle
#设置Oracle,grid用户密码:
echo "oracle" |passwd --stdin oracle
echo "grid" |passwd --stdin grid
#创建目录:
mkdir -p /u01/app/11.2.0/grid
mkdir -p /u01/app/grid
chown -R grid:oinstall /u01/app/
mkdir –p /u01/app/oracle
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/
配置环境变量
Grid用户环境变量:
cat>>/home/grid/.bash_profile<<'EOF'
set -o vi
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=+ASM1
export ORACLE_TERM=xterm
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$ORACLE_HOME/bin:/usr/sbin:$HOME/bin:$PATH:/usr/local/bin:/usr/bin:/oracle/app/11.2.0/grid/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:$ORACLE_HOME/lib
EOF
Oracle用户环境变量:
cat>>/home/oracle/.bash_profile<<'EOF'
set -o vi
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_TERM=xterm
export ORACLE_SID=orcldb1
export ORACLE_UNQNAME=orcldb1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:/usr/sbin:$HOME/bin:$PATH:/usr/local/bin:/usr/bin:/oracle/app/11.2.0/grid/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:$ORACLE_HOME/lib
EOF
系统参数配置:
/etc/security/limits.conf
cat>> /etc/security/limits.conf<<'EOF'
#Add for oracle_Install
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 4096
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 4096
grid hard nofile 65536
grid soft stack 32768
grid hard stack 32768
* soft memlock 130000000
* hard memlock 130000000
EOF
cat>> /etc/pam.d/login <<'EOF'
#Add for oracle_Install
session required pam_limits.so
EOF
/etc/security/limits.d/90-nproc.conf
cat>> /etc/security/limits.d/90-nproc.conf<<'EOF'
##Add for oracle_Install
grid soft nproc 2047
grid hard nproc 16384
oracle soft nproc 2047
oracle hard nproc 16384
EOF
/etc/sysctl.cnf
cat >>/etc/sysctl.cnf<<'EOF'
#Add by Oracle_install
kernel.shmmax = %s
kernel.shmall = %s
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048576
fs.aio-max-nr=1048576
vm.min_free_kbytes=5194304
EOF
-- kernel.shmmax --取值计算:echo ker_shmax=$(echo "`free -k|grep -i mem|awk '{print $2}'`/2*1024"|bc)
-- kernel.shmall --取值计算:echo ker_shmall=$(echo "`free -k|grep -i mem|awk '{print $2}'`/4"|bc)
解压oracle软件安装包,配置response文件:
--使用oracle用户安装,响应文件参数说明查看官方
参考解压出来的官方自身的response文件,自定义安装软件响应文件:
cat >database/response/Db_install_soft.rsp<<'EOF'
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=%s
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=false
DECLINE_SECURITY_UPDATES=true
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.oraolap:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac:11.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
oracle.install.db.CLUSTER_NODES=
oracle.install.db.isRACOneInstall=
oracle.install.db.racOneServiceName=
oracle.install.db.config.starterdb.type=
oracle.install.db.config.starterdb.globalDBName=
oracle.install.db.config.starterdb.SID=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=true
oracle.install.db.config.starterdb.password.ALL=
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.SYSMAN=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=
COLLECTOR_SUPPORTHUB_URL=
oracle.installer.autoupdates.option=
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
EOF
填上需要用到的参数简化版:
cat >database/response/Db_install_soft.rsp<<'EOF'
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=orcldb
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=false
DECLINE_SECURITY_UPDATES=true
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.oraolap:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac:11.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
EOF
安装数据库软件
./runInstaller -silent -force -noconfig -responseFile ./response/Db_install_soft.rsp -ignorePrereq -ignoreSysPrereqs
安装完软件后,用root执行提示出来的脚本,root.sh
安装数据库实例
cat >/tmp/dbca.rsp
[GENERAL]
RESPONSEFILE_VERSION = "11.2.0"
OPERATION_TYPE = "createDatabase"
[CREATEDATABASE]
GDBNAME = orcldb
SID = orcldb
SYSPASSWORD = "oracle"
SYSTEMPASSWORD = "oracle"
DATAFILEDESTINATION = /oradata
RECOVERYAREADESTINATION=/u01/app/oracle/flash_recovery_area
CHARACTERSET = "AL32UTF8"
NATIONALCHARACTERSET= "AL16UTF16"
MEMORYPERCENTAGE = "40"
DATABASETYPE = "MULTIPURPOSE"
AUTOMATICMEMORYMANAGEMENT = "FALSE"
TEMPLATENAME = "General_Purpose.dbc"
--字符集:ZHS16GBK,AL32UTF8
dbca -help redologsize
dbca -silent -responseFile /tmp/dbca.rsp
二、使用python包装,实现脚本化
python版本为2.7,主要三个py脚本:
- 1_ist_ora_soft.py --安装软件
- 2_ist_ora_db.py --安装数据库
- pub_printlog.py --打印日志
1_ist_ora_soft.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
################################################################################
#
#Coding : utf-8
#FileName : ist_ora.py
#Desc :
#call : python ist_ora.py IP HOSTNAME Kernel_shmmax Kernel_shmall
# python ist_ora.py 192.168.1.111 Oratest 518504448 253176
#example :
#
# version history
#----------------------------------|
#version | 1.0 |
#----------------------------------|
#Coder | Tangwen |
#----------------------------------|
#
################################################################################
"""This script for auto install oracle."""
import os
import sys
import pub_printlog
SHELLSTRING = '''
#!/bin/bash
#ORACLE_BASE:/u01/app/oracle
#ORACLE_HOME:/u01/app/oracle/product/11.2.0/dbhome_1
#GRID_HOME:/u01/app/11.2.0/grid
#
#创建Oracle,grid用户组
/usr/sbin/groupadd -g 1000 oinstall
/usr/sbin/groupadd -g 1001 dba
/usr/sbin/groupadd -g 1002 asmadmin
/usr/sbin/groupadd -g 1003 asmdba
/usr/sbin/groupadd -g 1005 oper
/usr/sbin/groupadd -g 1004 asmoper
#创建Oracle,grid用户:
useradd -u 1000 -g oinstall -G dba,asmadmin,asmdba,asmoper grid
useradd -u 1001 -g oinstall -G dba,asmadmin,asmdba,oper oracle
#设置Oracle,grid用户密码:
echo "oracle" |passwd --stdin oracle
echo "grid" |passwd --stdin grid
#创建目录:
mkdir -p /u01/app/11.2.0/grid
mkdir -p /u01/app/grid
chown -R grid:oinstall /u01/app/
mkdir –p /u01/app/oracle
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/
#Grid用户环境变量:
cp /home/grid/.bash_profile /home/grid/.bash_profile.bak
cat>>/home/grid/.bash_profile<<'EOF'
set -o vi
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=+ASM1
export ORACLE_TERM=xterm
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$ORACLE_HOME/bin:/usr/sbin:$HOME/bin:$PATH:/usr/local/bin:/usr/bin:/oracle/app/11.2.0/grid/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:$ORACLE_HOME/lib
EOF
#Oracle用户环境变量:
cp /home/oracle/.bash_profile /home/oracle/.bash_profile.bak
cat>>/home/oracle/.bash_profile<<'EOF'
set -o vi
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_TERM=xterm
export ORACLE_SID=orcldb1
export ORACLE_UNQNAME=orcldb1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:/usr/sbin:$HOME/bin:$PATH:/usr/local/bin:/usr/bin:/oracle/app/11.2.0/grid/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64:$ORACLE_HOME/lib
EOF
#设置内核参数:
#IP
echo "%s %s">>/etc/hosts
#backup files
cp /etc/security/limits.conf /etc/security/limits.conf.bak
cp /etc/pam.d/login /etc/pam.d/login.bak
cp /etc/sysctl.conf /etc/sysctl.conf.bak
cp /etc/security/limits.d/90-nproc.conf /etc/security/limits.d/90-nproc.conf.bak
cat>> /etc/security/limits.conf<<'EOF'
#Add for oracle_Install
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 4096
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 4096
grid hard nofile 65536
grid soft stack 32768
grid hard stack 32768
* soft memlock 130000000
* hard memlock 130000000
EOF
cat>> /etc/pam.d/login <<'EOF'
#Add for oracle_Install
session required pam_limits.so
EOF
cat>> /etc/security/limits.d/90-nproc.conf<<'EOF'
##Add for oracle_Install
grid soft nproc 2047
grid hard nproc 16384
oracle soft nproc 2047
oracle hard nproc 16384
EOF
cat >>/etc/sysctl<<'EOF'
#Add by Oracle_install
kernel.shmmax = %s
kernel.shmall = %s
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048576
fs.aio-max-nr=1048576
vm.min_free_kbytes=5194304
EOF
/sbin/sysctl -p
#解压安装到当前目录:
unzip "database*.zip" -d ./
chown -R oracle:oinstall database
cat >database/response/Db_install_soft.rsp<<'EOF'
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=%s
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=false
DECLINE_SECURITY_UPDATES=true
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.oraolap:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac:11.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
oracle.install.db.CLUSTER_NODES=
oracle.install.db.isRACOneInstall=
oracle.install.db.racOneServiceName=
oracle.install.db.config.starterdb.type=
oracle.install.db.config.starterdb.globalDBName=
oracle.install.db.config.starterdb.SID=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=true
oracle.install.db.config.starterdb.password.ALL=
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.SYSMAN=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=
COLLECTOR_SUPPORTHUB_URL=
oracle.installer.autoupdates.option=
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
EOF
#开始安装Oracle_soft:
Current_Path=`pwd`
su - oracle -c " $Current_Path/database/runInstaller -silent -force -noconfig -responseFile ./database/response/Db_install_soft.rsp"
#Oracle软件安装完毕!
echo 'Oracle soft has installed! script exit.'
'''
def write_file(filename, content):
"""this function write shell file."""
file_object = open(filename, 'w')
try:
file_object.write(content)
finally:
file_object.close()
if __name__ == '__main__':
pub_printlog.printalllog('ist_oracle', '开始运行。')
if not len(sys.argv) == 5:
pub_printlog.printlog('error', 'ist_oracle', '参数数量错误。目前只接收到%s个参数。' % (len(sys.argv)))
print 'argv number wrong!'
print '正确的参数传递应该为:python ist_ora.py IP HOSTNAME Kernel_shmmax Kernel_shmall HOSTNAME'
print '''
ker_shmax : echo "`free -k|grep -i mem|awk '{print $2}'`/2*1024"|bc ,
ker_shmall: echo "`free -k|grep -i mem|awk '{print $2}'`/4"|bc
'''
pub_printlog.printalllog('ist_oracle', '运行结束。')
exit()
#产生SHELLSTRING脚本
pub_printlog.printlog('info', 'ist_oracle', '产生SHELLSTRING脚本。')
write_file('./ist_oracle.sh', SHELLSTRING % (sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4],
sys.argv[2]
))
pub_printlog.printlog('info', 'ist_oracle', 'SHELLSTRING脚本生成完毕。')
#修改权限
pub_printlog.printlog('info', 'ist_oracle', '修改权限。')
os.system('chmod 774 ./ist_oracle.sh')
pub_printlog.printlog('info', 'ist_oracle', '修改权限完毕。')
#执行脚本
pub_printlog.printlog('info', 'ist_oracle', '执行脚本。')
os.system('./ist_oracle.sh')
pub_printlog.printlog('info', 'ist_oracle', '执行脚本完毕。')
2_ist_ora_db.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
################################################################################
#
#Coding : utf-8
#FileName :
#Desc :
#call : python ist_ora_db.py gdbname sid data_directory Memory_Total
# python ist_ora_db.py orcldb orcldb /oradata 400
#example :
#
# version history
#----------------------------------|
#version | 1.0 |
#----------------------------------|
#Coder | Tangwen |
#----------------------------------|
#
################################################################################
import os
import sys
import pub_printlog
SHELLSTRING = '''
#配置文件:
cat > database/response/ist_db.rsp<<'EOF'
[GENERAL]
RESPONSEFILE_VERSION = "11.2.0"
OPERATION_TYPE = "createDatabase"
[CREATEDATABASE]
GDBNAME = "%s"
SID = "%s"
SYSPASSWORD = "oracle"
SYSTEMPASSWORD = "oracle"
DATAFILEDESTINATION = %s
RECOVERYAREADESTINATION=/u01/app/oracle/flash_recovery_area
CHARACTERSET = "AL32UTF8"
NATIONALCHARACTERSET= "AL16UTF16"
MEMORYPERCENTAGE = "40"
DATABASETYPE = "MULTIPURPOSE"
AUTOMATICMEMORYMANAGEMENT = "FALSE"
TOTALMEMORY = "%s"
TEMPLATENAME = "General_Purpose.dbc"
EOF
#权限:
chown -R oracle:oinstall database/
#开始执行安装:
Current_Path=`pwd`
su - oracle -c "dbca -silent -responseFile $Current_Path/database/response/ist_db.rsp"
'''
def write_file(filename, content):
"""this function write shell file."""
file_object = open(filename, 'w')
try:
file_object.write(content)
finally:
file_object.close()
if __name__ == '__main__':
pub_printlog.printalllog('ist_ora_db', '开始运行。')
if not len(sys.argv) == 5:
pub_printlog.printlog('error', 'ist_ora_db', '参数数量错误。目前只接收到%s个参数。' % (len(sys.argv)))
print 'argv number wrong!'
print '正确的参数传递应该为:python ist_ora_db.py gdbname sid data_directory Memory_Total'
pub_printlog.printalllog('ist_oracle', '运行结束。')
exit()
#产生SHELLSTRING脚本
pub_printlog.printlog('info', 'ist_ora_db', '产生SHELLSTRING脚本。')
write_file('./ist_ora_db.sh', SHELLSTRING % (sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4],
))
pub_printlog.printlog('info', 'ist_ora_db', 'SHELLSTRING脚本生成完毕。')
#修改权限
pub_printlog.printlog('info', 'ist_ora_db', '修改权限。')
os.system('chmod 774 ./ist_ora_db.sh')
pub_printlog.printlog('info', 'ist_ora_db', '修改权限完毕。')
#执行脚本
pub_printlog.printlog('info', 'ist_ora_db', '执行脚本。')
os.system('./ist_ora_db.sh')
pub_printlog.printlog('info', 'ist_ora_db', '执行脚本完毕。')
pub_printlog.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
################################################################################
#
#Coding : utf-8
#FileName : pub_printlog.py
#Desc : 公用模块,打印日志。顺带维护日志。
#call : printlog(日志分类,脚本名称,日志内容)
#
#example : printlog(classification,scriptfilename,content)
#
# version history
#----------------------------------|
#version | 1.0 |
#----------------------------------|
#Coder | bennie li |
#----------------------------------|
#Code date | 2015/12/28 |
#----------------------------------|
#Modify note| initial |
#----------------------------------|
#
################################################################################
"""本模块完成日志的打印与日志保持与清理维护。"""
import os
import glob
import datetime
def toolhelp():
"""本模块打印帮助文档"""
print """模块介绍:本模块完成python脚本中公用的日志打印功能,以及维护日志保留一定的天数。
使用方法:
import pub_printlog
需要输出日志时候使用:
printlog(日志分类,脚本名称,日志内容)
比如输出错误日志:
printlog('error','rcv_findfile','参数错误!')
比如输出警告日志:
printlog('warnning','rcv_findfile','没有找到文件!')
"""
def readenv(parametername):
"""本函数用于读取配置文件的变量。"""
envfilename = './.env'
parameter = ''
value = ''
if os.path.exists(envfilename):
fileobject = open(envfilename)
try:
line = fileobject.readline()
while line:
linesplit = line.split('=')
parameter = linesplit[0]
if parameter == parametername:
value = linesplit[1].replace('\r', '').replace('\n', '')
break
else:
value = ''
line = fileobject.readline()
finally:
fileobject.close()
if value == '':
print '严重错误!没找到名为%s的配置项' % (parametername)
else:
print '严重错误!.env文件不存在。'
return value
def getdatestring():
"""本函数返回当天日期的字符串。格式为yyyymmdd"""
today = datetime.datetime.now()
todayyear = today.year
todaymonth = ('0' + str(today.month))[-2:]
todayday = ('0' + str(today.day))[-2:]
datestring = '%s%s%s' % (todayyear, todaymonth, todayday)
return datestring
def checkoutdate(filename, keepday):
"""本函数判断文件是否超出保留期限。"""
if not keepday.isdigit():
print '参数%s类型错误,keepday必须是数字型字符串。' % (keepday)
return False
# 分割文件名
filenamesplit = filename.split('.')
name = filenamesplit[0]
# name部分符合 脚本名_日志类型_yyyymmdd 形式
createdate = name[-8:]
if not createdate.isdigit():
print '文件名错误,最后8个字符%s并不是数字形式的日期。' % (createdate)
return False
# 日期比较,算出与当前日期的天数差
today = datetime.datetime.now()
currentdate = datetime.date(today.year, today.month, today.day)
createyear = int(createdate[0:4])
createmonth = int(createdate[4:6])
createday = int(createdate[6:8])
createdate = datetime.date(createyear, createmonth, createday)
datediff = currentdate - createdate
if datediff.days > int(keepday):
return True
else:
return False
def printalllog(scriptfilename, content):
"""本函数完成所有日志的打印,多用于脚本运行的开始与结束,在所有日志中增加开始结束信息。"""
printlog('info', scriptfilename, content)
printlog('warnning', scriptfilename, content)
printlog('error', scriptfilename, content)
def printlog(classification, scriptfilename, content):
"""本函数完成日志的打印,清理超过保留天数的日志。"""
prefixpath = readenv('LOG_PATH')
if prefixpath == '':
print '严重错误!LOG_PATH变量读取失败。'
exit()
underline = '_'
backslash = '/'
datestring = getdatestring()
extension = '.log'
if prefixpath.endswith(backslash):
suffixname = prefixpath + scriptfilename + underline + \
classification + underline + datestring + extension
else:
suffixname = prefixpath + backslash + scriptfilename + \
underline + classification + underline + \
datestring + extension
# 输出日志。
fileobject = open(suffixname, 'a')
today = datetime.datetime.now()
contentwithdatetime = '%s.%s.%s %s:%s:%s %s\r\n' % (\
today.year, ('0' + str(today.month))[-2:], \
('0' + str(today.day))[-2:], ('0' + str(today.hour))[-2:], \
('0' + str(today.minute))[-2:], ('0' + str(today.second))[-2:], \
content)
try:
fileobject.write(contentwithdatetime)
finally:
fileobject.close()
# 维护日志。
keepday = readenv('HOUSEKEEP_DAY')
if keepday == '':
print '严重错误!HOUSEKEEP_DAY变量读取失败。'
exit()
if prefixpath.endswith(backslash):
rootpath = prefixpath
else:
rootpath = prefixpath + backslash
files = glob.glob(rootpath + '*_????????.log')
for singlefile in files:
if checkoutdate(singlefile, keepday):
rmcommand = 'rm -f %s' % (singlefile)
os.system(rmcommand)
使用说明
1. 日志打印模块:
pub_printlog.py
公用模块,打印日志。顺带维护日志。
函数介绍:
toolhelp :打印帮助文档。无参数
readenv :用于读取配置文件的变量。参数parametername,用于传入参数名获取对应的变量值。
getdatestring :返回当天日期的字符串。格式为yyyymmdd。无参数
checkoutdate :判断文件是否超出保留期限。参数filename, keepday,filename是要检查的文件的名字,keepday是保留期限。最终获取文件的创建时间,和现在时间比较,是否超出了keepday。
printalllog :完成所有日志的打印,多用于脚本运行的开始与结束,在所有日志中增加开始结束信息。参数scriptfilename, content,第一个参数是python脚本名字(因为只有python脚本才能引用本脚本),第二个是内容。会在info,warning,error三类日志中写入信息。内容一般是脚本什么时间开始,什么时候结束。
printlog :完成日志的打印,清理超过保留天数的日志。参数classification, scriptfilename, content,第一个参数,是日志的类型(info,warning,error),第二参数是脚本名字,第三个参数是日志内容。
2. 脚本使用说明:
1) 上传 1_ist_ora_soft.py ,2_ist_ora_db.py, pub_printlog.py ,database_*.zip
(数据库安装包必须是zip,如果是gz,需要改脚本) 至同一目录,比如/tmp,确保目录大小能存放即可.
cat >/tmp/.env <<EOF
LOG_PATH=/tmp/logs/
HOUSEKEEP_DAY=7
EOF
mkdir /tmp/.env
2) 1_ist_ora_soft.py 脚本:
python ist_ora.py IP HOSTNAME Kernel_shmmax Kernel_shmall
python ist_ora.py 192.168.1.111 Oratest 518504448 253176
IP : IP地址
HOSTNAME :主机名
Kernel_shmmax: 参数大小取值方式: ker_shmax=$(echo "`free -k|grep -i mem|awk '{print $2}'`/2*1024"|bc)
Kernel_shmall: 参数大小取值方式: ker_shmall=$(echo "`free -k|grep -i mem|awk '{print $2}'`/4"|bc)
$ORACLE_BASE:/u01/app/oracle (按规范写死,如需变量传参,请修改脚本)
$ORACLE_HOME:/u01/app/oracle/product/11.2.0/dbhome_1 (按规范写死,如需变量传参,请修改脚本)
注释:只安装Oracle软件,只需要跑完 1_ist_ora_soft.py
3) 2_ist_ora_db.py:
python ist_ora_db.py gdbname sid data_directory Memory_Total
python ist_ora_db.py orcldb orcldb /oradata 400
gdbname: globalname
data_directory: 数据文件存放目录
Memory_Total: Oracle总内存大小
版本: Release 11.2.0.4.0 Production
字符集:
CHARACTERSET = "AL32UTF8"
NATIONALCHARACTERSET= "AL16UTF16"
sys,system密码: oracle (如有需要,请自行修改)
注意:安装Oracle数据库,请检查数据库相关参数的调整: SGA,PGA,redo online log
4) 报错解决方法论:
如果第一次跑脚本发生错误,可以执行以下回退:
cp /home/grid/.bash_profile.bak /home/grid/.bash_profile
cp /home/oracle/.bash_profile.bak /home/oracle/.bash_profile
cp /etc/pam.d/login.bak /etc/pam.d/login
cp /etc/sysctl.conf.bak /etc/sysctl.conf
cp /etc/security/limits.d/90-nproc.conf.bak /etc/security/limits.d/90-nproc.conf
网友评论