Troubleshooting Oracle DBFS mount issues
On Exadata the local drives on the compute nodes are not big enough to allow larger exports and often dbfs is configured. In my case I had a 1.2 TB dbfs file system mounted under /dbfs_direct/.
While I was doing some exports yesterday I found that my dbfs wasn't mounted, running quick crsctl command to bring it online failed:
[oracle@exadb01 ~]$ crsctl start resource dbfs_mount -n exadb01
CRS-2672: Attempting to start 'dbfs_mount' on 'exadb01'
CRS-2674: Start of 'dbfs_mount' on 'exadb01' failed
CRS-2679: Attempting to clean 'dbfs_mount' on 'exadb01'
CRS-2681: Clean of 'dbfs_mount' on 'exadb01' succeeded
CRS-4000: Command Start failed, or completed with errors.
It doesn't give you any error messages or reason why it's failing, neither the other database and grid infrastructure logs does. The only useful solution is to enable tracing for dbfs client and see what's happening. To enable tracing edit the mount script and insert the following MOUNT_OPTIONS:
vi $GI_HOME/crs/script/mount-dbfs.sh
MOUNT_OPTIONS=trace_level=1,trace_file=/tmp/dbfs_client_trace.$$.log,trace_size=100
Now start the resource one more time to get the log file generated. You can get this working with the client as well from the command line:
[oracle@exadb01 ~]$ dbfs_client dbfs_user@ -o allow_other,direct_io,trace_level=1,trace_file=/tmp/dbfs_client_trace.$$.log /dbfs_direct
Password:
Fail to connect to database server.
After checking the log file it's clear now why dbfs was failing to mount, the dbfs database user has expired:
tail /tmp/dbfs_client_trace.100641.log.0
[43b6c940 03/12/14 11:15:01.577723 LcdfDBPool.cpp:189 ] ERROR: Failed to create session pool ret:-1
[43b6c940 03/12/14 11:15:01.577753 LcdfDBPool.cpp:399 ] ERROR: ERROR 28001 - ORA-28001: the password has expired
[43b6c940 03/12/14 11:15:01.577766 LcdfDBPool.cpp:251 ] DEBUG: Clean up OCI session pool...
[43b6c940 03/12/14 11:15:01.577805 LcdfDBPool.cpp:399 ] ERROR: ERROR 24416 - ORA-24416: Invalid session Poolname was specified.
[43b6c940 03/12/14 11:15:01.577844 LcdfDBPool.cpp:444 ] CRIT : Fail to set up database connection.
The account had a default profile which had the default PASSWORD_LIFE_TIME of 180 days:
[plain]SQL> select username, account_status, expiry_date, profile from dba_users where username='DBFS_USER';
USERNAME ACCOUNT_STATUS EXPIRY_DATE PROFILE
-------- -------------- ---------------- -------
DBFS_USER EXPIRED 03-03-14 14:56:12 DEFAULT
Elapsed: 00:00:00.02
SQL> select password from sys.user$ where name= 'DBFS_USER';
PASSWORD
------------------------------
A4BC1A17F4AAA278
Elapsed: 00:00:00.00
SQL> alter user DBFS_USER identified by values 'A4BC1A17F4AAA278';
User altered.
Elapsed: 00:00:00.03
SQL> select username, account_status, expiry_date, profile from dba_users where username='DBFS_USER';
USERNAME ACCOUNT_STATUS EXPIRY_DATE PROFILE
-------- -------------- ---------------- -------
DBFS_USER OPEN 09-09-14 11:09:43 DEFAULT
SQL> select * from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
After resetting database user password dbfs successfully mounted!
If you are using dedicated database for dbfs make sure you have set the password_life_time to unlimited to avoid similar issues.