react
+
+
+
--
+
&
$
+
php
torch
py
dynamo
+
surrealdb
mxnet
+
travis
->
||
express
julia
aurelia
+
fauna
bundler
*
+
netlify
wsl
gentoo
+
+
esbuild
+
+
+
tls
+
+
+
+
lua
grafana
+
rider
groovy
babel
+
symfony
+
#
+
_
axum
netlify
macos
c#
xml
+
packer
+
+
_
+
tf
+
arch
+
lit
py
+
+
+
clickhouse
+
express
unix
+
ts
haskell
+
+
+
+
c++
bash
symfony
+
Back to Blog
📊 Database Performance Monitoring: Complete AlmaLinux MySQL & PostgreSQL Optimization Guide
Database Monitoring MySQL Optimization PostgreSQL Tuning

📊 Database Performance Monitoring: Complete AlmaLinux MySQL & PostgreSQL Optimization Guide

Published Sep 14, 2025

Master database performance monitoring on AlmaLinux with comprehensive MySQL and PostgreSQL tuning techniques. Learn query optimization, indexing strategies, and monitoring tools for maximum database speed.

14 min read
0 views
Table of Contents

📊 Database Performance Monitoring: Complete AlmaLinux MySQL & PostgreSQL Optimization Guide

Ready to supercharge your database performance? ⚡ Today we’ll learn how to monitor, analyze, and optimize both MySQL and PostgreSQL databases on AlmaLinux! From query optimization to index tuning, we’ll make your databases lightning fast! 🚀

🤔 Why is Database Performance Monitoring Important?

Database monitoring brings massive improvements:

  • 📌 Faster application response - Queries execute in milliseconds instead of seconds
  • 🔧 Better user experience - Applications feel snappy and responsive
  • 🚀 Higher concurrent users - Handle more database connections efficiently
  • 🔐 Proactive problem detection - Catch issues before they affect users
  • Optimal resource usage - Maximize server performance and reduce costs

🎯 What You Need

Before monitoring your database performance:

  • ✅ AlmaLinux 9 system with MySQL or PostgreSQL installed
  • ✅ Root or database administrator access
  • ✅ Basic understanding of SQL and database concepts
  • ✅ Database monitoring tools (we’ll install these!)

📝 Step 1: Install Database Monitoring Tools

Let’s set up comprehensive monitoring tools! 🔍

Install MySQL/MariaDB Monitoring Tools

# Install MySQL/MariaDB and monitoring utilities
sudo dnf install -y mysql mysql-server mytop

# Install additional performance tools
sudo dnf install -y percona-toolkit sysbench

# Start and enable MySQL
sudo systemctl start mysqld
sudo systemctl enable mysqld

# Secure MySQL installation
sudo mysql_secure_installation

Install PostgreSQL Monitoring Tools

# Install PostgreSQL and performance tools
sudo dnf install -y postgresql postgresql-server postgresql-contrib

# Install additional monitoring utilities
sudo dnf install -y pgbadger pg_top

# Initialize and start PostgreSQL
sudo postgresql-setup --initdb
sudo systemctl start postgresql
sudo systemctl enable postgresql

Install Universal Database Monitoring Tools

# Install system monitoring tools
sudo dnf install -y htop iotop nethogs sysstat

# Install database benchmarking tools
sudo dnf install -y sysbench pgbench

# Enable system statistics collection
sudo systemctl enable sysstat
sudo systemctl start sysstat

Pro tip: 💡 Having multiple monitoring tools gives you different perspectives on database performance!

🔧 Step 2: Configure MySQL/MariaDB Performance Monitoring

Enable detailed MySQL performance monitoring:

Enable MySQL Performance Schema

# Configure MySQL performance monitoring
sudo tee -a /etc/my.cnf.d/performance.cnf << 'EOF'
[mysqld]
# Enable Performance Schema
performance_schema = ON
performance-schema-consumer-events-statements-current = ON
performance-schema-consumer-events-statements-history = ON
performance-schema-consumer-events-statements-history-long = ON

# Enable slow query log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

# Enable general query log (temporarily for analysis)
general_log = 1
general_log_file = /var/log/mysql/general.log

# Binary logging for replication monitoring
log-bin = mysql-bin
binlog_format = ROW

# InnoDB monitoring
innodb_monitor_enable = all
EOF

# Create log directory
sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql

# Restart MySQL to apply changes
sudo systemctl restart mysqld

Configure MySQL Performance Tuning

# Optimize MySQL configuration for performance
sudo tee -a /etc/my.cnf.d/optimization.cnf << 'EOF'
[mysqld]
# Memory settings
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
query_cache_size = 128M
query_cache_type = 1

# Connection settings
max_connections = 500
thread_cache_size = 50
table_open_cache = 4000

# InnoDB optimization
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
EOF

sudo systemctl restart mysqld

Monitor MySQL Performance

# Real-time MySQL monitoring with mytop
mytop -u root -p

# Check MySQL status variables
mysql -u root -p -e "SHOW STATUS LIKE '%slow%';"
mysql -u root -p -e "SHOW STATUS LIKE '%connection%';"

# Analyze slow queries
sudo mysqldumpslow /var/log/mysql/slow.log

# Check InnoDB status
mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G"

🌟 Step 3: Configure PostgreSQL Performance Monitoring

Set up comprehensive PostgreSQL monitoring:

Enable PostgreSQL Query Logging

# Configure PostgreSQL for performance monitoring
sudo -u postgres psql << 'EOF'
-- Enable query logging
ALTER SYSTEM SET log_statement = 'all';
ALTER SYSTEM SET log_min_duration_statement = 1000; -- Log queries > 1 second
ALTER SYSTEM SET log_checkpoints = on;
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
ALTER SYSTEM SET log_lock_waits = on;
ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ';

-- Reload configuration
SELECT pg_reload_conf();
EOF

# Configure PostgreSQL performance settings
sudo -u postgres psql << 'EOF'
-- Memory settings
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
ALTER SYSTEM SET maintenance_work_mem = '64MB';
ALTER SYSTEM SET work_mem = '4MB';

-- Checkpoint settings
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET wal_buffers = '16MB';

-- Reload configuration
SELECT pg_reload_conf();
EOF

sudo systemctl restart postgresql

Install PostgreSQL Extensions for Monitoring

# Enable pg_stat_statements extension
sudo -u postgres psql << 'EOF'
-- Create extension for query statistics
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- Check if extension is installed
\dx
EOF

# Configure auto_explain for automatic query plan logging
sudo -u postgres psql << 'EOF'
-- Load auto_explain module
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements,auto_explain';
ALTER SYSTEM SET auto_explain.log_min_duration = 1000;
ALTER SYSTEM SET auto_explain.log_analyze = true;
ALTER SYSTEM SET auto_explain.log_buffers = true;

SELECT pg_reload_conf();
EOF

sudo systemctl restart postgresql

Monitor PostgreSQL Performance

# Real-time PostgreSQL monitoring
pg_top

# Check database activity
sudo -u postgres psql -c "SELECT * FROM pg_stat_activity WHERE state = 'active';"

# View query statistics
sudo -u postgres psql -c "SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;"

# Check database statistics
sudo -u postgres psql -c "SELECT * FROM pg_stat_database;"

What happens: 🔄

  • Query logging captures slow and problematic queries
  • Performance schema provides detailed execution statistics
  • Extensions enable advanced monitoring capabilities
  • Real-time tools show current database activity

✅ Step 4: Set Up Automated Performance Monitoring

Create automated monitoring and alerting:

# Create database performance monitoring script
sudo tee /usr/local/bin/db-monitor.sh << 'EOF'
#!/bin/bash

# Database performance monitoring script
LOG_FILE="/var/log/db-performance.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Database Performance Check" >> $LOG_FILE

# MySQL monitoring (if installed)
if systemctl is-active --quiet mysqld; then
    echo "=== MySQL Status ===" >> $LOG_FILE
    mysql -u root -e "SHOW STATUS LIKE 'Threads_connected';" >> $LOG_FILE 2>&1
    mysql -u root -e "SHOW STATUS LIKE 'Queries';" >> $LOG_FILE 2>&1
    mysql -u root -e "SHOW STATUS LIKE 'Slow_queries';" >> $LOG_FILE 2>&1
fi

# PostgreSQL monitoring (if installed)  
if systemctl is-active --quiet postgresql; then
    echo "=== PostgreSQL Status ===" >> $LOG_FILE
    sudo -u postgres psql -t -c "SELECT count(*) FROM pg_stat_activity;" >> $LOG_FILE 2>&1
    sudo -u postgres psql -t -c "SELECT sum(numbackends) FROM pg_stat_database;" >> $LOG_FILE 2>&1
fi

# System resources
echo "=== System Resources ===" >> $LOG_FILE
free -h >> $LOG_FILE
iostat -x 1 1 >> $LOG_FILE

echo "----------------------------------------" >> $LOG_FILE
EOF

chmod +x /usr/local/bin/db-monitor.sh

# Create systemd timer for regular monitoring
sudo tee /etc/systemd/system/db-monitor.timer << 'EOF'
[Unit]
Description=Database Performance Monitoring
Requires=db-monitor.service

[Timer]
OnCalendar=*:0/5
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo tee /etc/systemd/system/db-monitor.service << 'EOF'
[Unit]
Description=Database Performance Monitor
After=mysqld.service postgresql.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/db-monitor.sh
EOF

# Enable monitoring timer
sudo systemctl enable db-monitor.timer
sudo systemctl start db-monitor.timer

Good results show:

Active connections: 25
Query execution time: avg 50ms
Cache hit ratio: 95%
Slow queries: 2 in last hour

🎮 Quick Examples

Example 1: MySQL Performance Analysis 🎯

# Complete MySQL performance analysis
mysql -u root -p << 'EOF'
-- Check current connections and threads
SHOW STATUS LIKE '%thread%';
SHOW STATUS LIKE '%connection%';

-- Analyze query cache performance
SHOW STATUS LIKE '%qcache%';

-- Check InnoDB buffer pool efficiency
SHOW STATUS LIKE '%innodb_buffer_pool%';

-- Find long-running queries
SELECT * FROM information_schema.PROCESSLIST 
WHERE COMMAND != 'Sleep' ORDER BY TIME DESC;

-- Top 10 slowest queries from performance schema
SELECT sql_text, count_star, avg_timer_wait/1000000000 as avg_seconds
FROM performance_schema.events_statements_summary_by_digest 
ORDER BY avg_timer_wait DESC LIMIT 10;
EOF

# Analyze slow query log
sudo mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

Example 2: PostgreSQL Performance Dashboard 🔄

# PostgreSQL comprehensive performance check
sudo -u postgres psql << 'EOF'
-- Current database activity
SELECT pid, usename, application_name, state, query_start, query 
FROM pg_stat_activity 
WHERE state = 'active' AND pid <> pg_backend_pid();

-- Database statistics
SELECT datname, numbackends, xact_commit, xact_rollback, 
       blks_read, blks_hit, 
       round(blks_hit*100.0/(blks_hit+blks_read),2) as cache_hit_ratio
FROM pg_stat_database WHERE datname NOT IN ('template0','template1');

-- Table statistics
SELECT schemaname, tablename, seq_scan, seq_tup_read, 
       idx_scan, idx_tup_fetch, n_tup_ins, n_tup_upd, n_tup_del
FROM pg_stat_user_tables ORDER BY seq_scan DESC LIMIT 10;

-- Index usage
SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes ORDER BY idx_scan DESC LIMIT 10;
EOF

# Generate PostgreSQL report with pgbadger
sudo pgbadger /var/lib/pgsql/data/log/postgresql-*.log -o /tmp/pg-report.html

Example 3: Database Load Testing and Monitoring ⚡

# MySQL load testing with sysbench
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root \
--mysql-password=yourpassword --mysql-db=testdb --tables=10 --table_size=100000 \
oltp_read_write prepare

# Run load test while monitoring
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root \
--mysql-password=yourpassword --mysql-db=testdb --tables=10 --table_size=100000 \
--threads=10 --time=300 oltp_read_write run

# Monitor during test (in another terminal)
mytop -u root -p
watch -n 2 'mysql -u root -p -e "SHOW STATUS LIKE \"Threads_running\";"'

🚨 Fix Common Problems

Problem 1: Database Running Slow Under Load ❌

Symptoms:

  • Query response times increase significantly
  • Applications timeout waiting for database
  • High CPU usage on database server

Try this:

# Identify slow queries immediately
mysql -u root -p -e "SHOW PROCESSLIST;" | grep -v Sleep

# For PostgreSQL
sudo -u postgres psql -c "SELECT pid, now() - pg_stat_activity.query_start AS duration, query 
FROM pg_stat_activity WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';"

# Increase key buffer and optimize
echo "key_buffer_size = 512M
innodb_buffer_pool_size = 2G" | sudo tee -a /etc/my.cnf.d/optimization.cnf

sudo systemctl restart mysqld

Problem 2: High Number of Slow Queries ❌

Try this:

# Analyze and fix slow queries
sudo mysqldumpslow -s t -t 5 /var/log/mysql/slow.log

# Check for missing indexes
mysql -u root -p << 'EOF'
SELECT table_schema, table_name, non_unique, index_name, column_name
FROM information_schema.statistics 
WHERE table_schema = 'your_database' 
ORDER BY table_name, index_name;
EOF

# Add indexes to frequently queried columns
mysql -u root -p -e "CREATE INDEX idx_column_name ON your_table(column_name);"

Problem 3: Database Connections Exhausted ❌

Check these things:

# Check current connections
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"

# Increase connection limit
echo "max_connections = 1000" | sudo tee -a /etc/my.cnf.d/connections.cnf

# For PostgreSQL
sudo -u postgres psql -c "ALTER SYSTEM SET max_connections = 200; SELECT pg_reload_conf();"

# Check for connection leaks in applications
netstat -an | grep :3306 | wc -l

📋 Simple Commands Summary

TaskCommand
👀 MySQL processesmysql -u root -p -e "SHOW PROCESSLIST;"
🔧 PostgreSQL activitysudo -u postgres psql -c "SELECT * FROM pg_stat_activity;"
🚀 MySQL slow queriessudo mysqldumpslow /var/log/mysql/slow.log
🛑 PostgreSQL statssudo -u postgres psql -c "SELECT * FROM pg_stat_statements;"
♻️ Monitor MySQLmytop -u root -p
📊 Monitor PostgreSQLpg_top
✅ Database connectionsnetstat -an | grep :3306

💡 Tips for Success

  1. Monitor continuously 🌟 - Set up automated monitoring and alerting
  2. Focus on slow queries 🔐 - Identify and optimize the worst-performing queries first
  3. Index strategically 🚀 - Add indexes based on actual query patterns
  4. Regular maintenance 📝 - Run ANALYZE/OPTIMIZE TABLE regularly
  5. Capacity planning 🔄 - Monitor trends and plan for growth

🏆 What You Learned

Congratulations! Now you can:

  • ✅ Set up comprehensive database performance monitoring
  • ✅ Configure MySQL and PostgreSQL for optimal monitoring
  • ✅ Identify and analyze slow queries and performance bottlenecks
  • ✅ Implement automated monitoring and alerting systems
  • ✅ Troubleshoot and resolve common database performance issues

🎯 Why This Matters

Now your databases deliver:

  • 🚀 Lightning-fast query response with optimized configurations and indexes
  • 🔐 Proactive problem detection with comprehensive monitoring
  • 📊 Optimal resource usage through continuous performance analysis
  • High availability with early warning systems and automatic optimization

Remember: Database performance monitoring is an ongoing process - regular analysis and optimization keep your databases running at peak performance! ⭐

You’ve mastered database performance monitoring! Your MySQL and PostgreSQL databases will now run at maximum efficiency with comprehensive monitoring and optimization! 🙌