MySQL¶
Connect HolmesGPT to MySQL databases to analyze query performance, investigate slow queries, optimize indexes, examine database health, and read data for troubleshooting.
You can configure multiple MySQL instances with different names (e.g., orders-rds, analytics-mysql, staging-mysql).
Creating a Read-Only User¶
-- Create user
CREATE USER 'holmes_readonly'@'%' IDENTIFIED BY 'your_secure_password';
-- Grant read-only permissions
GRANT SELECT, SHOW VIEW, PROCESS ON *.* TO 'holmes_readonly'@'%';
-- Grant access to performance schema
GRANT SELECT ON performance_schema.* TO 'holmes_readonly'@'%';
GRANT SELECT ON information_schema.* TO 'holmes_readonly'@'%';
FLUSH PRIVILEGES;
For specific database only:
CREATE USER 'holmes_readonly'@'%' IDENTIFIED BY 'your_secure_password';
GRANT SELECT, SHOW VIEW ON your_database.* TO 'holmes_readonly'@'%';
GRANT SELECT ON performance_schema.* TO 'holmes_readonly'@'%';
GRANT SELECT ON information_schema.* TO 'holmes_readonly'@'%';
GRANT PROCESS ON *.* TO 'holmes_readonly'@'%';
FLUSH PRIVILEGES;
Configuration¶
~/.holmes/config.yaml:
toolsets:
orders-mysql:
type: database
config:
connection_url: "mysql+pymysql://holmes_readonly:your_secure_password@mysql.example.com:3306/orders"
llm_instructions: "Orders database with customer and product data"
analytics-mysql:
type: database
config:
connection_url: "mysql+pymysql://analyst:pass@analytics-mysql.internal:3306/analytics"
llm_instructions: "Analytics database for reporting queries"
Using environment variables:
Connection URL format:
Step 1: Create secret with credentials
kubectl create secret generic mysql-credentials \
--from-literal=url='mysql+pymysql://holmes_readonly:your_secure_password@mysql.example.com:3306/orders' \
-n holmes
Step 2: Configure in values.yaml
additionalEnvVars:
- name: MYSQL_URL
valueFrom:
secretKeyRef:
name: mysql-credentials
key: url
toolsets:
orders-mysql:
type: database
config:
connection_url: "{{ env.MYSQL_URL }}"
llm_instructions: "Orders database with customer and product data"
Multiple instances:
additionalEnvVars:
- name: ORDERS_MYSQL_URL
valueFrom:
secretKeyRef:
name: mysql-orders
key: url
- name: ANALYTICS_MYSQL_URL
valueFrom:
secretKeyRef:
name: mysql-analytics
key: url
toolsets:
orders-mysql:
type: database
config:
connection_url: "{{ env.ORDERS_MYSQL_URL }}"
analytics-mysql:
type: database
config:
connection_url: "{{ env.ANALYTICS_MYSQL_URL }}"
Step 1: Create secret with credentials
kubectl create secret generic mysql-credentials \
--from-literal=url='mysql+pymysql://holmes_readonly:your_secure_password@mysql.example.com:3306/orders' \
-n default
Step 2: Configure in values.yaml
holmes:
additionalEnvVars:
- name: MYSQL_URL
valueFrom:
secretKeyRef:
name: mysql-credentials
key: url
toolsets:
orders-mysql:
type: database
config:
connection_url: "{{ env.MYSQL_URL }}"
llm_instructions: "Orders database with customer and product data"
Multiple instances:
holmes:
additionalEnvVars:
- name: ORDERS_MYSQL_URL
valueFrom:
secretKeyRef:
name: mysql-orders
key: url
- name: ANALYTICS_MYSQL_URL
valueFrom:
secretKeyRef:
name: mysql-analytics
key: url
toolsets:
orders-mysql:
type: database
config:
connection_url: "{{ env.ORDERS_MYSQL_URL }}"
analytics-mysql:
type: database
config:
connection_url: "{{ env.ANALYTICS_MYSQL_URL }}"
Configuration Options¶
- connection_url (required): MySQL connection URL
- read_only (default:
true): Only allow SELECT/SHOW/DESCRIBE/EXPLAIN/WITH statements - verify_ssl (default:
true): Verify SSL certificates - max_rows (default:
200): Maximum rows to return (1-10000) - llm_instructions: Context about this database