oracle_dbfs

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
oracle_dbfs [2020/11/03 14:50] – created andonovjoracle_dbfs [2020/11/03 16:08] (current) andonovj
Line 9: Line 9:
   - Edit FUSE config (that is the config file for the FUSE package needed for the DBFS.   - Edit FUSE config (that is the config file for the FUSE package needed for the DBFS.
   - Create folder (owned under oracle user and dba group)   - Create folder (owned under oracle user and dba group)
-  - Create a tablespace which will be registered with the DBFS (that tablespace won't reside on the DBFS, but it is needed for configuration)+  - Create a tablespace which will host the DBFS 
   - Create user with the necessary permission   - Create user with the necessary permission
   - Create the DBFS env on the database   - Create the DBFS env on the database
 +  - Configure the libraries
  
 So let's get started: So let's get started:
Line 29: Line 30:
 [root@ol6-121-rac1 ~]# ls –ld /oracle/dbfs_direct [root@ol6-121-rac1 ~]# ls –ld /oracle/dbfs_direct
 drwxr-xr-x 2 oracle dba 4096 Nov  3 02:26 /oracle/dbfs_direct/ drwxr-xr-x 2 oracle dba 4096 Nov  3 02:26 /oracle/dbfs_direct/
 +[root@ol6-121-rac1 ~]#
 +</Code>
 +
 +Optionally we can configure NOCACHE for the LOB of the DBFS table:
 +
 +<Code:bash|Modify DBFS table>
 +[root@ol6-121-rac1 ~]# echo $ORACLE_SID
 +OGGRAC1
 +[root@ol6-121-rac1 ~]# sqlplus / as sysdba
 +SQL*Plus: Release 12.1.0.2.0 Production on Mon Mar 30 22:20:19
 +2015
 +Copyright (c) 1982, 2014, Oracle. All rights reserved.
 +Connected to:
 +Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 -
 +64bit Production
 +With the Partitioning, Real Application Clusters, Automatic
 +Storage Management, OLAP,
 +Advanced Analytics and Real Application Testing options
 +SQL> ALTER TABLE DBFS_USER.FS1 MODIFY LOB (FILEDATA) (NOCACHE
 +LOGGING);
 +Table altered.
 +SQL> column owner format a10
 +SQL> column table_name format a15
 +SQL> column segment_name format a15
 +SQL> SELECT owner,table_name,segment_name,logging,cache FROM
 +dba_lobs WHERE tablespace_name='DBFS_TS';
 +OWNER TABLE_NAME SEGMENT_NAME LOGGING CACHE
 +---------- ------------- -------------------- ------- ----------
 +DBFS_USER FS1 LOB_SFS$_FST_1 YES NO
 +SQL> exit
 +Disconnected from Oracle Database 12c Enterprise Edition Release
 +12.1.0.2.0 - 64bit Production
 +With the Partitioning, Real Application Clusters, Automatic
 +Storage Management, OLAP,
 +Advanced Analytics and Real Application Testing options
 [root@ol6-121-rac1 ~]# [root@ol6-121-rac1 ~]#
 </Code> </Code>
Line 97: Line 133:
 No errors. No errors.
 SQL>  SQL> 
 +</Code>
 +
 +Configure the libraries:
 +
 +<Code:bash|Configure Libraries>
 +[oracle@ol6-121-rac1 admin]$ su -
 +Password: 
 +[root@ol6-121-rac1 ~]# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
 +[root@ol6-121-rac1 ~]# cat /etc/ld.so.conf.d/usr_local_lib.conf
 +/usr/local/lib
 +[root@ol6-121-rac1 ~]# cd /usr/local/lib
 +[root@ol6-121-rac1 lib]# pwd
 +/usr/local/lib
 +[root@ol6-121-rac1 lib]# ln -s /u01/app/12.1.0.2/grid/lib/libclntsh.so.12.1
 +[root@ol6-121-rac1 lib]# ln -s /u01/app/12.1.0.2/grid/lib/libnnz12.so
 +[root@ol6-121-rac1 lib]# ln -s /lib64/libfuse.so.2 libfuse.so
 +[root@ol6-121-rac1 lib]# ls -l
 +total 0
 +lrwxrwxrwx 1 root root 44 Nov  3 03:16 libclntsh.so.12.1 -> /u01/app/12.1.0.2/grid/lib/libclntsh.so.12.1
 +lrwxrwxrwx 1 root root 19 Nov  3 03:17 libfuse.so -> /lib64/libfuse.so.2
 +lrwxrwxrwx 1 root root 38 Nov  3 03:17 libnnz12.so -> /u01/app/12.1.0.2/grid/lib/libnnz12.so
 +[root@ol6-121-rac1 lib]#
 +[root@ol6-121-rac1 lib]# ldconfig
 +[root@ol6-121-rac1 lib]# ln -s /u01/app/12.1.0.2/grid/bin/dbfs_client /sbin/mount.dbfs
 +[root@ol6-121-rac1 lib]# ls -l /sbin/mount.dbfs
 +lrwxrwxrwx 1 root root 38 Nov  3 03:17 /sbin/mount.dbfs -> /u01/app/12.1.0.2/grid/bin/dbfs_client
 +[root@ol6-121-rac1 lib]# chmod +x /bin/fusermount
 +[root@ol6-121-rac1 lib]# cd /u01/app/12.1.0.2/grid/crs/script
 +[root@ol6-121-rac1 script]# cp /media/sf_install/mount-dbfs.sh .
 +[root@ol6-121-rac1 script]# 
 +[root@ol6-121-rac1 script]# chown oracle.dba mount-dbfs.sh
 +[root@ol6-121-rac1 script]# chmod 750 mount-dbfs.sh
 +[root@ol6-121-rac1 script]# ls -l
 +total 16
 +-rwxr-x--- 1 oracle dba 14083 Nov  3 03:29 mount-dbfs.sh
 +</Code>
 +
 +
 +=====Management=====
 +The management of DBFS, includes, stop/start and registartion in the Grid Infra:
 +
 +====Start/Stop====
 +<Code:bash|Start DBFS>
 +--Mount
 +[oracle@ol6-121-rac1 admin]$ id
 +uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),492(vboxsf),54322(dba)
 +[oracle@ol6-121-rac1 admin]$ /u01/app/12.1.0.2/grid/crs/script/mount-dbfs.sh start
 +mount-dbfs.sh mounting DBFS at /oracle/dbfs_direct from database OGGRAC
 +ORACLE_SID is OGGRAC1
 +spawning dbfs_client command using SID OGGRAC1
 +nohup: redirecting stderr to stdout
 +Start -- ONLINE
 +[oracle@ol6-121-rac1 admin]$ 
 +[oracle@ol6-121-rac1 admin]$ /u01/app/12.1.0.2/grid/crs/script/mount-dbfs.sh status
 +Checking status now
 +Check -- ONLINE
 +[oracle@ol6-121-rac1 admin]$ df -h
 +Filesystem            Size  Used Avail Use% Mounted on
 +/dev/mapper/vg_ol6121rac1-lv_root
 +                       46G   19G   25G  43% /
 +tmpfs                 1.9G  628M  1.2G  34% /dev/shm
 +/dev/sda1             477M   66M  382M  15% /boot
 +install               402G  190G  212G  48% /media/sf_install
 +dbfs-dbfs_user@:/     3.0G  120K  3.0G   1% /oracle/dbfs_direct
 +[oracle@ol6-121-rac1 admin]$ 
 +
 +--Unmount
 +[oracle@ol6-121-rac1 admin]$ /u01/app/12.1.0.2/grid/crs/script/mount-dbfs.sh stop
 +unmounting DBFS from /oracle/dbfs_direct
 +umounting the filesystem using '/bin/fusermount -u /oracle/dbfs_direct'
 +Stop - stopped, now not mounted
 +[oracle@ol6-121-rac1 admin]$ df -h
 +Filesystem            Size  Used Avail Use% Mounted on
 +/dev/mapper/vg_ol6121rac1-lv_root
 +                       46G   19G   25G  43% /
 +tmpfs                 1.9G  628M  1.2G  34% /dev/shm
 +/dev/sda1             477M   66M  382M  15% /boot
 +install               402G  190G  212G  48% /media/sf_install
 +[oracle@ol6-121-rac1 admin]$ 
 +</Code>
 +
 +====Register DBFS into Grid Infra====
 +We can register the DBFS into Grid infra and though allow failover if the instance crashes:
 +
 +<Code:bash|Register DBFS into Grid Infra>
 +[OS prompt]$ cp /media/sf_install/add-dbfs-resource.sh ~
 +[OS prompt]$ cd ~
 +[OS prompt]$ chmod +x add-dbfs-resource.sh
 +[OS prompt]$ cat add-dbfs-resource.sh
 +[oracle@ol6-121-rac1 ~]$ ./add-dbfs-resource.sh
 +[oracle@ol6-121-rac1 ~]$ grid_env
 +[oracle@ol6-121-rac1 ~]$ crsctl stat res dbfs_mount
 +NAME=dbfs_mount
 +TYPE=local_resource
 +TARGET=OFFLINE, OFFLINE
 +STATE=OFFLINE, OFFLINE
 +[oracle@ol6-121-rac1 ~]$ crsctl start res dbfs_mount
 +CRS-2672: Attempting to start 'dbfs_mount' on 'ol6-121-rac1'
 +CRS-2672: Attempting to start 'dbfs_mount' on 'ol6-121-rac2'
 +CRS-2676: Start of 'dbfs_mount' on 'ol6-121-rac2' succeeded
 +CRS-2676: Start of 'dbfs_mount' on 'ol6-121-rac1' succeeded
 +[oracle@ol6-121-rac1 ~]$ crsctl stat res dbfs_mount
 +NAME=dbfs_mount
 +TYPE=local_resource
 +TARGET=ONLINE                , ONLINE
 +STATE=ONLINE on ol6-121-rac1, ONLINE on ol6-121-rac2
 +</Code>
 +
 +
 +
 +=====Appendix=====
 +Below you can find the script we have used.
 +
 +<Code:bash|mount-dbfs.sh>
 +#!/bin/bash
 +
 +### This script is from Note 1054431.1, ensure you have the latest version
 +### Note 1054431.1 provides information about the setup required to use this script
 +
 +### updated 23-DEC-2014
 +
 +###########################################
 +### Everyone must set these values
 +###########################################
 +### Database name for the DBFS repository as used in "srvctl status database -d $DBNAME"
 +DBNAME=OGGRAC
 +
 +### Mount point where DBFS should be mounted 
 +MOUNT_POINT=/oracle/dbfs_direct
 +
 +### Username of the DBFS repository owner in database $DBNAME
 +DBFS_USER=dbfs_user
 +
 +### RDBMS ORACLE_HOME directory path
 +ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/db_1
 +
 +### Syslog facility name (default user)
 +### Changed default from local3 to user for Solaris default support on 17-FEB-2012
 +### This will allow us to log messages to the syslog 
 +###  (/var/log/messages on Linux, /var/adm/messages on Solaris)
 +LOGGER_FACILITY=user
 +
 +### mount options for dbfs_client; these are used for both wallet and non-wallet mounting
 +MOUNT_OPTIONS=allow_other,direct_io
 +### if tracing is required, maybe consider parameter like the example below
 +### following example is commented out, only uncomment if directed by Oracle Support
 +### fix_control=32 added per bug 13340960 to allow async statfs response
 +#MOUNT_OPTIONS=allow_other,direct_io,fix_control=32,trace_level=1,trace_file=/tmp/dbfs_client_trace.$$.log,trace_size=100
 +
 +### PERL_ALARM_TIMEOUT is number of seconds to wait for response from status command.
 +### After this, if no respnose, the script will run clean.
 +### NOTE: If this is longer than the clusterware check interval, bad things may happen.
 +###       Adjust the CHECK_INTERVAL to ensure it is at least 2x as long as PERL_ALARM_TIMEOUT.
 +###       Example:
 +###       $ crsctl status res dbfs_mount -p|grep ^CHECK      
 +###       CHECK_INTERVAL=30
 +###       $ crsctl modify res dbfs_mount -attr "CHECK_INTERVAL=32"
 +###       $ crsctl status res dbfs_mount -p|grep ^CHECK
 +###       CHECK_INTERVAL=32
 +PERL_ALARM_TIMEOUT=14
 +
 +###########################################
 +### If using password-based authentication, set these
 +###########################################
 +### This is the plain text password for the DBFS_USER user
 +DBFS_PASSWD=oracle
 +
 +### The file used to temporarily store the DBFS_PASSWD so dbfs_client can read it
 +### This file is removed immediately after it is read by dbfs_client
 +### The actual filename used will have the PID appended to the name for uniqueness
 +### This variable should be a full pathname including a directory and the first part of a filename.
 +DBFS_PWDFILE_BASE=/tmp/.dbfs-passwd.txt
 +
 +###########################################
 +### If using wallet-based authentication, modify these
 +###########################################
 +### WALLET should be true if using a wallet, otherwise, false
 +WALLET=false
 +
 +### TNS_ADMIN is the directory containing tnsnames.ora and sqlnet.ora used by DBFS
 +TNS_ADMIN=/export/home/oracle/dbfs/tnsadmin
 +
 +### TNS alias used for mounting with wallets
 +DBFS_LOCAL_TNSALIAS=fsdb.local
 +
 +###########################################
 +### No editing is required below this point
 +###########################################
 +### determine platform
 +UNAME_S=`uname -s`
 +if   [ $UNAME_S = 'Linux' ]; then LINUX=1; SOLARIS=0; 
 +elif [ $UNAME_S = 'SunOS' ]; then LINUX=0; SOLARIS=1; 
 +fi
 +
 +GREP=/bin/grep
 +AWK=/bin/awk
 +ECHO=/bin/echo
 +LOGGER="/bin/logger -t DBFS_${MOUNT_POINT}"
 +RMF='/bin/rm -f'
 +TOUCH=/bin/touch
 +CHMOD=/bin/chmod
 +PS=/bin/ps
 +SLEEP=/bin/sleep
 +KILL=/bin/kill
 +BASENAME=/bin/basename
 +STAT=/usr/bin/stat
 +ID=/usr/bin/id
 +WC=/usr/bin/wc
 +SRVCTL=$ORACLE_HOME/bin/srvctl
 +DBFS_CLIENT=$ORACLE_HOME/bin/dbfs_client
 +HN=/bin/hostname
 +PERL=/usr/bin/perl
 +MOUNT=/bin/mount
 +### ensure messages are displayed in English for pattern matching
 +LANG=en_US.UTF-8
 +NLS_LANG=American_America.AL32UTF8
 +NUMACTL=/usr/bin/numactl
 +RPMCTL=/bin/rpm
 +
 +if [ -z "$STATUS_TIMEOUT" ]; then STATUS_TIMEOUT=0; fi
 +
 +if [ $LINUX -eq 1 ]; then
 +  MOUNT=/bin/mount
 +  XARGS='/usr/bin/xargs -r'
 +  FUSERMOUNT=/bin/fusermount
 +  LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib64
 +elif [ $SOLARIS -eq 1 ]; then
 +  MOUNT=/sbin/mount
 +  XARGS=/usr/bin/xargs
 +  UMOUNT=/usr/sbin/umount
 +  LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:/usr/lib:/lib
 +fi
 +
 +DBFS_PWDFILE=$DBFS_PWDFILE_BASE.$$
 +
 +export ORACLE_HOME LD_LIBRARY_PATH TNS_ADMIN
 +export STAT MOUNT_POINT PERL_ALARM_TIMEOUT SOLARIS LINUX
 +export PATH=$ORACLE_HOME/bin:$PATH
 +export STATUS_TIMEOUT
 +export LANG NLS_LANG
 +
 +logit () {
 +  ### type: info, error, debug
 +  type=$1
 +  msg=$2
 +  if [ "$type" = "info" ]; then
 +    $ECHO $msg
 +    $LOGGER -p ${LOGGER_FACILITY}.info "$msg"
 +  elif [ "$type" = "error" ]; then
 +    $ECHO $msg
 +    $LOGGER -p ${LOGGER_FACILITY}.error "$msg"
 +  elif [ "$type" = "debug" ]; then
 +    $ECHO $msg
 +    $LOGGER -p ${LOGGER_FACILITY}.debug "$msg"
 +  fi
 +}
 +
 +### must not be root
 +if [ `$ID -u` -eq 0 ]; then
 +  logit error "Run this as the Oracle software owner, not root"
 +  exit 1
 +fi
 +
 +### determine how we were called, derive location
 +SCRIPTPATH=$0
 +SCRIPTNAME=`$BASENAME $SCRIPTPATH`
 +
 +echo $SCRIPTPATH | grep ^/ > /dev/null 2>&1
 +if [ $? -ne 0 ]; then 
 +  MYDIR=`pwd`
 +  SCRIPTPATH=${MYDIR}/${SCRIPTPATH}
 +fi
 +
 +### must cd to a directory where the oracle owner can get CWD
 +cd /tmp
 +
 +case "$1" in
 +'start')
 +  logit info "$SCRIPTNAME mounting DBFS at $MOUNT_POINT from database $DBNAME"
 +
 +  ### check to see if it is already mounted
 +  $SCRIPTPATH status > /dev/null 2>&1
 +  if [ $? -eq 0 ]; then
 +    logit error "$MOUNT_POINT already mounted, use $SCRIPTNAME stop before attempting to start"
 +    $SCRIPTPATH status
 +    exit 1
 +  fi
 +
 +  ### set the ORACLE_SID dynamically based on OCR info, if it is running
 +  export ORACLE_SID=$($SRVCTL status instance -d $DBNAME -n `$HN` | \
 +                      $GREP 'is running' | $AWK '{print $2}' )
 +  # if single instance, set ORACLE_SID based on below command instead
 +  if [ -z "$ORACLE_SID" ]; then
 +    export ORACLE_SID=$($SRVCTL config db -d $DBNAME | $GREP 'instance' | $AWK '{print $3}')
 +  fi
 +  logit info "ORACLE_SID is $ORACLE_SID"
 +
 +  ### if there's no SID defined locally or it isn't running, stop
 +  if [ -z "$ORACLE_SID" -a "$WALLET" = 'false' ]; then
 +    logit error "No running ORACLE_SID available on this host, exiting"
 +    exit 2
 +  fi
 +
 +  ### version comparison function, used in numa section
 +  # Compare string versions
 +  # Returns in stdout and in the err code
 +  # 0        - a equal b
 +  # 1        - a greater than b
 +  # 255(-1)  - a less than b
 +  # version should be in format 1.2.3.4.5
 +  # It might be a short version like 1.2.3 or 1.2.3.
 +  version_cmp ()
 +  {
 +    local -a al=(`echo $1 | sed -e 's/\./ /g'`)
 +    local -a bl=(`echo $2 | sed -e 's/\./ /g'`)
 +
 +    local -i i=0
 +    for ((i=0; i < ${#al[@]}; i++)); do
 +      # ap is always non-empty. Gap is not possible in both arrays
 +      local ap=${al[$i]}
 +      local bp=${bl[$i]}
 +      # Only $ap defined. $a longer (bigger) then $b
 +      if [ -z "$bp" ] || [ $ap -gt $bp ]; then
 +        echo "1"
 +        return 1
 +      elif [ $ap -lt $bp ]; then
 +        echo "-1"
 +        return -1
 +      fi
 +    done
 +    # Check for the next part from @bl. It means $a shorter (smaller) then $b
 +    if [ -n "${bl[$i]}" ]; then
 +      echo "-1"
 +      return -1
 +    fi
 +    # Both arrays ended at the same time. They are equal
 +    echo "0"
 +    return 0
 +  }
 +  
 +  ### if numa system, update mount_options for bug 10004611
 +  RPMEXA=`$RPMCTL -q --queryformat '%{VERSION}' exadata-base`
 +  NUMASYS=`$NUMACTL --hardware | grep available: | cut -c1-18`
 +  ###Check if an X8 system and image greater than or equal to 11.2.3.3.0 to support numa mount option
 +  if [ "$NUMASYS" = 'available: 8 nodes' ]; then
 +    if [ `version_cmp $RPMEXA 11.2.3.3.0` -eq 0 ] || [ `version_cmp $RPMEXA 11.2.3.3.0` -eq 1 ]; then
 +      MOUNT_OPTIONS=$MOUNT_OPTIONS,numa
 +    else
 +      MOUNT_OPTIONS=$MOUNT_OPTIONS
 +    fi
 +  ###Check if an X5-2 system to support numa mount option
 +  elif [ "$NUMASYS" = 'available: 2 nodes' ]; then
 +    MOUNT_OPTIONS=$MOUNT_OPTIONS,numa
 +  ###Check for all other X2 systems, do not use numa option
 +  elif [ "$NUMASYS" = 'available: 1 nodes' ]; then
 +    MOUNT_OPTIONS=$MOUNT_OPTIONS
 +  ###Exit for errors or unexpected values, post in /var/log/messages
 +  else
 +    logit error "Unexpected numa value.  Exiting."
 +    logit error "Numa hardware value is: $NUMASYS"
 +    logit error "RPM version of Exadata base is: $RPMEXA"  
 +    exit 1
 +  fi
 +
 +  ### if using password-based startup, use this
 +  if [ "$WALLET" = 'false' -a -n "$DBFS_PASSWD" ]; then
 +    $RMF $DBFS_PWDFILE
 +    if [ -f $DBFS_PWDFILE ]; then 
 +      logit error "please remove $DBFS_PWDFILE and try again"
 +      exit 1
 +    fi 
 +
 +    $TOUCH $DBFS_PWDFILE
 +    $CHMOD 600 $DBFS_PWDFILE
 +    $ECHO $DBFS_PASSWD > $DBFS_PWDFILE
 +
 +    logit info "spawning dbfs_client command using SID $ORACLE_SID"
 +
 +    (nohup $DBFS_CLIENT ${DBFS_USER}@ -o $MOUNT_OPTIONS \
 +          $MOUNT_POINT < $DBFS_PWDFILE | $LOGGER -p ${LOGGER_FACILITY}.info 2>&1 & ) &
 +
 +  elif [ "$WALLET" = true ]; then
 +    logit info "doing mount $MOUNT_POINT using SID $ORACLE_SID with wallet now"
 +    (nohup $DBFS_CLIENT /@${DBFS_LOCAL_TNSALIAS} -o $MOUNT_OPTIONS,wallet \
 +          $MOUNT_POINT | $LOGGER -p ${LOGGER_FACILITY}.info 2>&1 & ) &
 +  fi
 +
 +  ### allow time for the mount table update before checking it
 +  $SLEEP 1
 +  ### set return code based on success of mounting
 +  $SCRIPTPATH status > /dev/null 2>&1
 +  if [ $? -eq 0 ]; then
 +    logit info "Start -- ONLINE"
 +    exit 0
 +  else
 +    logit info "Start -- OFFLINE"
 +    exit 1
 +  fi
 +  
 +  $RMF $DBFS_PWDFILE
 +  ;;
 +
 +'stop')
 +  $SCRIPTPATH status > /dev/null
 +  if [ $? -eq 0 ]; then
 +    logit info "unmounting DBFS from $MOUNT_POINT"
 +    if [ $LINUX -eq 1 ]; then
 +      logit info "umounting the filesystem using '$FUSERMOUNT -u $MOUNT_POINT'"
 +      $FUSERMOUNT -u $MOUNT_POINT
 +    elif [ $SOLARIS -eq 1 ]; then
 +      logit info "umounting the filesystem using '$UMOUNT $MOUNT_POINT'"
 +      $UMOUNT $MOUNT_POINT > /dev/null 2>&1
 +    fi
 +    $SCRIPTPATH status > /dev/null
 +    if [ $? -eq 0 ]; then
 +      logit error "Stop - stopped, but still mounted, error"
 +      exit 1
 +    else
 +      logit info "Stop - stopped, now not mounted"
 +      exit 0
 +    fi
 +  else
 +    logit error "filesystem $MOUNT_POINT not currently mounted, no need to stop"
 +  fi
 +  ;;
 +
 +'check'|'status')
 +  ### check to see if it is mounted
 +  ### fire off a short process in perl to do the check (need the alarm builtin)
 +  logit debug "Checking status now"
 +  $PERL <<'TOT'
 +    $timeout = $ENV{'PERL_ALARM_TIMEOUT'};
 +    $SIG{ALRM} = sub { 
 +      ### we have a problem and need to cleanup
 +      exit 3;
 +      die "timeout" ;
 +    };
 +    alarm $timeout;
 +    eval {
 +      $STATUSOUT=`$ENV{'STAT'} -f -c "%T" $ENV{'MOUNT_POINT'} 2>&1 `; 
 +      chomp($STATUSOUT);
 +      ### added fuseblk check for Linux 6 output
 +      if ( ( $ENV{'SOLARIS'} == 1 && $STATUSOUT eq 'uvfs' ) ||
 +           ( $ENV{'LINUX'} == 1   && $STATUSOUT eq 'UNKNOWN (0x65735546)' ) ||
 +           ( $ENV{'LINUX'} == 1   && $STATUSOUT eq 'fuseblk' ) ) {
 +        ### status is okay
 +        exit 0;
 +      } elsif ( $STATUSOUT =~ /Transport endpoint is not connected/ ) {
 +        ### we have a problem, need to clean up
 +        exit 2;
 +      } else {
 +        ### filesystem is offline
 +        exit 1;
 +      }
 +    };
 +
 +TOT
 +
 +  RC=$?
 +  ### process return codes from the perl block
 +  if [ $RC -eq 3 ]; then
 +    STATUS_TIMEOUT=$(( $STATUS_TIMEOUT + 1 ))
 +    logit error "Found timeout while checking status, cleaning mount automatically"
 +    $SCRIPTPATH clean
 +    logit debug "Check -- OFFLINE"
 +    exit 1
 +  elif [ $RC -eq 2 ]; then
 +    STATUS_TIMEOUT=$(( $STATUS_TIMEOUT + 1 ))
 +    logit error "Found error while checking status, cleaning mount automatically"
 +    $SCRIPTPATH clean
 +    logit debug "Check -- OFFLINE"
 +    exit 1
 +  elif [ $RC -eq 1 ]; then
 +    logit debug "Check -- OFFLINE"
 +    exit 1
 +  elif [ $RC -eq 0 ]; then
 +    logit debug "Check -- ONLINE"
 +    exit 0
 +  fi
 +  ;;
 +
 +'restart')
 +  logit info "restarting DBFS" 
 +  $SCRIPTPATH stop
 +  $SLEEP 2
 +  $SCRIPTPATH start
 +  ;;
 +
 +'clean'|'abort')
 +  logit info "cleaning up DBFS nicely using (fusermount -u|umount)"
 +  if [ $LINUX -eq 1 ]; then
 +    $FUSERMOUNT -u $MOUNT_POINT
 +  elif [ $SOLARIS -eq 1 ]; then
 +    $UMOUNT $MOUNT_POINT > /dev/null 2>&1
 +  fi
 +  $SLEEP 1
 +  FORCE_CLEANUP=0
 +  if [ $STATUS_TIMEOUT -gt 1 ]; then
 +    FORCE_CLEANUP=1
 +  else
 +    $SCRIPTPATH status > /dev/null 
 +    if [ $? -eq 0 ]; then FORCE_CLEANUP=1; fi
 +  fi
 +  if [ $FORCE_CLEANUP -eq 1 ]; then 
 +    logit error "tried (fusermount -u|umount), still mounted, now cleaning with (fusermount -u -z|umount -f) and kill"
 +    if [ $LINUX -eq 1 ]; then
 +      $FUSERMOUNT -u -z $MOUNT_POINT
 +    elif [ $SOLARIS -eq 1 ]; then
 +      echo "running umount -f now"
 +      $UMOUNT -f $MOUNT_POINT > /dev/null 2>&1
 +    fi
 +    if [ $LINUX -eq 1 ]; then
 +      PIDS=`$PS -ef | $GREP -w "$MOUNT_POINT" | $GREP dbfs_client| $GREP -v grep | \
 +        $AWK '{print $2}'`
 +      if [ -n "$PIDS" ]; then $KILL -9 $PIDS; fi
 +      PIDS=`$PS -ef | $GREP -w "$MOUNT_POINT" | $GREP mount.dbfs | $GREP -v grep | \
 +        $AWK '{print $2}'`
 +      if [ -n "$PIDS" ]; then $KILL -9 $PIDS; fi
 +    elif [ $SOLARIS -eq 1 ]; then
 +      PIDS=`$PS -ef | $GREP dbfs_client| $GREP -v grep | $AWK '{print $2}'`
 +      REALPIDS=' '
 +      for pid in $PIDS
 +      do
 +        ARGS=`pargs $pid`
 +        echo $ARGS | grep  "$MOUNT_POINT$"  > /dev/null
 +        RET=$?
 +        if [ $RET -eq 0 ]; then REALPIDS="$REALPIDS $pid"; fi
 +      done
 +      if [ -n "$REALPIDS" ]; then $KILL -9 $REALPIDS; fi
 +      ### do it a 2nd time to clean up others
 +      if [ -n "$REALPIDS" ]; then $KILL -9 $REALPIDS; fi
 +      PIDS=`$PS -ef | $GREP dbfs_client| $GREP -v grep | $AWK '{print $2}'`
 +      REALPIDS=' '
 +      for pid in $PIDS
 +      do
 +        ARGS=`pargs $pid`
 +        echo $ARGS | grep  "$MOUNT_POINT$"  > /dev/null
 +        RET=$?
 +        if [ $RET -eq 0 ]; then REALPIDS="$REALPIDS $pid"; fi
 +      done
 +      if [ -n "$REALPIDS" ]; then $KILL -9 $REALPIDS; fi
 +
 +    fi
 +    exit 1
 +  fi
 +  ;;
 +
 +*)
 +  $ECHO "Usage: $SCRIPTNAME { start | stop | check | status | restart | clean | abort }"
 +  ;;
 +
 +esac
 +</Code>
 +
 +<Code:bash|add-dbfs-resource.sh>
 +##### start script add-dbfs-resource.sh
 +#!/bin/bash
 +ACTION_SCRIPT=/u01/app/12.1.0.2/grid/crs/script/mount-dbfs.sh
 +RESNAME=dbfs_mount
 +DBNAME=OGGRAC
 +DBNAMEL=`echo $DBNAME | tr A-Z a-z`
 +ORACLE_HOME=/u01/app/12.1.0.2/grid
 +PATH=$ORACLE_HOME/bin:$PATH
 +export PATH ORACLE_HOME
 +crsctl add resource $RESNAME \
 +-type local_resource \
 +-attr "ACTION_SCRIPT=$ACTION_SCRIPT, \
 +CHECK_INTERVAL=30,RESTART_ATTEMPTS=10, \
 +START_DEPENDENCIES='hard(ora.$DBNAMEL.db)pullup(ora.$DBNAMEL.db)
 +',\
 +STOP_DEPENDENCIES='hard(ora.$DBNAMEL.db)',\
 +SCRIPT_TIMEOUT=300"
 +##### end script add-dbfs-resource.sh
 </Code> </Code>
  • oracle_dbfs.1604415050.txt.gz
  • Last modified: 2020/11/03 14:50
  • by andonovj