美文网首页
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