If you’ve landed here, your Tableau Background Tasks for Extracts are probably showing a string of failed refresh jobs, and you’re staring at this error:
“The drivers required to connect to the data source are not installed.”
Meanwhile, your users are seeing:
“An unexpected error occurred. Would you like to reset the view?”
How You’ll Typically Discover This Error
This error doesn’t always surface immediately. Here’s where Tableau Server admins first notice it:
Site Status > Background Tasks for Extracts
This is the most common discovery path. You open Site Status > Background Tasks for Extracts in the Tableau Server admin panel and see a string of failed extract refresh jobs. The error detail shows ConnectivityException with the “drivers required to connect to the data source are not installed” message. Scheduled extracts that were running fine — hourly, daily, weekly — suddenly all fail at once. If you’re seeing Tableau extract refresh failed across multiple PostgreSQL data sources simultaneously, this driver issue is almost certainly the cause.
Workbook and Dashboard Views
End users opening workbooks and dashboards connected to PostgreSQL data sources see the generic Tableau error: “An unexpected error occurred. Would you like to reset the view?” This gives no indication of the root cause — which is why checking Background Tasks for Extracts is the faster diagnostic path.
VizQL Server Logs
The tabprotosrv_vizqlserver_*.txt logs contain the full ConnectivityException with dse-type: NoDriver. This is the definitive confirmation, but most admins find the issue through the Background Tasks UI first.
Data Source Connection Tests
Attempting to edit or test a PostgreSQL data source connection from the Tableau Server web UI fails immediately with the driver error. Live connections and extract refreshes are both affected — any PostgreSQL connectivity requires the JDBC driver.
This guide walks through the exact root cause and fix — based on a real production incident we resolved on a Tableau Server 2025.3 deployment running on Linux.
The Error in Full
In the VizQL server logs (tabprotosrv_vizqlserver_*.txt), you’ll see something like:
{
"sev": "warn",
"k": "excp",
"v": {
"class": "postgres",
"dse-type": "NoDriver",
"excp-msg": "The drivers required to connect to the data source are not installed.",
"excp-type": "ConnectivityException",
"is-local-configuration-error": true
}
}
Key fields to note:
class: postgres— the connector type is PostgreSQLdse-type: NoDriver— no driver foundis-local-configuration-error: true— the problem is on the Tableau Server node itself
Tableau error code: 0xD9B681CB
What’s Actually Happening
Tableau Server’s VizQL process (tabprotosrv) uses the JDBC driver to connect to PostgreSQL data sources on Linux — not ODBC, despite what some log fields suggest (odbc-native-protocol is misleading here).
Tableau expects PostgreSQL JDBC drivers to live in a specific directory:
/opt/tableau/tableau_driver/jdbc/
If this directory doesn’t exist or is empty, Tableau cannot connect to any PostgreSQL data source and throws the NoDriver error. Every scheduled extract refresh will fail, and Background Tasks for Extracts will show a wall of red. This commonly happens after:
- A fresh Tableau Server installation where the driver step was skipped
- A VM snapshot restore where the driver directory wasn’t part of the image
- A server migration or rebuild
- An OS-level cleanup that removed custom directories
Understanding the Tableau driver requirements for your specific connector is critical before any deployment or migration.
Environment
| Component | Version |
|---|---|
| Tableau Server | 2025.3.3 (also applies to 2021.1 through 2025.x) |
| OS | Linux (RHEL, CentOS, Amazon Linux, Ubuntu) |
| Connector | PostgreSQL (class: postgres) |
The Fix
Step 1 — Confirm the Directory Is Missing
ls /opt/tableau/tableau_driver/jdbc/
# Expected: No such file or directory
Step 2 — Create the Directory
sudo mkdir -p /opt/tableau/tableau_driver/jdbc
Step 3 — Copy the JDBC Driver
Tableau ships the PostgreSQL JDBC jar inside its own package directory. No external download needed:
sudo cp /opt/tableau/tableau_server/packages/vizql.20253.26.0206.0336/postgresql-42.7.8.jar \
/opt/tableau/tableau_driver/jdbc/
Replace 20253.26.0206.0336 with your actual Tableau version string. Find it with:
tsm version
If that path doesn’t exist, find the jar:
find /opt/tableau/tableau_server/packages/ -name "postgresql-*.jar" | head -5
Pick any one — they’re all the same version bundled across packages.
Step 4 — Verify
ls -la /opt/tableau/tableau_driver/jdbc/
# Should show: postgresql-42.7.8.jar
Step 5 — Restart Tableau Server
tsm restart
This takes 3–5 minutes. Once Tableau Server is back up, verify the fix by checking Site Status > Background Tasks for Extracts — previously failed extract refreshes should now complete successfully. Trigger a manual extract refresh on one of your PostgreSQL data sources to confirm before waiting for the next scheduled run.
What About the ODBC Driver?
You might be tempted to install postgresql-odbc via dnf or apt after seeing ODBC-related strings in the logs. We went down that path too during this incident.
While it’s true that tabprotosrv references ODBC internals, Tableau Server on Linux uses JDBC for PostgreSQL — not ODBC. Installing psqlodbc and registering it in /etc/odbcinst.ini will not resolve this error.
The fix is purely the JDBC jar in /opt/tableau/tableau_driver/jdbc/.
This is documented in the Tableau Linux driver installation guide, but it’s easy to miss during initial setup — especially when the error message points toward ODBC.
Why Does This Happen on Snapshot Restores?
If your Tableau Server was restored from a VM snapshot (for example, after an infrastructure outage), the /opt/tableau/tableau_driver/ directory may not have existed at snapshot time — especially if it was created after the initial server image was built. The first sign is usually Background Tasks for Extracts showing every scheduled refresh as failed.
This is a common pattern we see across data infrastructure incidents: configuration that works on the original server but isn’t captured in the provisioning pipeline. The same problem occurs with custom certificates, license files, and environment-specific configurations.
Preventing This in Infrastructure as Code
The long-term fix is to ensure the JDBC driver directory and its contents are part of your provisioning pipeline. Here’s how to handle it with common IaC tools.
Ansible
- name: Ensure Tableau JDBC driver directory exists
file:
path: /opt/tableau/tableau_driver/jdbc
state: directory
mode: '0755'
- name: Copy PostgreSQL JDBC driver
copy:
src: files/postgresql-42.7.8.jar
dest: /opt/tableau/tableau_driver/jdbc/postgresql-42.7.8.jar
mode: '0644'
Terraform + User Data
resource "aws_instance" "tableau_server" {
# Works with any cloud provider's compute resource
# Replace with azurerm_linux_virtual_machine, google_compute_instance, etc.
user_data = <<-EOF
#!/bin/bash
mkdir -p /opt/tableau/tableau_driver/jdbc
cp /opt/tableau/tableau_server/packages/vizql.*/postgresql-*.jar \
/opt/tableau/tableau_driver/jdbc/ 2>/dev/null || true
EOF
}
Packer (Machine Image Build)
provisioner "shell" {
inline = [
"sudo mkdir -p /opt/tableau/tableau_driver/jdbc",
"sudo cp /opt/tableau/tableau_server/packages/vizql.*/postgresql-*.jar /opt/tableau/tableau_driver/jdbc/"
]
}
Adding this to your infrastructure automation pipeline ensures the driver survives any rebuild, restore, or migration scenario.
Quick Troubleshooting Checklist
If you’re still seeing failed extract refreshes in Background Tasks for Extracts after following the steps above:
- Confirm the jar file exists:
ls /opt/tableau/tableau_driver/jdbc/postgresql-*.jar - Check file permissions: the
tableauuser must be able to read the jar - Verify Tableau restarted fully:
tsm status -v— all processes should show “running” - Run a manual extract refresh and check Background Tasks for Extracts for a successful status
- Check you’re looking at the right connector: the log must show
class: postgres, notclass: mysqlor another type - If using a different database, check the Tableau driver page for the correct JDBC jar
Other Connectors That Hit the Same Error
This same NoDriver / ConnectivityException pattern applies to other database connectors on Tableau Server Linux. The fix is always the same: place the correct JDBC jar in /opt/tableau/tableau_driver/jdbc/.
| Connector | JDBC Jar Needed |
|---|---|
| PostgreSQL | postgresql-42.x.x.jar |
| MySQL | mysql-connector-j-8.x.x.jar |
| Amazon Redshift | redshift-jdbc42-2.x.x.jar |
| Snowflake | snowflake-jdbc-3.x.x.jar |
| Databricks | DatabricksJDBC42.jar |
Check the Tableau driver download page for the latest versions.
Expert Tableau and Data Infrastructure Support
This incident was diagnosed and resolved as part of our production support engagement. A missing JDBC jar is a 10-minute fix — but finding it in the logs without experience can waste hours.
Our team provides Tableau professional services and data analytics consulting to help you:
- Deploy and maintain Tableau Server with production-grade infrastructure on any cloud or on-premises
- Automate Tableau provisioning with Terraform, Ansible, and CI/CD pipelines
- Monitor Tableau health with observability stacks that catch driver, licensing, and performance issues before users report them
We specialise in data platform infrastructure across the UK and Gulf region.