Tech AI Insights

How I Connect Live MySQL Database Locally in Laravel Using an SSH Tunnel

Connect live MYSQL database locally in Laravel —this was the only safe option when I recently faced a critical production issue on a live website.

The bug was real. Users were affected. Logs were not enough. And deploying experimental backend fixes directly to production felt reckless. Instead of pushing risky changes back and forth, I chose a safer and more controlled approach: I connected the live MySQL database to my local Laravel application and reproduced the issue locally.

In this article, I’ll walk you through exactly how I connected a live mysql database locally in Laravel, why this approach saved me from breaking production, and how you can do the same safely.


Why I Needed to Connect Live MYSQL Database Locally in Laravel

The issue only occurred in production. Locally, everything worked perfectly.

I had two risky options:

  • Deploy debugging code repeatedly to production
  • Guess the issue using logs alone

At that point, I realized that the only practical solution was to connect live mysql database locally in Laravel and debug the issue in a controlled environment.

So instead, I decided to connect the live database locally in Laravel, allowing me to:

  • Inspect real production data safely
  • Run queries locally
  • Debug logic without touching production code
  • Avoid unnecessary deployments

By choosing to connect live mysql database locally in Laravel, I could safely inspect real production data without risking live deployments.


Why You Should Never Expose a Live Database Publicly

Before explaining how to connect a live database locally in Laravel, let’s talk about what not to do.

Many developers temporarily make their database public and whitelist their IP. This is extremely risky.

Problems with Public Database Access

  • Brute-force attacks on MySQL ports
  • Accidental credential leaks
  • Compliance and audit violations
  • Permanent security holes

Using an SSH tunnel allowed me to connect live mysql database locally in Laravel while keeping the database completely private and secure.

The safer solution is to keep the database private and access it securely using an SSH tunnel.


Architecture: How the Connection Actually Works

When you connect a live database locally in Laravel using SSH, the architecture looks like this:

Local Laravel App
   ↓
127.0.0.1 (Localhost)
   ↓ SSH Tunnel
EC2 / Bastion Server
   ↓ Private VPC Network
Live MySQL RDS

Your Laravel app believes it’s connecting to a local database, but the traffic is securely forwarded to the live MySQL instance.


Prerequisites Before You Start

To connect a live database locally in Laravel, you need:

  • Laravel installed on your local machine
  • A live MySQL database (Amazon RDS or self-hosted)
  • An EC2 server or bastion host inside the same VPC
  • A .pem file for SSH authentication
  • SSH access enabled on the EC2 server
  • MySQL port 3306 allowed only from the EC2 security group

Step 1: Verify AWS Security Groups (Very Important)

EC2 Security Group

  • Allow SSH (port 22) from your IP address

RDS Security Group

  • Allow MySQL (port 3306) only from the EC2 security group

This ensures the live database is never exposed to the public internet.


Step 2: Create the SSH Tunnel (The Key Step)

Run the following command on your local machine:

ssh -i your-key.pem \
  -o ServerAliveInterval=60 \
  -o ExitOnForwardFailure=yes \
  -N -L 3307:your-rds-endpoint.amazonaws.com:3306 \
  ubuntu@EC2_PUBLIC_IP

What This Command Does

  • Uses your PEM file securely
  • Forwards local port 3307 to MySQL port 3306
  • Keeps the connection alive
  • Fails immediately if forwarding fails

If the command runs silently, the tunnel is active.

Image suggestion: Architecture diagram showing SSH tunnel
Alt text: connect live database locally in Laravel


Step 3: Configure Laravel to Use the Live Database Locally

Update your local .env file:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3307
DB_DATABASE=live_database_name
DB_USERNAME=live_db_user
DB_PASSWORD=live_db_password

Then clear cached config:

php artisan config:clear
php artisan cache:clear

Now your Laravel app is connected to the live database locally.


Step 4: Test the Connection Safely

Test Using Laravel Tinker

php artisan tinker
DB::select('select 1');

If no exception is thrown, the connection works.

Test Using MySQL Client

mysql -h 127.0.0.1 -P 3307 -u live_db_user -p live_database_name

Safety Rules I Followed While Using the Live Database

When you connect a live database locally in Laravel, discipline is critical.

My Personal Rules

  • Never run migrations
  • Never run seeders
  • Never truncate tables
  • Avoid UPDATE and DELETE queries
  • Prefer SELECT queries only

If possible, request a read-only database user.


Optional: Keep the Tunnel Stable with autossh

autossh -M 0 -i your-key.pem \
  -N -L 3307:your-rds-endpoint.amazonaws.com:3306 \
  ubuntu@EC2_PUBLIC_IP

This automatically reconnects if the tunnel drops.


Common Problems When Connecting a Live Database Locally in Laravel

Problem Solution
Connection refused SSH tunnel not running
Permission denied Wrong PEM or SSH user
Timeout RDS security group misconfigured
Laravel still failing Clear config cache

When You Should NOT Connect a Live Database Locally

  • Laravel already runs on EC2
  • You have VPN access to the VPC
  • AWS SSM Port Forwarding is available

In these cases, private networking is better.


Final Thoughts

Connecting a live mysql database locally in Laravel helped me debug a critical production issue without risking live deployments.

It gave me visibility, confidence, and safety — everything you need when production is on fire.

If you ever face a bug that only exists in production, this approach can save you hours of stress and prevent costly mistakes.


For more insightful tutorials, visit our Tech Blogs and explore the latest in Laravel, AI, and Vue.js development

Scroll to Top