美文网首页
Python安装Oracle数据库(单实例)

Python安装Oracle数据库(单实例)

作者: 番茄人 | 来源:发表于2019-07-30 16:26 被阅读0次

前言:
想起刚开始做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 

相关文章

网友评论

      本文标题:Python安装Oracle数据库(单实例)

      本文链接:https://www.haomeiwen.com/subject/ivjnrctx.html