Why Is Ignition QuestDB Historian Missing from Query Browser?

Karen Mitchell8 min read
HMI / SCADAOther ManufacturerTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

The status page shows the Internal Historian (QuestDB) storing tag data, yet the provider never appears in the Designer's Database Query Browser dropdown. This is normal. The Query Browser lists only gateway database connections, and the internal QuestDB historian does not run through a database connection. To browse it with SQL, enable QuestDB's Postgres wire interface (PGwire) in ignition.conf, restart the gateway, and create a separate read-only Postgres connection that points at it.

Why does the historian report healthy while the Query Browser list stays empty?

Ignition 8.3 embeds QuestDB as a storage engine inside the gateway process. Tag history writes go straight to that embedded engine through the historian subsystem. No JDBC connection is involved. The Database Query Browser only enumerates entries under the gateway's Database Connections, so a historian that never created one has nothing to list.

Two different layers are involved here:

  • Historian provider: what tags bind to, what the status page reports, and what queryTagHistory and the system.historian.* functions read from.
  • Database connection: a JDBC link that the Query Browser, named queries, and system.db.* use.

A healthy provider with no Query Browser entry means the provider layer works and the connection layer was never built. That is a missing binding, not a data fault.

Inductive Automation ships QuestDB Embedded, not QuestDB Enterprise. Enterprise features such as high availability, role-based security, and tiered storage are not present. Synchronizing the internal historian through Ignition redundancy is under development and was not available at the time of writing.

What does each screen actually tell you?

Read the screens in this order to separate a storage problem from a connection problem.

What you see Where Cause Layer
Tag data shows as stored successfully Gateway historian status page Provider is writing normally Historian provider (healthy)
Provider not in the Query Browser dropdown Designer > Database Query Browser No database connection exists for the internal historian. This is expected by design. Connection (not built)
No PostgreSQL option when creating a connection Gateway > Database Connections > JDBC drivers (/app/connections/databases/settings/drivers-jdbc) Postgres JDBC module is disabled or not loaded, which is common with an outdated Docker compose module list Module/driver
Connection to port 8812 faults or is refused Database Connections status PGwire not enabled in ignition.conf, or gateway not restarted after the edit Gateway parameter
Connection is valid but INSERT/UPDATE fails Query Browser Interface is read-only by design Expected behavior
Remote host cannot reach port 8812 Client on another server Server binds to the loopback interface only Network binding

Which access path fits: scripting, a local Postgres connection, or a proxy?

Each path answers a different need.

Approach What it gives you Setup Limits
Built-in scripting (queryTagHistory, system.historian.* Historian Functions) Supported read path for applications, reports, and bindings None beyond the provider No raw SQL. No Query Browser.
Local Postgres connection to PGwire Query Browser access, raw SQL, and inspection of stored data for quality checks Edit ignition.conf, restart, create JDBC connection Read-only. Loopback only. Fixed credentials.
Reverse proxy in front of port 8812 SQL reads from another server Proxy on the gateway host Not a supported configuration. Read performance impact is unmeasured.
History splitter: local internal historian plus remote historian over the Gateway Network to the backup gateway's internal historian A second copy of history on another gateway while native redundancy sync is unavailable Splitter provider plus Gateway Network remote historian A proposed workaround, not a validated vendor pattern. Test it before production use.

Recommendation:

  • For application reads such as charts, reports, and scripts, use the built-in historian functions. That is the intended path, and it survives future changes to the storage engine.
  • To inspect data in the Query Browser, validate stored values, or explore the database, build the local Postgres connection.
  • Use a proxy only when an external analytics host needs SQL access, and load-test it first.

How do I enable PGwire and build the Postgres connection?

  1. Stop the gateway, or plan a restart window. The ignition.conf change only takes effect after a gateway restart.
  2. Open ignition.conf and add the parameter that enables PGwire for the internal historian. Take the exact parameter name and syntax from the Gateway and Gateway Network Parameters page of the Ignition User Manual. Do not guess it. On Docker, pass the same gateway parameter through your container's gateway-argument mechanism so it persists across container recreation.
  3. Restart the gateway.
  4. In the gateway web interface, open the JDBC driver list at /app/connections/databases/settings/drivers-jdbc and confirm a PostgreSQL driver is present. If it is missing, go to the Docker section below before continuing.
  5. Create a new database connection with the PostgreSQL driver and these values:
    Connection URL: jdbc:postgresql://localhost:8812/qdb
    Username:       user
    Password:       ignition
  6. Save the connection and wait for its status to show valid.
  7. Open the Designer, then the Database Query Browser, and select the new connection from the dropdown.
Setting Location Effect
PGwire enable parameter ignition.conf (Gateway Parameters) Starts the read-only Postgres wire listener on loopback port 8812
jdbc:postgresql://localhost:8812/qdb Database connection URL Points JDBC at the embedded QuestDB instance
User user / password ignition Database connection credentials Fixed login. No gateway setting exists to change it.
Postgres JDBC module Gateway modules / Docker enabled-modules list Supplies the PostgreSQL driver option

What if PostgreSQL is missing from the driver list on a Docker install?

A fresh Ignition 8.3 install includes a Postgres JDBC module by default. When the driver dropdown has no PostgreSQL entry, the module is either disabled or was never loaded.

On Docker, the usual cause is a compose file carried over from an earlier release. The module list changed significantly in 8.3. An old compose file with an explicit enabled-modules flag leaves the Postgres JDBC module out, and the gateway silently skips it.

  1. Open the compose file and find the enabled-modules setting.
  2. Compare its module list against the modules shipped with your 8.3 image. Add the Postgres JDBC module, or remove the restriction if you do not need one.
  3. Recreate the container.
  4. Recheck /app/connections/databases/settings/drivers-jdbc for the PostgreSQL driver.
  5. Confirm the PGwire gateway parameter is still applied in the new container.

Do not upload a third-party PostgreSQL JDBC jar to work around this. The bundled module is the supported driver, and the fault is the module list, not a missing driver file.

What are the limits on remote access, credentials, and redundancy?

  • Loopback only. The PGwire listener binds to the loopback interface. Exposing port 8812 externally is not a supported option. Only processes on the gateway host, including the gateway's own JDBC connection, can reach it directly.
  • Proxy workaround. A proxy on the gateway host that forwards to localhost:8812 has been used to read the historian from a different server. Treat it as unsupported. Benchmark heavy analytical queries against historian write load before relying on it, because both share the same embedded engine and host.
  • Fixed credentials. The user/ignition login is not configurable. The loopback binding and read-only mode are the only protection at the database layer. If a site requires read access to be restricted as well, control access at the Ignition layer: limit who can open the Designer and who can use the database connection in project resources. Do not rely on the database login.
  • Read-only. Writing arbitrary data into the internal historian is not a planned feature. Keep manual SQL writes, lookup tables, and custom data in a separate database.
  • Scope. The internal historian stores tag history only. Alarm journal and audit log data still require a SQL database connection. Migrating them to the internal historian is on the long-term roadmap, with no release committed.
  • High availability. QuestDB Embedded provides no replication or HA. Native synchronization through Ignition redundancy is in development. Until it ships, a history splitter feeding both a local internal historian and a remote historian on the backup gateway over the Gateway Network is the candidate design. Validate gap behavior during failover before trusting it.
  • Upgrades from 8.1. Existing SQL-based tag history providers can stay in place. Moving tags to the internal historian means pointing them at the new provider, and scripts may need the system.historian.* functions. Check the Historian Functions section of the manual for the calls that apply to your provider.

How do I confirm the Query Browser is reading live historian data?

  1. In the gateway, confirm the new Postgres connection shows a valid status. A faulted connection means PGwire is off, the gateway was not restarted, or the URL/port is wrong.
  2. In the Designer's Database Query Browser, select the connection and run SHOW TABLES; to list the historian's tables.
  3. Pick the table that holds tag values and run a bounded query, for example SELECT * FROM <table> LIMIT 20;, to inspect column layout and recent rows.
  4. Force a value change on a tag assigned to the internal historian, wait one storage cycle, and re-run the query. The new sample should appear with a current timestamp.
  5. Cross-check the same tag and time range with queryTagHistory or a trend. Scripting and SQL should return matching values.
  6. Attempt a harmless write such as an INSERT into a scratch name and confirm it is rejected. A rejection proves you are on the read-only interface and cannot corrupt stored history.

Frequently asked questions

What happens if I create the Postgres connection before enabling PGwire?

The connection to jdbc:postgresql://localhost:8812/qdb faults because nothing is listening on port 8812. Add the PGwire parameter to ignition.conf using the Gateway Parameters page of the manual, restart the gateway, and the connection should go valid without other changes.

What happens if I try to INSERT or UPDATE data through the QuestDB historian connection?

The write is rejected because the PGwire interface is read-only. Writing arbitrary data to the internal historian is not a planned feature, so keep custom tables in a separate SQL database.

What happens if the PostgreSQL driver is missing from the JDBC driver list in Docker?

The Postgres JDBC module was excluded, usually by an enabled-modules list in a compose file from an older release. Update the module list for 8.3, recreate the container, and recheck /app/connections/databases/settings/drivers-jdbc.

What happens if I need to query the QuestDB historian from another server?

Port 8812 binds to loopback and cannot be exposed externally. A proxy on the gateway host forwarding to localhost:8812 has worked but is unsupported, so load-test its effect on historian performance before relying on it.

Does the Ignition internal historian store alarm journal and audit log data?

No. It stores tag history only, and alarm journals and audit logs still need a SQL database connection. Migrating them to the internal historian is on the long-term roadmap.

Back to blog