
The Problem: Data Pump Import Fails with Date Format Error
Setting NLS_DATE_FORMAT before impdp is the standard fix for data pump import date format error i.e. ORA-01843 and ORA-01861 during Data Pump imports — but it doesn’t always work. Data Pump spawns its own worker processes and doesn’t always inherit the OS-level environment. When the NLS fix failed in our environment, we moved to RMAN backup and restore to bypass the date format issue entirely. This post documents both the NLS fix attempt and the RMAN path that resolved it, on Oracle 19c.
You’re running a Data Pump import and it crashes with date format errors like '1998-01-01 00:00:00'. You try setting export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' in your shell, but the import still fails.
Error you’re seeing:
ORA-01843: not a valid month
ORA-01861: literal does not match format string
This happens because Data Pump doesn’t always respect environment-level NLS settings, especially when table creation DDLs contain hardcoded timestamp formats.
Solution 1: Export NLS_DATE_FORMAT Correctly
Step 1: Set NLS Parameters at OS Level
Before starting Data Pump import, export these variables:
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS TZR'
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
Step 2: Verify Export Settings
echo $NLS_DATE_FORMAT
echo $NLS_LANG
Expected Output:
YYYY-MM-DD HH24:MI:SS
AMERICAN_AMERICA.AL32UTF8
Step 3: Run Data Pump Import
impdp username/password@database \
directory=dpump_dir \
dumpfile=export.dmp \
logfile=import.log \
full=y
Solution 2: Session-Level NLS_DATE_FORMAT (SQL*Plus)
If you’re using SQL*Plus or running PL/SQL scripts:
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS';
-- Verify settings
SELECT VALUE FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER='NLS_DATE_FORMAT';
Output:
VALUE
--------------------------------
YYYY-MM-DD HH24:MI:SS
Why NLS_DATE_FORMAT Export Sometimes Fails
Data Pump import processes run in their own session context and may not inherit environment variables correctly, especially when:
- DDL contains hardcoded formats in table creation statements
- Import runs as a different OS user (oracle vs. root)
- SSH/remote connections don’t propagate environment variables
- Database NLS parameters override session settings
Solution 3: RMAN Backup/Restore Approach (When NLS Export Fails)
When export NLS_DATE_FORMAT doesn’t resolve the issue, use RMAN for a complete database copy. This bypasses date format issues entirely.
Step 1: Prepare Source Database Backup
Login to source database server:
mkdir -p /u02/backup/SOURCEDB
Connect to RMAN:
rman target /
Verify database status:
SQL> SELECT open_mode, database_role FROM v$database;
OPEN_MODE DATABASE_ROLE
-------------------- ----------------
READ WRITE PRIMARY
Step 2: Create Full RMAN Backup
Adjust channels based on available CPU/disk:
RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK
FORMAT '/u02/backup/SOURCEDB/full_db_%U.bkp';
ALLOCATE CHANNEL c2 DEVICE TYPE DISK
FORMAT '/u02/backup/SOURCEDB/full_db_%U.bkp';
ALLOCATE CHANNEL c3 DEVICE TYPE DISK
FORMAT '/u02/backup/SOURCEDB/full_db_%U.bkp';
BACKUP AS COMPRESSED BACKUPSET
DATABASE PLUS ARCHIVELOG
TAG 'MIGRATION_BACKUP';
BACKUP CURRENT CONTROLFILE
FORMAT '/u02/backup/SOURCEDB/controlfile.bkp';
BACKUP SPFILE
FORMAT '/u02/backup/SOURCEDB/spfile.bkp';
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
RELEASE CHANNEL c3;
}
Expected Output:
channel c1: starting compressed full datafile backup set
channel c1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u01/oradata/SOURCEDB/system01.dbf
input datafile file number=00003 name=/u01/oradata/SOURCEDB/sysaux01.dbf
channel c1: finished piece 1 at 14-FEB-25
piece handle=/u02/backup/SOURCEDB/full_db_0a1b2c3d_1_1.bkp
Step 3: Copy Backup to Target Server
Using scp:
scp -r /u02/backup/SOURCEDB/* oracle@target-server:/u02/restore/TARGETDB/
Or using rsync (faster for large backups):
rsync -avzP /u02/backup/SOURCEDB/ oracle@target-server:/u02/restore/TARGETDB/
Step 4: Prepare Target Database
Shutdown existing database (if running):
RMAN> SHUTDOWN IMMEDIATE;
database closed
database dismounted
Oracle instance shut down
Start in NOMOUNT mode:
RMAN> STARTUP NOMOUNT;
connected to target database (not started)
Oracle instance started
Total System Global Area 1073741824 bytes
Step 5: Restore Control File
RMAN> RESTORE CONTROLFILE FROM '/u02/restore/TARGETDB/controlfile.bkp';
Starting restore at 14-FEB-25
allocated channel: ORA_DISK_1
channel ORA_DISK_1: restored control file from backup piece
Finished restore at 14-FEB-25
Mount the database:
RMAN> ALTER DATABASE MOUNT;
database mounted
Step 6: Catalog Backup Files
This is critical – Tell RMAN where backup files are located on target server:
RMAN> CATALOG START WITH '/u02/restore/TARGETDB/';
searching for all files that match the pattern /u02/restore/TARGETDB/
List of Files Unknown to the Database
=====================================
File Name: /u02/restore/TARGETDB/full_db_0a1b2c3d_1_1.bkp
File Name: /u02/restore/TARGETDB/controlfile.bkp
Do you really want to catalog the above files (enter YES or NO)? YES
cataloging files...
cataloging done
Step 7: Restore and Recover Database
Check available archive logs:
RMAN> SELECT THREAD#, SEQUENCE#,
TO_CHAR(FIRST_TIME,'YYYY-MM-DD HH24:MI:SS') FIRST_TIME,
TO_CHAR(NEXT_TIME,'YYYY-MM-DD HH24:MI:SS') NEXT_TIME
FROM V$ARCHIVED_LOG
ORDER BY SEQUENCE# DESC
FETCH FIRST 10 ROWS ONLY;
THREAD# SEQUENCE# FIRST_TIME NEXT_TIME
-------- --------- ------------------- -------------------
1 125 2025-02-14 11:45:30 2025-02-14 11:50:15
1 124 2025-02-14 11:40:20 2025-02-14 11:45:30
Restore database:
RMAN> RESTORE DATABASE;
Starting restore at 14-FEB-25
channel ORA_DISK_1: restoring datafile 00001
channel ORA_DISK_1: restore complete, elapsed time: 00:15:30
Finished restore at 14-FEB-25
Recover to specific point (optional):
RMAN> RECOVER DATABASE UNTIL TIME
"TO_DATE('2025-02-14 12:00:00','YYYY-MM-DD HH24:MI:SS')";
Starting recover at 14-FEB-25
applying archived logs
archived log file name=/u02/restore/TARGETDB/arch_125.log
recovery complete
Finished recover at 14-FEB-25
Or recover to latest available:
RMAN> RECOVER DATABASE;
Step 8: Open Database with RESETLOGS
RMAN> ALTER DATABASE OPEN RESETLOGS;
database opened
Verify database status:
SQL> SELECT name, open_mode, log_mode FROM v$database;
NAME OPEN_MODE LOG_MODE
--------- -------------------- ------------
TARGETDB READ WRITE ARCHIVELOG
Best Practices for NLS_DATE_FORMAT Export
1. Make NLS Settings Permanent
Add to .bash_profile:
vi ~/.bash_profile
# Add these lines:
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
# Save and source:
source ~/.bash_profile
2. Verify Before Every Import
# Quick verification script
echo "NLS_DATE_FORMAT: $NLS_DATE_FORMAT"
echo "NLS_LANG: $NLS_LANG"
sqlplus -s / as sysdba <<EOF
SELECT parameter, value FROM nls_session_parameters
WHERE parameter IN ('NLS_DATE_FORMAT','NLS_LANGUAGE','NLS_TERRITORY');
EXIT
EOF
3. Use Parameter Files for Data Pump
Create import.par:
username/password@database
directory=dpump_dir
dumpfile=export.dmp
logfile=import.log
full=y
Run import:
impdp parfile=import.par
Troubleshooting NLS_DATE_FORMAT Export Issues
Issue 1: Export Command Not Working
Symptom: export NLS_DATE_FORMAT doesn’t change date format
Solution:
# Check if variable is set
env | grep NLS
# If empty, ensure no typos:
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' # Correct
export NLS_DATE_FROMAT='YYYY-MM-DD HH24:MI:SS' # Wrong (typo)
Issue 2: Import Still Fails After Export
Symptom: Data Pump import fails even after correct export
Causes:
- Running
impdpas different user (root instead of oracle) - SSH connection doesn’t propagate environment
- Database init parameter overrides session settings
Solution:
# Run as correct user:
su - oracle
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
impdp ...
# OR use RMAN method (Solution 3 above)
Issue 3: Date Format Works in SQL*Plus But Not Data Pump
Symptom: ALTER SESSION SET NLS_DATE_FORMAT works in SQL*Plus but not in import
Solution: Data Pump spawns separate worker processes. Use RMAN restore method to avoid the issue entirely.
When to Use Each Solution
| Scenario | Best Solution |
|---|---|
| Simple date format mismatch | Export NLS_DATE_FORMAT |
| Session-level quick fix | ALTER SESSION SET |
| Persistent export failures | RMAN backup/restore |
| Large database migration | RMAN backup/restore |
| DDL has hardcoded formats | RMAN backup/restore |
| Testing in dev environment | Export NLS_DATE_FORMAT |
Post-Migration Validation
1. Verify Date Formats
-- Check date columns
SELECT table_name, column_name, data_type
FROM user_tab_columns
WHERE data_type IN ('DATE','TIMESTAMP');
-- Test date display
SELECT SYSDATE,
TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') formatted_date
FROM dual;
2. Validate Data Integrity
-- Compare row counts
SELECT 'SOURCE' db, COUNT(*) FROM source_table@dblink
UNION ALL
SELECT 'TARGET' db, COUNT(*) FROM target_table;
-- Check sample data
SELECT * FROM target_table WHERE ROWNUM <= 10;
3. Test Application Connectivity
# Test TNS connection
tnsping TARGETDB
# Test SQL*Plus connection
sqlplus user/pass@TARGETDB
Common Errors and Quick Fixes
ORA-01843: not a valid month
Cause: Date format mismatch between export and import
Fix:
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA-01861: literal does not match format string
Cause: Hardcoded date literals in DDL don’t match NLS settings
Fix: Use RMAN restore method (bypasses DDL parsing)
ORA-12154: TNS:could not resolve the connect identifier
Cause: Target database TNS entry missing or incorrect
Fix:
# Check tnsnames.ora
cat $ORACLE_HOME/network/admin/tnsnames.ora
# Test connection
tnsping TARGETDB
sqlplus user/pass@TARGETDB
Conclusion
Exporting NLS_DATE_FORMAT correctly resolves most Data Pump import date format issues. For persistent problems or large migrations, RMAN backup/restore provides a bulletproof solution that bypasses format conversion challenges entirely.
Key Takeaways:
- Always export NLS_DATE_FORMAT before Data Pump operations
- Make NLS settings permanent in .bash_profile
- Use RMAN when export solutions fail
- Verify NLS parameters before and after migration
- Test the process in development first
Additional Resources
- Oracle 19c Database Administrator’s Guide
- RMAN Backup and Recovery User’s Guide
- Data Pump Export and Import Guide
- Oracle Support: Doc ID 601267.1 – NLS_LANG Parameter FAQ
Related Posts:

4 thoughts on “How to Export NLS_DATE_FORMAT in Oracle: Data Pump Import Date Format Fix”