Skip to main content

MySQL and PostgreSQL Data Sources

Grafana provides native support for querying MySQL and PostgreSQL relational databases. Both data sources share similar features and SQL query capabilities.

Overview

The MySQL and PostgreSQL data sources support:
  • Standard SQL queries for time series and table data
  • SQL query builder and code editor
  • Macros for time-based filtering and grouping
  • Template variables from query results
  • Multi-value variables
Source: public/app/plugins/datasource/mysql/ and public/app/plugins/datasource/grafana-postgresql-datasource/

Configuration

MySQL Configuration

1

Add Data Source

Navigate to Configuration > Data Sources > Add data source > MySQL
2

Configure Connection

Set connection parameters:
  • Host: localhost:3306
  • Database: mydatabase
  • User: Database username
  • Password: Database password
3

Additional Settings

  • Max open connections: Connection pool size (default: 100)
  • Max idle connections: Idle connection pool size (default: 2)
  • Max connection lifetime: Maximum connection duration (default: 14400s)

PostgreSQL Configuration

1

Add Data Source

Navigate to Configuration > Data Sources > Add data source > PostgreSQL
2

Configure Connection

Set connection parameters:
  • Host: localhost:5432
  • Database: postgres
  • User: Database username
  • Password: Database password
  • TLS/SSL Mode: disable, require, or verify-full
3

PostgreSQL Specifics

  • Version: Select PostgreSQL version for query compatibility
  • TimescaleDB: Enable if using TimescaleDB extension

Connection Settings

string
required
Database host and port (e.g., localhost:3306, db.example.com:5432)
string
required
Database name to connect to
string
required
Database username
string
required
Database password (stored encrypted)
string
PostgreSQL only: SSL mode (disable, require, verify-ca, verify-full)
number
default:"100"
Maximum number of open connections to the database
number
default:"2"
Maximum number of idle connections
number
default:"14400"
Maximum connection lifetime in seconds

Query Requirements

Queries must return specific columns based on visualization type:

Time Series Queries

Time series queries must return:
  • A column named time, time_sec, or timestamp column (in UTC)
  • One or more columns with numeric data type as values
  • Optional: A column named metric for series names
Resultsets must be sorted by time.
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:12-28 and public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:12-27

Table Queries

Table queries can return any set of columns. Grafana displays them in a table panel.

SQL Macros

Grafana provides macros to simplify time-based queries:

MySQL Macros

Converts a timestamp column to Unix timestamp:
Expands to:
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:35
Same as $__time(), returns Unix epoch:
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:36
Filters by dashboard time range:
Expands to:
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:37
Filters Unix epoch timestamps:
Expands to:
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:38
Groups time into intervals:
MySQL expands to:
Optional fillvalue fills missing intervals:
  • Literal value: 0, NULL
  • previous: Use previous value
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:42-47
Groups time and aliases as time:
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:48-50

PostgreSQL Macros

Aliases column as time:
Expands to:
Source: public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:34
Converts to Unix epoch:
Expands to:
Source: public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:35
Filters by time range:
Expands to:
Source: public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:36-39
Groups time into buckets:
PostgreSQL expands to:
Source: public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:44-48
Groups and aliases as time:
Source: public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:56-66

Macro Value Functions

Macros that return values for custom conditionals: MySQL:
  • $__timeFrom()FROM_UNIXTIME(1492750877)
  • $__timeTo()FROM_UNIXTIME(1492750877)
  • $__unixEpochFrom()1492750877
  • $__unixEpochTo()1492750877
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:79-86
PostgreSQL:
  • $__timeFrom()'2017-04-21T05:01:17Z'
  • $__timeTo()'2017-04-21T05:01:17Z'
  • $__unixEpochFrom()1492750877
  • $__unixEpochTo()1492750877
Source: public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx:68-76

Query Examples

Time Series Example

MySQL:
Source: public/app/plugins/datasource/mysql/CheatSheet.tsx:56-76
PostgreSQL:

Multiple Series

Use the metric column to create multiple series:
Creates one series per endpoint.

Multiple Values

Return multiple value columns:
The metric column is used as a prefix: server-01 cpu, server-01 memory.

Table Query

Displays as a table in Grafana.

Aggregation by Label

Template Variables

Query Variables

Populate variables from query results: MySQL:
PostgreSQL:

Multi-Value Variables

Use IN clause with multi-value variables:

Variable with Filters

Performance Optimization

Use Indexes

Create indexes on time columns and filter columns:

Limit Time Range

Always use time filters to reduce query scope:

Use Connection Pooling

Configure appropriate connection pool sizes:

Aggregate at Database

Let the database do aggregations:

TimescaleDB Support (PostgreSQL)

For PostgreSQL with TimescaleDB:

Enable TimescaleDB

Check “TimescaleDB” in data source settings for optimized time-series queries.

Hypertable Queries

Continuous Aggregates

Troubleshooting

  • Verify host and port are correct
  • Check database firewall rules allow Grafana IP
  • Confirm database is running: systemctl status mysql / postgresql
  • Test connection from Grafana server: mysql -h host -u user -p
  • Review database logs for connection errors
  • Ensure query returns column named time or time_sec
  • Verify time values are in UTC
  • Check time range includes data: SELECT MIN(time), MAX(time) FROM table
  • Confirm numeric value columns exist
  • Results must be ordered by time: ORDER BY time
  • Add indexes on filtered columns
  • Reduce time range
  • Use LIMIT clause for testing
  • Check database slow query log
  • Increase query timeout in database config
  • Verify query returns results in database client
  • Check variable query syntax
  • Review Grafana server logs for query errors
  • Ensure proper permissions for user

Best Practices

  1. Always filter by time: Use $__timeFilter() in WHERE clause
  2. Create proper indexes: Index time columns and frequently filtered fields
  3. Use macros: Leverage Grafana macros for time operations
  4. Limit result sets: Use LIMIT for table queries
  5. Use connection pooling: Configure appropriate pool sizes
  6. Aggregate in database: Use GROUP BY instead of post-processing
  7. Order results by time: Required for time series visualization
  8. Monitor database performance: Watch for slow queries and optimize

Security Considerations

  • Use read-only database users for Grafana
  • Grant SELECT permission only
  • Never use root/admin database accounts
  • Use SSL/TLS for database connections in production
  • Regularly rotate database passwords

Further Reading