Connecting to an intermediate database from a local environment - Laravel 5

purpose

Locally on my Mac OS , I am trying to connect to my staging database that are running and hosted on my Ubuntu virtual machine.


Actions

In my config/database.php

 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST'), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), 'unix_socket' => env('UNIX_SOCKET'), <---- Need it here 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ] ], 

In my .env I have

 DB_HOST=45.55.88.88 DB_DATABASE=staging DB_USERNAME=john DB_PASSWORD=*** UNIX_SOCKET=/var/run/mysqld/mysqld.sock <---- I'm not sure what to put here 

I'm not sure what to do with my UNIX_SOCKET, since database.php needs it.

I kept getting

 SQLSTATE[HY000] [2002] No such file or directory 

I believe my path to UNIX_SOCKET is wrong.


Questions

How could one do something like this?

How would I do this and debug it further?


I open any offers at this moment.

Any tips / suggestions / help on this would be greatly appreciated!


Update

Base on @dparoli . I am updating my database configuration without using UNIX_SOCKET .

 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST'), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), 'port' => env('DB_PORT', '3306'), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ] ], 

now i got

PDOException in line Connector.php 49: SQLSTATE [HY000] [2002] Operation timeout


I tried looking more at the settings of my staging VM

sshd_config

Will /etc/ssh/sshd_config play any role in this at all? Is it because I disabled login and allow only public key login?

I tried both

PasswordAuthentication no

and

PasswordAuthentication yes


Netstat

I ran netstat -ln , I got

 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:17123 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:11300 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN ... 

I saw 0 0.0.0.0 opin306 .


php.ini

 max_execution_time = 60 and memory_limit = 1000M 

/etc/mysql/my.cnf

 # - "~/.my.cnf" to set user-specific options. # # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # This will be passed to all mysql clients # It has been reported that passwords should be enclosed with ticks/quotes # escpecially if they contain "#" chars... # Remember to edit /etc/mysql/debian.cnf when changing the socket location. [client] port = 3306 socket = /var/run/mysqld/mysqld.sock # Here is entries for some specific programs # The following values assume you have at least 32M ram # This was formally known as [safe_mysqld]. Both versions are currently parsed. [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] # # * Basic Settings # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = * # # * Fine Tuning # key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 # This replaces the startup script and checks MyISAM tables if needed # the first time they are touched myisam-recover = BACKUP #max_connections = 100 #table_cache = 64 #thread_concurrency = 10 # # * Query Cache Configuration # query_cache_limit = 1M query_cache_size = 16M # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. # As of 5.1 you can enable the log at runtime! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # # Error log - should be very few entries. # log_error = /var/log/mysql/error.log # # Here you can see queries with especially long duration #log_slow_queries = /var/log/mysql/mysql-slow.log #long_query_time = 2 #log-queries-not-using-indexes # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M #binlog_do_db = include_database_name #binlog_ignore_db = include_database_name # # * InnoDB # # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. # Read the manual for more InnoDB related options. There are many! # # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". # # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] #no-auto-rehash # faster start of mysql but no tab completition [isamchk] key_buffer = 16M # # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/ ____ 

Result

PDOException in line Connector.php 49: SQLSTATE [HY000] [2002] Operation timeout

How can I stop this?

What else can I check or try?

+8
mysql ubuntu laravel laravel-5 database-connection
source share
4 answers

You are trying to connect to another host through a unix socket, which is not possible, because sockets are usually visible only directly on the system on which they are created.

For your work with env to work, you need to comment out the unix_socket configuration unix_socket and add a port:

 'port' => env('DB_PORT', '3306'), 

And configure mysql to listen on this port.

+1
source share

This is apparently primarily a network problem between the host and the guest.

  • First, let the host talk to the guest (VM)
    • Logging into a virtual machine (assuming you use VirtualBox, other virtual machines will be similar)
    • Run ifconfig and write down the IP address. It will be something like 10.0.2.5
    • Go to the VM instance window → Menu → Network Adapters:
      • install adapter for NAT
      • Click "port forwarding" at the bottom
      • Create a new entry (click the + icon on the right)
      • Set Host IP = 127.0.0.1
      • For the guest IP address, enter the value you received earlier (10.0.2.5 - your IP address may vary)
      • In both cases, to use port 3306
    • Press the OK button twice, and you should exit the settings screens and do everything
  • Make sure you can connect to the MySQL instance through the command line in the virtual machine
    • Open a terminal window in VM
    • Run this command mysql -hlocalhost -ujohn -p
    • Enter the password when prompted and you can connect. If not, try the following
      • mysql -h127.0.0.1 -ujohn -p
      • If you still cannot connect, make sure you have the correct password.
    • Once you can connect locally, it's time to connect to Host (Mac)
  • Use the following command:
    • mysql -h127.0.0.1 -ujohn -p
    • Enter the password when prompted
  • If you still cannot connect, try disabling the firewall on guest / Ubuntu
+1
source share

What could you try if you have SSH access to the virtual machine (or any remote remote file), then you can try port forwarding through SSH :

 ssh foo@bar -L 3307:localhost:3306 

Now port 3307 on your local computer acts as port 3306 on the remote computer. In your configuration file you can go

 DB_HOST=localhost DB_PORT=3307 

The disadvantage of this approach is that you need to set up a terminal session and start it when you want to use the local environment.

+1
source share

The operation timeout is most likely caused by the firewall. You can fix this by running these commands on your virtual machine:

 sudo ufw allow out 3306/tcp sudo ufw allow in 3306/tcp 

If this does not work, check if there is any traffic arriving on port 3306 using this command:

 sudo tcpdump -i eth1 port 3306 

replace eth1 with the network interface, which you can find with this command:

 sudo ip link show 
+1
source share

All Articles