{"slug":"databases-mysql","title":"MySQL Database Instances","description":"Complete guide to creating and managing MySQL database instances on DanubeData.","section":"Features","url":"https://docs.danubedata.ro/databases-mysql","markdown_url":"https://docs.danubedata.ro/databases-mysql.md","breadcrumbs":[{"title":"Features","slug":null},{"title":"Databases","slug":"databases-overview"},{"title":"MySQL","slug":"databases-mysql"}],"headings":[{"level":1,"title":"MySQL Database Instances","id":"mysql-database-instances"},{"level":2,"title":"Overview","id":"overview"},{"level":2,"title":"Supported Versions","id":"supported-versions"},{"level":3,"title":"Version Selection","id":"version-selection"},{"level":3,"title":"Upgrading Versions","id":"upgrading-versions"},{"level":2,"title":"Creating a MySQL Instance","id":"creating-a-mysql-instance"},{"level":3,"title":"Step-by-Step","id":"step-by-step"},{"level":3,"title":"Configuration Tips","id":"configuration-tips"},{"level":2,"title":"Connecting to MySQL","id":"connecting-to-mysql"},{"level":3,"title":"Connection Information","id":"connection-information"},{"level":3,"title":"MySQL Command Line","id":"mysql-command-line"},{"level":3,"title":"Connection String","id":"connection-string"},{"level":3,"title":"From Application","id":"from-application"},{"level":2,"title":"Database Management","id":"database-management"},{"level":3,"title":"Create Databases","id":"create-databases"},{"level":3,"title":"Create Users","id":"create-users"},{"level":3,"title":"Create Tables","id":"create-tables"},{"level":2,"title":"Performance Optimization","id":"performance-optimization"},{"level":3,"title":"Indexes","id":"indexes"},{"level":3,"title":"Query Optimization","id":"query-optimization"},{"level":3,"title":"Slow Query Log","id":"slow-query-log"},{"level":2,"title":"Monitoring & Metrics","id":"monitoring-metrics"},{"level":3,"title":"Key Metrics","id":"key-metrics"},{"level":3,"title":"Check Status","id":"check-status"},{"level":3,"title":"Performance Schema","id":"performance-schema"},{"level":2,"title":"Backup & Recovery","id":"backup-recovery"},{"level":3,"title":"Automated Backups","id":"automated-backups"},{"level":3,"title":"Manual Snapshots","id":"manual-snapshots"},{"level":3,"title":"Export Database","id":"export-database"},{"level":3,"title":"Import Database","id":"import-database"},{"level":2,"title":"Read Replicas","id":"read-replicas"},{"level":3,"title":"Creating Replicas","id":"creating-replicas"},{"level":3,"title":"Benefits","id":"benefits"},{"level":3,"title":"Using Replicas","id":"using-replicas"},{"level":3,"title":"Monitor Replication","id":"monitor-replication"},{"level":2,"title":"Parameter Groups","id":"parameter-groups"},{"level":3,"title":"Common Parameters","id":"common-parameters"},{"level":2,"title":"Security","id":"security"},{"level":3,"title":"SSL/TLS Connections","id":"ssltls-connections"},{"level":4,"title":"MySQL CLI with SSL","id":"mysql-cli-with-ssl"},{"level":4,"title":"Application SSL Connections","id":"application-ssl-connections"},{"level":4,"title":"Why Skip Hostname Verification?","id":"why-skip-hostname-verification"},{"level":4,"title":"SSL Certificate Locations","id":"ssl-certificate-locations"},{"level":4,"title":"Verify SSL Connection","id":"verify-ssl-connection"},{"level":3,"title":"User Permissions","id":"user-permissions"},{"level":3,"title":"Firewall Rules","id":"firewall-rules"},{"level":2,"title":"Troubleshooting","id":"troubleshooting"},{"level":3,"title":"Connection Issues","id":"connection-issues"},{"level":3,"title":"Performance Issues","id":"performance-issues"},{"level":3,"title":"Data Issues","id":"data-issues"},{"level":2,"title":"Best Practices","id":"best-practices"},{"level":3,"title":"Schema Design","id":"schema-design"},{"level":3,"title":"Query Optimization","id":"query-optimization"},{"level":3,"title":"Connection Management","id":"connection-management"},{"level":3,"title":"Security","id":"security"},{"level":3,"title":"Monitoring","id":"monitoring"},{"level":2,"title":"Next Steps","id":"next-steps"}],"format":"markdown","word_count":2342,"content":"# MySQL Database Instances\n\nComplete guide to creating and managing MySQL database instances on DanubeData.\n\n## Overview\n\nMySQL is the world's most popular open-source relational database. DanubeData provides fully managed MySQL instances with:\n\n- **Automated backups** - Daily backups with 3-day retention\n- **High availability** - Read replicas and failover\n- **Performance monitoring** - Real-time metrics and alerts\n- **Easy scaling** - Vertical scaling, read replicas, and optional [storage autoscaling](https://docs.danubedata.ro/databases-overview#storage-autoscaling)\n- **In-place upgrades** - Move to a newer MySQL version without recreating\n- **Security** - Encrypted connections and data\n\n## Supported Versions\n\n- **MySQL 9.0** - Latest LTS, recommended\n- **MySQL 9.1** - Innovation release\n- **MySQL 8.4** - Previous LTS, stable\n- **MySQL 8.0** - Previous LTS, stable\n\n### Version Selection\n\n**MySQL 9.0** (Recommended):\n- Latest LTS features\n- Best performance\n- Active development\n- Long-term support\n\n**MySQL 9.1** (Innovation):\n- Newest features, shorter support window\n\n**MySQL 8.4**:\n- Mature and stable\n- Wide compatibility\n\n**MySQL 8.0**:\n- Mature and stable\n- Wide compatibility\n- Extended support\n\n### Upgrading Versions\n\nYou can move an existing MySQL instance to a newer version in place — no need to recreate it or dump and reload:\n\n1. Open the **Updates** tab on your instance\n2. Choose an available target version\n3. Start the upgrade — a snapshot is taken automatically first, so you can roll back if needed\n4. Track progress live; the instance shows an **Updating** status while it runs\n\nUpgrades follow supported paths (8.0 → 8.4 → 9.0/9.1). Take a manual snapshot first if you want an extra restore point.\n\n## Creating a MySQL Instance\n\n### Step-by-Step\n\n1. Navigate to **Databases** in the main menu\n2. Click **Create Database Instance**\n3. Select **MySQL** as the engine\n4. Choose version (9.0 recommended)\n5. Select resource profile\n6. Configure settings:\n   - Instance name\n   - Database name\n   - Master username\n   - Master password (auto-generated or custom)\n   - Region\n7. Optional: Attach parameter group\n8. Optional: Attach firewall\n9. Click **Create Database**\n\n### Configuration Tips\n\n**Instance Name**:\n- Use descriptive names: `prod-mysql-users`, `staging-mysql-orders`\n- Include environment and purpose\n- Use lowercase and hyphens\n\n**Database Name**:\n- Initial database name (default: `danubedata`)\n- Create additional databases later\n- Use meaningful names\n\n**Master Username**:\n- Default: `admin`\n- Cannot be `root`, `mysql`, or `admin` in some versions\n- Use strong usernames for security\n\n**Master Password**:\n- Auto-generated: Strong, random password\n- Custom: Minimum 8 characters, mix of types\n- **Save it immediately** - shown only once!\n\n## Connecting to MySQL\n\n### Connection Information\n\nAfter creation, you'll receive:\n- **Endpoint**: `mysql-abc123.danubedata.ro`\n- **Port**: `3306`\n- **Username**: Your master username\n- **Password**: Master password (saved during creation)\n\n### MySQL Command Line\n\n```bash\nmysql -h mysql-abc123.danubedata.ro \\\n      -P 3306 \\\n      -u admin \\\n      -p\n\n# Enter password when prompted\n```\n\n### Connection String\n\n```\nmysql://admin:password@mysql-abc123.danubedata.ro:3306/database_name\n```\n\n### From Application\n\n**PHP (PDO)**:\n```php\n<?php\n$host = 'mysql-abc123.danubedata.ro';\n$db   = 'database_name';\n$user = 'admin';\n$pass = 'your_password';\n$charset = 'utf8mb4';\n\n$dsn = \"mysql:host=$host;dbname=$db;charset=$charset;port=3306\";\n$options = [\n    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,\n    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,\n    PDO::ATTR_EMULATE_PREPARES   => false,\n];\n\ntry {\n    $pdo = new PDO($dsn, $user, $pass, $options);\n} catch (\\PDOException $e) {\n    throw new \\PDOException($e->getMessage(), (int)$e->getCode());\n}\n?>\n```\n\n**Python (mysql-connector)**:\n```python\nimport mysql.connector\n\nconfig = {\n    'host': 'mysql-abc123.danubedata.ro',\n    'port': 3306,\n    'user': 'admin',\n    'password': 'your_password',\n    'database': 'database_name'\n}\n\nconn = mysql.connector.connect(**config)\ncursor = conn.cursor()\n\ncursor.execute(\"SELECT VERSION()\")\nversion = cursor.fetchone()\nprint(f\"MySQL version: {version[0]}\")\n\ncursor.close()\nconn.close()\n```\n\n**Node.js (mysql2)**:\n```javascript\nconst mysql = require('mysql2');\n\nconst connection = mysql.createConnection({\n  host: 'mysql-abc123.danubedata.ro',\n  port: 3306,\n  user: 'admin',\n  password: 'your_password',\n  database: 'database_name'\n});\n\nconnection.connect((err) => {\n  if (err) {\n    console.error('Error connecting:', err);\n    return;\n  }\n  console.log('Connected to MySQL');\n});\n\n// Query\nconnection.query('SELECT 1 + 1 AS solution', (err, results) => {\n  if (err) throw err;\n  console.log('Solution:', results[0].solution);\n});\n\nconnection.end();\n```\n\n**Java (JDBC)**:\n```java\nimport java.sql.*;\n\npublic class MySQLExample {\n    public static void main(String[] args) {\n        String url = \"jdbc:mysql://mysql-abc123.danubedata.ro:3306/database_name\";\n        String user = \"admin\";\n        String password = \"your_password\";\n        \n        try {\n            Connection conn = DriverManager.getConnection(url, user, password);\n            System.out.println(\"Connected to MySQL\");\n            \n            Statement stmt = conn.createStatement();\n            ResultSet rs = stmt.executeQuery(\"SELECT VERSION()\");\n            \n            while (rs.next()) {\n                System.out.println(\"MySQL version: \" + rs.getString(1));\n            }\n            \n            conn.close();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n}\n```\n\n## Database Management\n\n### Create Databases\n\n```sql\n-- Create database\nCREATE DATABASE myapp_production\n  CHARACTER SET utf8mb4\n  COLLATE utf8mb4_unicode_ci;\n\n-- Use database\nUSE myapp_production;\n\n-- Show databases\nSHOW DATABASES;\n\n-- Drop database\nDROP DATABASE old_database;\n```\n\n### Create Users\n\n```sql\n-- Create user\nCREATE USER 'appuser'@'%' IDENTIFIED BY 'strong_password';\n\n-- Grant privileges\nGRANT ALL PRIVILEGES ON myapp_production.* TO 'appuser'@'%';\n\n-- Grant specific privileges\nGRANT SELECT, INSERT, UPDATE, DELETE ON myapp_production.* TO 'readonly'@'%';\n\n-- Apply changes\nFLUSH PRIVILEGES;\n\n-- Show users\nSELECT User, Host FROM mysql.user;\n\n-- Drop user\nDROP USER 'olduser'@'%';\n```\n\n### Create Tables\n\n```sql\n-- Create table with InnoDB (default)\nCREATE TABLE users (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    username VARCHAR(50) NOT NULL UNIQUE,\n    email VARCHAR(100) NOT NULL UNIQUE,\n    password_hash VARCHAR(255) NOT NULL,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    INDEX idx_email (email),\n    INDEX idx_username (username)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n-- Show tables\nSHOW TABLES;\n\n-- Describe table structure\nDESCRIBE users;\n\n-- Show create statement\nSHOW CREATE TABLE users;\n```\n\n## Performance Optimization\n\n### Indexes\n\n```sql\n-- Add index\nCREATE INDEX idx_created_at ON users(created_at);\n\n-- Add composite index\nCREATE INDEX idx_status_date ON orders(status, created_at);\n\n-- Add unique index\nCREATE UNIQUE INDEX idx_email_unique ON users(email);\n\n-- Show indexes\nSHOW INDEX FROM users;\n\n-- Drop index\nDROP INDEX idx_old_index ON users;\n```\n\n### Query Optimization\n\n```sql\n-- Explain query plan\nEXPLAIN SELECT * FROM users WHERE email = 'user@example.com';\n\n-- Analyze table\nANALYZE TABLE users;\n\n-- Optimize table\nOPTIMIZE TABLE users;\n\n-- Check table\nCHECK TABLE users;\n\n-- Repair table (if needed)\nREPAIR TABLE users;\n```\n\n### Slow Query Log\n\n```sql\n-- Enable slow query log\nSET GLOBAL slow_query_log = 'ON';\nSET GLOBAL long_query_time = 2;  -- Queries > 2 seconds\n\n-- Check slow query log status\nSHOW VARIABLES LIKE 'slow_query%';\n\n-- View slow queries\nSELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;\n```\n\n## Monitoring & Metrics\n\n### Key Metrics\n\nMonitor in the dashboard:\n- **CPU Usage**: Database workload\n- **Memory Usage**: Buffer pool and caches\n- **Connections**: Active connections\n- **Queries/Second**: Throughput\n- **Replication Lag**: For replicas\n- **Slow Queries**: Performance issues\n\n### Check Status\n\n```sql\n-- Show status variables\nSHOW STATUS LIKE '%connection%';\nSHOW STATUS LIKE '%thread%';\nSHOW STATUS LIKE '%query%';\n\n-- Show processlist\nSHOW FULL PROCESSLIST;\n\n-- Show variables\nSHOW VARIABLES LIKE '%max_connections%';\nSHOW VARIABLES LIKE '%buffer_pool%';\n\n-- Engine status\nSHOW ENGINE INNODB STATUS\\G\n```\n\n### Performance Schema\n\n```sql\n-- Enable performance schema\nSET GLOBAL performance_schema = ON;\n\n-- Top queries by execution time\nSELECT \n    DIGEST_TEXT,\n    COUNT_STAR,\n    AVG_TIMER_WAIT/1000000000000 as avg_time_sec\nFROM performance_schema.events_statements_summary_by_digest\nORDER BY AVG_TIMER_WAIT DESC\nLIMIT 10;\n\n-- Table I/O\nSELECT \n    OBJECT_NAME,\n    COUNT_READ,\n    COUNT_WRITE\nFROM performance_schema.table_io_waits_summary_by_table\nORDER BY COUNT_READ + COUNT_WRITE DESC;\n```\n\n## Backup & Recovery\n\n### Automated Backups\n\n- **Frequency**: Daily at 2 AM UTC\n- **Retention**: 3 days\n- **Point-in-time recovery**: Yes\n- **No performance impact**: Backups from standby\n\n### Manual Snapshots\n\nCreate on-demand snapshots:\n\n1. Go to database instance page\n2. Click **Snapshots** tab\n3. Click **Create Snapshot**\n4. Enter name and description\n5. Click **Create**\n\n### Export Database\n\n```bash\n# Export entire database\nmysqldump -h mysql-abc123.danubedata.ro \\\n          -u admin \\\n          -p \\\n          database_name > backup.sql\n\n# Export specific tables\nmysqldump -h mysql-abc123.danubedata.ro \\\n          -u admin \\\n          -p \\\n          database_name table1 table2 > tables_backup.sql\n\n# Export with compression\nmysqldump -h mysql-abc123.danubedata.ro \\\n          -u admin \\\n          -p \\\n          database_name | gzip > backup.sql.gz\n\n# Export structure only (no data)\nmysqldump -h mysql-abc123.danubedata.ro \\\n          -u admin \\\n          -p \\\n          --no-data \\\n          database_name > structure.sql\n```\n\n### Import Database\n\n```bash\n# Import from backup\nmysql -h mysql-abc123.danubedata.ro \\\n      -u admin \\\n      -p \\\n      database_name < backup.sql\n\n# Import compressed backup\ngunzip < backup.sql.gz | mysql -h mysql-abc123.danubedata.ro \\\n                                -u admin \\\n                                -p \\\n                                database_name\n```\n\n## Read Replicas\n\n### Creating Replicas\n\n1. Go to database instance page\n2. Click **Add Replica**\n3. Select node and resource profile\n4. Click **Create Replica**\n\n### Benefits\n\n- **Read Scaling**: Offload SELECT queries\n- **Host Isolation**: Runs on a separate host in the same datacenter\n- **Reporting**: Run reports on replica\n- **Backup Source**: Take backups from replica\n\n### Using Replicas\n\n**Application Configuration**:\n```python\n# Primary (writes)\nPRIMARY_DB = {\n    'host': 'mysql-abc123.danubedata.ro',\n    'port': 3306,\n}\n\n# Replica (reads)\nREPLICA_DB = {\n    'host': 'mysql-abc123-replica.danubedata.ro',\n    'port': 3306,\n}\n\n# Write to primary\nwrite_conn = connect(PRIMARY_DB)\nwrite_conn.execute(\"INSERT INTO users ...\")\n\n# Read from replica\nread_conn = connect(REPLICA_DB)\nusers = read_conn.execute(\"SELECT * FROM users\").fetchall()\n```\n\n### Monitor Replication\n\n```sql\n-- On replica\nSHOW REPLICA STATUS\\G\n\n-- Check lag\nSELECT \n    TIMESTAMPDIFF(SECOND, last_applied_time, NOW()) AS lag_seconds\nFROM performance_schema.replication_applier_status_by_worker;\n```\n\n## Parameter Groups\n\nCustomize MySQL configuration:\n\n1. Navigate to **Parameter Groups**\n2. Click **Create Parameter Group**\n3. Select MySQL version\n4. Configure parameters\n5. Attach to database instance\n\n### Common Parameters\n\n| Parameter | Description | Recommended |\n|-----------|-------------|-------------|\n| `max_connections` | Maximum connections | 150-300 |\n| `innodb_buffer_pool_size` | InnoDB cache | 70% of RAM |\n| `query_cache_size` | Query cache | 0 (disabled in 8.0+) |\n| `slow_query_log` | Log slow queries | ON |\n| `long_query_time` | Slow query threshold | 2 seconds |\n| `max_allowed_packet` | Max packet size | 64M |\n\n## Security\n\n### SSL/TLS Connections\n\nAll database instances support encrypted SSL/TLS connections. Use encrypted connections for maximum security.\n\n#### MySQL CLI with SSL\n\n**Modern MySQL clients (5.7.11+) - Simple SSL**:\n```bash\n# Encrypted connection (skip hostname verification for internal traffic)\nmysql -h mysql-abc123.danubedata.ro \\\n      -u admin \\\n      -p \\\n      --ssl-mode=REQUIRED \\\n      --ssl-verify-server-cert=OFF\n```\n\n**Modern MySQL clients - Full SSL with Client Certificates**:\n```bash\n# Encrypted connection with full certificate authentication\nmysql -h mysql-abc123.danubedata.ro \\\n      -u admin \\\n      -p \\\n      --ssl-ca=/etc/database-certs/mysql-abc123-ca.pem \\\n      --ssl-cert=/etc/database-certs/mysql-abc123-client-cert.pem \\\n      --ssl-key=/etc/database-certs/mysql-abc123-client-key.pem\n```\n\n**Older MySQL clients (pre-5.7.11)**:\n```bash\n# Encrypted connection (legacy syntax)\nmysql -h mysql-abc123.danubedata.ro \\\n      -u admin \\\n      -p \\\n      --ssl \\\n      --ssl-verify-server-cert=0\n```\n\n**Check your MySQL client version**:\n```bash\nmysql --version\n```\n\n#### Application SSL Connections\n\n**PHP (PDO)**:\n```php\n$dsn = \"mysql:host=mysql-abc123.danubedata.ro;port=3306;dbname=mydb\";\n$options = [\n    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,\n    PDO::MYSQL_ATTR_SSL_CA => '/etc/database-certs/mysql-abc123-ca.pem',\n    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false, // Skip hostname verification\n];\n$pdo = new PDO($dsn, 'admin', $password, $options);\n```\n\n**Python (mysql-connector)**:\n```python\nimport mysql.connector\n\nconfig = {\n    'host': 'mysql-abc123.danubedata.ro',\n    'port': 3306,\n    'user': 'admin',\n    'password': 'your_password',\n    'database': 'mydb',\n    'ssl_ca': '/etc/database-certs/mysql-abc123-ca.pem',\n    'ssl_verify_cert': True,\n    'ssl_verify_identity': False  # Skip hostname verification\n}\nconn = mysql.connector.connect(**config)\n```\n\n**Node.js (mysql2)**:\n```javascript\nconst mysql = require('mysql2');\nconst fs = require('fs');\n\nconst connection = mysql.createConnection({\n  host: 'mysql-abc123.danubedata.ro',\n  port: 3306,\n  user: 'admin',\n  password: 'your_password',\n  database: 'mydb',\n  ssl: {\n    ca: fs.readFileSync('/etc/database-certs/mysql-abc123-ca.pem'),\n    rejectUnauthorized: false  // Skip hostname verification\n  }\n});\n```\n\n**Java (JDBC)**:\n```java\nString url = \"jdbc:mysql://mysql-abc123.danubedata.ro:3306/mydb\" +\n             \"?useSSL=true\" +\n             \"&trustCertificateKeyStoreUrl=file:///etc/database-certs/mysql-abc123-ca.pem\" +\n             \"&verifyServerCertificate=false\";\nConnection conn = DriverManager.getConnection(url, \"admin\", \"password\");\n```\n\n#### Why Skip Hostname Verification?\n\nMySQL auto-generates SSL certificates with generic names that don't match the actual hostname. This causes hostname verification to fail. By skipping hostname verification while still using SSL:\n\n- ✅ Connections are **encrypted** (TLS/SSL protects data in transit)\n- ✅ Safe for internal traffic (your private network provides network isolation)\n- ✅ Works immediately with auto-generated certificates\n- ⚠️ No hostname verification (but MITM attacks are unlikely in private networks)\n\n#### SSL Certificate Locations\n\nSSL certificates are automatically provisioned to VPS instances:\n- CA Certificate: `/etc/database-certs/{database-name}-ca.pem`\n- Client Certificate: `/etc/database-certs/{database-name}-client-cert.pem`\n- Client Key: `/etc/database-certs/{database-name}-client-key.pem`\n\nCertificates are automatically extracted when databases start and distributed to all team VPS instances.\n\n#### Verify SSL Connection\n\nCheck that SSL is active:\n```bash\nmysql -h mysql-abc123.danubedata.ro -u admin -p \\\n  --ssl-mode=REQUIRED --ssl-verify-server-cert=OFF \\\n  -e \"SHOW STATUS LIKE 'Ssl_cipher';\"\n```\n\nYou should see an SSL cipher like `TLS_AES_256_GCM_SHA384`.\n\n### User Permissions\n\nFollow least privilege:\n\n```sql\n-- Application user (read/write)\nCREATE USER 'app'@'%' IDENTIFIED BY 'strong_pass';\nGRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app'@'%';\n\n-- Read-only user (reporting)\nCREATE USER 'readonly'@'%' IDENTIFIED BY 'strong_pass';\nGRANT SELECT ON mydb.* TO 'readonly'@'%';\n\n-- Admin user (schema changes)\nCREATE USER 'dbadmin'@'%' IDENTIFIED BY 'strong_pass';\nGRANT ALL PRIVILEGES ON mydb.* TO 'dbadmin'@'%';\n\nFLUSH PRIVILEGES;\n```\n\n### Firewall Rules\n\nRestrict database access:\n\n1. Create firewall\n2. Add rules:\n   - Allow port 3306 from application servers only\n   - Deny from 0.0.0.0/0\n3. Attach to database instance\n\n## Troubleshooting\n\n### Connection Issues\n\n**Error: Can't connect**:\n```bash\n# Check firewall allows your IP\n# Check credentials\n# Verify endpoint and port\n\n# Test connection\ntelnet mysql-abc123.danubedata.ro 3306\n\n# Check from application server\nmysql -h mysql-abc123.danubedata.ro -u admin -p\n```\n\n**Error: Too many connections**:\n```sql\n-- Check current connections\nSHOW PROCESSLIST;\n\n-- Check max connections\nSHOW VARIABLES LIKE 'max_connections';\n\n-- Kill idle connections\nKILL <process_id>;\n\n-- Increase max_connections in parameter group\n```\n\n### Performance Issues\n\n**Slow queries**:\n```sql\n-- Find slow queries\nSELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;\n\n-- Missing indexes\nSHOW INDEX FROM your_table;\n\n-- Add indexes\nCREATE INDEX idx_column ON your_table(column);\n```\n\n**High CPU**:\n- Check for missing indexes\n- Optimize queries\n- Enable query cache (if MySQL 5.7)\n- Consider upgrading instance size\n\n**High memory**:\n- Tune `innodb_buffer_pool_size`\n- Check for memory leaks in queries\n- Optimize table structures\n\n### Data Issues\n\n**Recover deleted data**:\n- Restore from automated backup\n- Restore from snapshot\n- Use point-in-time recovery\n\n**Table corruption**:\n```sql\nCHECK TABLE your_table;\nREPAIR TABLE your_table;\n```\n\n## Best Practices\n\n### Schema Design\n1. Use InnoDB engine (default)\n2. Add appropriate indexes\n3. Use correct data types\n4. Normalize when needed\n5. Use foreign keys for referential integrity\n\n### Query Optimization\n1. Use EXPLAIN to analyze queries\n2. Add indexes for frequent queries\n3. Avoid SELECT *\n4. Use LIMIT for large result sets\n5. Batch INSERT/UPDATE operations\n\n### Connection Management\n1. Use connection pooling\n2. Close connections when done\n3. Set appropriate timeouts\n4. Monitor active connections\n\n### Security\n1. Use strong passwords\n2. Enable SSL/TLS\n3. Limit user permissions\n4. Use firewalls\n5. Regular security updates\n\n### Monitoring\n1. Monitor key metrics daily\n2. Set up alerts\n3. Review slow query log\n4. Check replication lag\n5. Monitor disk space\n\n## Next Steps\n\n- [Database Replicas](https://docs.danubedata.ro/databases-replicas)\n- [Parameter Groups](https://docs.danubedata.ro/databases-parameters)\n- [Database Backups](https://docs.danubedata.ro/databases-backups)\n- [PostgreSQL Guide](https://docs.danubedata.ro/databases-postgresql)\n\nNeed help? Contact support through the dashboard.\n\n","prev":{"title":"Databases","slug":"databases-overview","url":"https://docs.danubedata.ro/databases-overview","markdown_url":"https://docs.danubedata.ro/databases-overview.md","json_url":"https://docs.danubedata.ro/databases-overview.json"},"next":{"title":"PostgreSQL","slug":"databases-postgresql","url":"https://docs.danubedata.ro/databases-postgresql","markdown_url":"https://docs.danubedata.ro/databases-postgresql.md","json_url":"https://docs.danubedata.ro/databases-postgresql.json"},"index_url":"https://docs.danubedata.ro/index.json"}